systemverilog参考模型(SystemVerilog常用可综合子集)
1简介
SystemVerilog简称为SV语言,它建立在Verilog语言的基础上,是 IEEE 1364 Verilog-2001 标准的扩展增强,兼容Verilog 2001,它将硬件描述语言(HDL)与现代的高层级验证语言(HVL)结合了起来。System Verilog是Verilog语言的拓展和延伸,其中一些扩展用来描述电路行为,这部分是可综合的;另一部分用于testbench的编写以及更高层的系统建模,是不可综合的。在设计中现在比较常见的是用verilog的可综合子集进行电路描述,而SV只是用于UVM验证。由于SV标准中没有明显定义哪些子集是可综合的,而且由于现在综合工具支持的不同,往往让人忽略了SV中的可综合子集相比Verilog具有更高效、更有效率、更少的代码描述电路行为的能力。本文总结分享一些芯片设计中一些常用的SV语法结构,文中所描述的都是现在综合工具支持的。
2面壁者逻辑——logic 数据类型
也许大家开始学Verilog都遇到过wire、reg数据类型的困扰,哪些地方需要用reg,哪些地方需要用wire,在写test_bench时又要区分wire、reg类型。即使现在你对这个用法一清二楚了,写代码时也往往需要特别注意,这个用错了工具可能会给你报出来,但改来改去也是费心费力的,而且wire与reg 定义时让代码也不是特别整洁(因为wire、reg不一样长呀!!)。现在有SV,你可以发现在过去verilog中用reg型或是wire型的地方基本上都可以用logic型来代替,实际上logic是对reg数据类型的改进,使得它除了作为一个变量之外,还可以被连续赋值、门单元和模块所驱动,显然,logic是一个更合适的名字。logic类型是一种四值类型对变量,包括0、1、x、z,基本上在RTL设计时都可以用logic类型定义,除了在定义inout端口必须用wire类型外。
下面举个RAM modelling的例子来说明上述问题,我们分别用Verilog和SystemVerilog来实现。
在模块规模规模比较小时,可能体现不出logic类型的优势,但规模比较大时,会发现用logic 定义会带来巨大的方便,至少在定义变量时,你不需要考虑这个变量是reg型还是wire型。另外bit类型是二值数据类型的,包括0和1两个值,这数据类型也是可综合的。
3共享经济——package共享数据类型
在verilog中,不能在模块之间共享parameter,type,task,function,如果使用只能在模块内声明。在SV中,提供了packages用于不同module,interface共享数据。自定义的packages处在关键字package 和endpackage 之间,如下图所示:
出于可综合考虑,在其中可定义的变量有:
- parameter 参数定义,常用
- localparam参数定义,常用
- const 变量定义,不常用
- typedef 类型定义,常用
- 从其他package导入的变量,不常用
- automatic task ,不常用
- automatic function ,不常用
上面package定义好了之后,各module怎么去使用它呢?一般有四种方式:
- package:: item,如input [SHARE_DEF::WIDTH-1:0] sig;
- import单个变量方式,如import SHARE_DEF::WIDTH;
- import *方式,如import SHARE_DEF::*;
- $unit方式,$unit package是SV内置的package,该方式如下:(不常用)
4原形毕露——enum 让状态机在波形中显示状态
我们平时使用Verilog进行状态机编码时,通常使用parameter对状态名进行定义,这样写case语句的时候就不会对这一串10摸不着头脑。可是通常这样做的话,在Verdi里看到的还是一串10,使排错非常困难,当然可以Verdi相应的设置使Verdi能够提取显示状态。但在SV中使用enum定义可以很方便的定义状态机,Verdi打开波形自动显示各状态的名称。而且这种方式具有更精简的代码形式。定义方法如下:
上述使用的是默认的编码方式,等效于如下:
可以发现比起Verilog 定义parameter的方式,更简洁以及占用更少的代码空间。 一般推荐使用默认的编码方式就可以。
5所见即所得——always_comb/always_ff
SV对Verilog中always语句块进行了扩展,个人觉得这样能更准确的描述电路的行为,在平时RTL描述中常用主要是always_comb和always_ff语句块。
- always_comb:指示所描述的电路是组合逻辑块,感觉比always@(*) 写法更好用点。
- always_ff: 指示所描述的电路是时序逻辑。
上述指定的逻辑块最大的好处是能保证RTL 仿真跟综合后仿真具有一致的行为,当然如果用Verilog的写法,按照规范来,其实问题应该也不是很大。
6加加减减——操作符 ,--
学过C语言的都知道 ,--之类的操作符,在SV中也支持了这个操作符,并且都是可综合的,支持的可综合操作符有: ,-- , =,-=,*=,|=,^=,&=,<<=,>>=等。
7循环往复——for循环
SV中允许在for循环语句中定义变量,特别方便,这个真的是大爱,用起来与C语言毫无差别的感觉,另外又支持了 ,--操作符,大家可以感受一下,下面的代码:
个人感觉这种写法比起Verilog来说,真是太方便了。
8结语
上述只是描述了SV可综合子集个人觉得比较常用的部分,另外还有interface结构,unique case 等也是可综合的,由于SV标准中缺少了可综合子集的定义,往往让人忽略了其作为硬件描述语言的初衷,而且SV是完全兼容Verilog的,意味着你也可以在SV中一部分用Verilog去描述。综上,我们可以发现SV中的可综合子集相比Verilog具有更高效、更有效率、更少的代码描述电路行为的能力。对于相同的算法逻辑,更少的代码,更具抽象的描述行为其实往往带来更少的BUG,这样的结果是显而易见的。
● END ●
喜欢就点亮“在看”吧
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com