本文分享一些SystemVerilog的coding guideline。
1、Use a descriptive typedef for variables
在数字电路中,万物皆为二进制,甚至在Systemverilog的演进过程中连wire和reg都不做区分,统一成logic。有利也有弊,因为在统一的过程其实也丢失了一些信息。也许可以在注释中进行增补描述,但总是不够直接,而且变量声明出错的话,也无法进行检查。
有以下两种情况容易出现编码错误:
1、例如地址变量,地址的位宽变化时可能需要大面积的修改(或者用宏代替)
2、相同位宽的信号,可能意义完全不同。例如,logic [4:0] cnt,fsm;
对此,引入自定义类型语法typedef。
基本格式为:
typedef 已有类型 新类型;
一般自定义类型后面添加一个_t,方便区分。
typedeflogic[31:0]word_t;//32位data typedeflogic[15:0]addr_t;//16位addr
2、Use an end label for methods, classes and packages
task local_task(); $display("Insidetask"); endtask:local_task
在systemverilog中应该在方法的声明开始和结束加上label,方便代码review时清晰地看出来task声明的语句块范围。
3、Use `includes to compile classes into packages
4、Define classes within packages
5、Only `include a file in one package
6、Import packages to reference their contents
7、Avoid `including the same class in multiple locations
在systemverilog验证环境中如果使用到一些公共组件,建议采用下面这个形式,即package+`include,将同一个组件内的多个class都编译进一个package。
避免在多个地方去include 一个class的定义,不然很容易导致类型重复定义的问题。
package A; `include "A_driver.sv"; `include "A_monitor.sv"; ... endpackage : A importA::A_driver; A_drivera_driver;
8、Define one class per file
显而易见,一个文件只定义一个class会更加清晰。例如我们经常定位uvm源码问题时很难通过vcs.log里面的编译文件名称直接找到相应的class定义位置。
9、Check that $cast() calls complete successfully
当我们使用类的多态特性时,需要始终使用$cast()。判断返回值,以确定是否确实是其子类。类似:
if(!$cast(color,c)) $display("cast failedforc=%0d",c);
10、Check that randomize() calls complete succesfully。
在使用class的randomize()方式随机变量时,建议始终检查随机的结果。不然就只能依赖仿真工具报Warning。
if(p.randomize() == 0); $display("Randomize fail!!!!");
11、Use if rather than assert to check the status of method calls。
在判断方法执行结果时,建议使用if-else,而不是使用assert。一般对于assert fail时,工具只是上报warning,而不是error。
12、Wrap covergroups in class objects
在class里面构造功能覆盖率,因为如果直接抽取RTL信号的话,那么后仿真时这个信号可能就会丢失了。而且功能覆盖率的构造会被设计的RTL信号牵引。
13、Only samplecovergroups using the sample() method
对于cover group的采样要非常精细地控制采样时刻,不然会覆盖很多非关键时刻点的数据值,也会误导覆盖率分析。
14、Label covergroup coverpoints and crosses
和前面的class加上label一样,coverpoint也要手动加上label,方便verdi打开vdb文件时清晰地看出未覆盖的场景。
classtest; logic[3:0]port_a; covergroup demo_cg with function sample(bit[3:0] i); label:coverpoint i; endgroup ... port_a=1; demo_cg.sample(port_a); endclass
15、Don't rely on static initialization order
SV或者UVM中某些代码执行时刻是同一个step,但是执行顺序仍然是确定性的。但是建议尽量不要依赖这样工具行为。
审核编辑:刘清
-
二进制
+关注
关注
2文章
795浏览量
41643 -
Verilog
+关注
关注
28文章
1351浏览量
110074 -
数字电路
+关注
关注
193文章
1605浏览量
80578 -
UVM
+关注
关注
0文章
182浏览量
19167
原文标题:SystemVerilog的coding guideline
文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论