SystemVerilog应用笔记

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemVerilog是一种硬件描述语言(HDL),用于设计和验证数字电路。SystemVerilog具有丰富的特性,适用于各种设计和验证任务。以下是SystemVerilog入门笔记的一些重点内容。 首先,了解SystemVerilog的基本语法是很重要的。SystemVerilog继承了Verilog的语法,同时加入了一些额外的特性,如数据类型、类和接口等。熟悉这些语法规则对于编有效的代码至关重要。 其次,了解模块和端口的概念。SystemVerilog中的模块是最基本的构建单元,而端口则是模块与外部环境之间的接口。了解如何定义和使用模块和端口是编可重用代码的关键。 另外,掌握数据类型和运算符是必不可少的。SystemVerilog支持多种数据类型,如整数、浮点数、逻辑值等,同时也提供了丰富的运算符,如加法、减法、逻辑运算符等。这些知识对于设计和验证数字电路非常重要。 此外,了解时序控制和并发控制是必要的。SystemVerilog提供了多种时序控制和并发控制的语法和特性,如always块、initial块和fork/join语句等。掌握这些知识对于设计复杂的数字电路至关重要。 最后,了解Verilog验证中的一些基本概念也是很重要的。例如,了解如何使用assert语句进行断言检查、如何使用coverage语句进行覆盖率分析等。 总之,SystemVerilog入门需要掌握其基本语法、模块和端口、数据类型和运算符、时序控制和并发控制,以及一些基本的验证概念。这些知识是成为一名合格的SystemVerilog工程师所必备的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值