sv的LSB 使用
https://blog.csdn.net/gsjthxy/article/details/90722378
等价关系
[LSB+:STEP] = [LSB+STEP:LSB]
伪代码:
bit [1023:0] mem;
bit [7:0] data;
j = 0..100
mem[j*8 +: 8] = data;
// [7:0],[15:8], [23:16]
SV的protect类型
https://blog.csdn.net/qq_37573794/article/details/117530044
local — 限制只在本class中使用,子类以及外部类中不可调用
protected — 限制只在本class以及子类中使用,外部类不可调用
RAL模型的lock原因
https://blog.csdn.net/liuwei848/article/details/103576767
必须在root block中调用lock_model,这样整个模型才算建立完整,因为在建立模型的时候所有寄存器的地址均是相对地址,在进行前门访问,是以绝对地址进行的,因此lock_model帮助我们得到所有寄存器的绝对地址。
如下源码相关:
function void uvm_reg_block::Xinit_address_mapsX();
foreach (maps[map_]) begin
uvm_reg_map map = map_;
map.Xinit_address_mapX();
end
//map.Xverify_map_configX();
endfunction
C语言结构体中的冒号用法
https://blog.csdn.net/yihongxiaoxiang/article/details/50327587
struct bit_struct{
int bit1:3;
int bit2:5;
int bit3:7;
}data;
结构体成员变量后面的冒号表示位域,表示存储空间不需要完整的字节,只需要几个bit。
#include <stdio.h>
#define SYS_OK 0
#define SYS_FAILED 1
typedef int SYS_TYPE;
SYS_TYPE main()
{
struct bit_st
{
int a:3;
int :0;
int b:2;
int c:5;
int d:2;
int :2;
int e:3;
}data, *pData;
data.a = 1;
data.b = 2;
data.c = 3;
data.d = 2;
data.e = 4;
printf("a = %d, b = %d, c = %d, d = %d, e = %d\r\n",
data.a, data.b, data.c, data.d, data.e);
pData = &data;
pData->a = 3;
pData->b &= 1;
pData->c |= 5;
pData->d ^= 1;
pData->e = 5;
printf("a = %d, b = %d, c = %d, d = %d, e = %d\r\n",
pData->a, pData->b, pData->c, pData->d, pData->e);
printf("sizeof data:%ld\n", sizeof(data));
return SYS_OK;
}
int占32位,第二个成员 int :0是后面的3~31全为0。整个结构体占8个字节,也就是两个int型变量,而int :2; 是占用两个空的位置,两个bit。输出值是8。
struct bit_st
{
int a:3;
int :0;
long int b:2;
long int c:5;
long int d:2;
long int:30;
long int e:3;
}data, *pData;
以上的sizeof大小是16。
uvm版本在退出机制的区别
//uvm1.1
component里直接调用
set_report_max_quit_count(8);
// uvm1.2
uvm_report_server server = uvm_report_server::set_server()
server.set_max_quit_count(8);
sv的random的seed生效问题
http://ee.mweda.com/ask/342266.html
1、随机系统函数包括$random(seed), $urandom(seed), $urandom_range(min,max),
$srandom(seed),其中$random(seed)是verilog2001的语法,后面3个是sv的语法。
2、$random与$urandom除了有无符号的区别还有其他不同。sv语法中有提到线程稳定性的区别。
3、$random如果不带种子会使用系统缺省的种子产生随机数,这可能是每次不变的原因,
你带上种子参数试试看是是否改变。
4、$urandom不带种子也可以随机,我猜测可能是因为verilog与sv对其处理机制不一样,
且也不能排除不同编译仿真器对其理解的不同而导致的。
● testbench的 +ntb_random_seed 变量相关。这个option的值相当于所有random var的种子,
控制了$urandom的随机。
● $random必须通过$random(seed)的方式指定seed,seed不同则得到的随机数不同。
使用simv+ntb_random_seed_automatic没有效果。
● $urandom可以通过$urandom(seed)的方式指定seed,此时:
simv+ntb_random_seed_automatic不起作用。
● $urandom也可以不指定seed,通过simv+ntb_random_seed_automatic得到随机的seed值,
此时也可以得到随机数。
● 没有+ntb_random_seed_automatic选项,则默认seed为1,$urandom也拿到相同的值
verdi的reserve的debug
reverse的debug似乎是不能将波形也reverse掉。
reserve需要额外的编译选项,然后在打开verdi后,tools/perxxx,勾上reverse的开关。
https://zhuanlan.zhihu.com/p/401940992
deubg_access+reverse
vcs禁用打印屏幕输出
仿真时候的选项,加上以后log就只打印在-l指定的文件中。但是该选项使用后,仿真使用的-gui/-verdi调试功能将会受限,认为vcs版本小于2012
+vcs+nostdout
清空seqr中的seq
当seq.start()已经调用,但是被kill掉,seqr需要清空。
https://blog.csdn.net/lbt_dvshare/article/details/80594234
seqr.stop_sequences();
sv使用process开启进程和结束
initial begin
process proc
fork
begin
proc = process::self();
xxxx_run();
end
join_none
#5;
proc.kill();
end
标签:seq,process,random,sv,pData,int,seed,data
From: https://www.cnblogs.com/bai2022/p/17744409.html