SystemVerilog应用笔记

阅读: 评论:0

SystemVerilog应用笔记

SystemVerilog应用笔记

1.写文件:

  integer file = $fopen(&#","a+");

  $fdisplay(file,"%st%h",id,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;

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比特整体

本文发布于:2024-02-02 04:02:11,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170681789641227.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:笔记   SystemVerilog
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23