1.写文件:
integer file = $fopen("asm.txt","a+");
$fdisplay(file,"%s\t%h",req.regid,req.addr);
$fclose(file);
常用模式包括:
“w"打开文件并从文件头开始写,如果不存在就创建文件。
“w+"打开文件并从文件头开始读写,如果不存在就创建文件
"a"打开文件并从文件末尾开始写,如果不存在就创建文件
“a+"打开文件并从文件末尾开始读写,如果不存在就创建文件
2.打印枚举型变量:
typedef enum { red, green, blue, yellow, white, black } Colors;
Colors Lcolors;
$display (" Lcolors = %s", Lcolors.name());
但是用UVM随机不能用如下31行所示的方式
31 // `uvm_do_with(pkt, {pkt.instid.name() == LD;})
用这种方式:
32 `uvm_do_with(pkt, {pkt.instid == LD;})
该枚举变量定义如下:
typedef enum {
LD,LDI,LDM,LDDW,LDDH,ST,STI,STM,SWP,LDS,STS, 18 ADD,SUB,MUL,SHF,MAC,INC, 19 NOP,BR,BRI,BRC,BRIC,STOP 20 } inst_id_e;
3.exists函数
The exists() function checks whether an element exists at the specified index within the given array. It
returns 1 if the element exists; otherwise, it returns 0.
4.$value$plusargs()的用法:
if($value$plusargs("BROADCAST=%d", broadcast))
`uvm_info("spi_cfg",$sformatf("updated: broadcast"),UVM_LOW);
该函数带有返回值,在仿真命令中可以指定BROADCAST的
$test$plusargs用于检测有没有在仿真命令中定义一个宏,同样有返回值。
5.fscanf:解析有规律的文件
6.只randomize一个变量
rnw是一个rand bit变量,不能直接调用rnw.randomize(),因为只有类才拥有randomize这个函数,因此这样做:
在该类的new中:assert(this.randomize(rnw) with {rnw inside {0,1}; } );
7.拿到队列的最后一个数,但是并不将其pop出来: a[a.size()-1]
8.子函数如果有缺省的参数,在该子函数被调用时依然要, ,给该参数留下位置。
9.rand real需要仿真器特殊的license
10.对于静态函数,不需要new()就可以使用,并且是使用双冒号调用。
11. verilog2001添加了generate循环,允许产生module的多个实例化。generate语法有generate for, genreate if和generate case三种。generate for语句必须有genvar关键字定义for的变量,for 的内容必须加begin和end,必须给for语段起个名字。
12. @(posedge varible); 如果varibal是多比特,那么这种写法只采最低一个比特。
13. cov.sample()可以同时在多个地方调用。
14. incisive仿真器,如果A是10'b0,B是16'b0,那么它会认为A和B不相等。
15.fork join里面的各个线程最好都用begin end包起来。
16.如果是判断一个interface信号是否为1或0,最好用===
17.所有的时间延迟都加上单位
18.模块级的平台最好不要用define
19.对于ref引用将数组传递到子程序就没有input和output的概念。
20. 延迟一个变量长的时间:#(temp*1us);
21. 判断几个数相等不能用这种方式:if(rdata16_0 == rdata16_1 == rdata16_2 == rdata16_3),得用这种方式:
if(rdata16_0==data_1 && rdata16_1==data_1 && rdata16_2==data_1 && rdata16_3==data_1)
22. 浮点类型的随机
offset_int=$urandom_range(20,0); 如果用 offset_real = real'(offset_int/1000); 先除的话括号里面一直是0,得先转换再除offset_real = (real'(offset_int))/1000;
23. $rtoi是将小数部分扔掉的取整
24.动态数组和关联数组的区别,动态数组中括号内是空的,关联数组中括号内是有类型的。
25.二维动态数组初始化:
只能先初始化第一维度的size,详细见SV标准2012版154页。两种合法情况:1.定义时subarray size固定,第一维度动态,第二行用new初始化第一维度 2.两个维度都动态,先初始化第一维度,再起一行初始化第二维度。 3.定义时第一维度固定,第二行初始化第二维度。
26. bind的用法
bind cortexm7_wrap axi_if_harness axi_m0
1)意思是将axi_if_harness这个module捆绑到cortexm7_wrap这个module下,例化名称为axi_m0
2)注意这两个module都是写的模块定义名字不是例化名字
3)如果dut里有多个cortexm7_wrap例化,其每个例化下面都会bind一个axi_m0
27.结构体组成联合体
typedef struct packed {
bit [ 0: 0] resv_cfg63 ;//63
bit [ 3: 0] dst_osr_lmt ;//62:59
bit [ 3: 0] src_osr_lmt ;//58:55
bit [ 1: 0] lock_ch_l ;//54:53
bit [ 0: 0] lock_ch ;//52
} dma_ch_cfg_s;
typedef union packed {
bit [319:0] channl_var;
struct packed {
dma_ch_cfg_s ch_cfg ;//319:256
dma_ch_ctrl_s ch_ctrl ;//255:192
dma_ch_block_s ch_block ;//191:128
bit [63: 0] ch_daddr ;//127: 64
bit [63: 0] ch_saddr ;// 63: 0
} dma_channel_s;
} dma_channel_u;
其中channl_var等于下面的320比特整体