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来实现。

systemverilog参考模型(SystemVerilog常用可综合子集)(1)

systemverilog参考模型(SystemVerilog常用可综合子集)(2)

在模块规模规模比较小时,可能体现不出logic类型的优势,但规模比较大时,会发现用logic 定义会带来巨大的方便,至少在定义变量时,你不需要考虑这个变量是reg型还是wire型。另外bit类型是二值数据类型的,包括0和1两个值,这数据类型也是可综合的。

3共享经济——package共享数据类型

在verilog中,不能在模块之间共享parameter,type,task,function,如果使用只能在模块内声明。在SV中,提供了packages用于不同module,interface共享数据。自定义的packages处在关键字package 和endpackage 之间,如下图所示:

systemverilog参考模型(SystemVerilog常用可综合子集)(3)

出于可综合考虑,在其中可定义的变量有:

上面package定义好了之后,各module怎么去使用它呢?一般有四种方式:

systemverilog参考模型(SystemVerilog常用可综合子集)(4)

4原形毕露——enum 让状态机在波形中显示状态

我们平时使用Verilog进行状态机编码时,通常使用parameter对状态名进行定义,这样写case语句的时候就不会对这一串10摸不着头脑。可是通常这样做的话,在Verdi里看到的还是一串10,使排错非常困难,当然可以Verdi相应的设置使Verdi能够提取显示状态。但在SV中使用enum定义可以很方便的定义状态机,Verdi打开波形自动显示各状态的名称。而且这种方式具有更精简的代码形式。定义方法如下:

systemverilog参考模型(SystemVerilog常用可综合子集)(5)

上述使用的是默认的编码方式,等效于如下:

systemverilog参考模型(SystemVerilog常用可综合子集)(6)

可以发现比起Verilog 定义parameter的方式,更简洁以及占用更少的代码空间。 一般推荐使用默认的编码方式就可以。

5所见即所得——always_comb/always_ff

SV对Verilog中always语句块进行了扩展,个人觉得这样能更准确的描述电路的行为,在平时RTL描述中常用主要是always_comb和always_ff语句块。

上述指定的逻辑块最大的好处是能保证RTL 仿真跟综合后仿真具有一致的行为,当然如果用Verilog的写法,按照规范来,其实问题应该也不是很大。

6加加减减——操作符 ,--

学过C语言的都知道 ,--之类的操作符,在SV中也支持了这个操作符,并且都是可综合的,支持的可综合操作符有: ,-- , =,-=,*=,|=,^=,&=,<<=,>>=等。

7循环往复——for循环

SV中允许在for循环语句中定义变量,特别方便,这个真的是大爱,用起来与C语言毫无差别的感觉,另外又支持了 ,--操作符,大家可以感受一下,下面的代码:

systemverilog参考模型(SystemVerilog常用可综合子集)(7)

个人感觉这种写法比起Verilog来说,真是太方便了。

8结语

上述只是描述了SV可综合子集个人觉得比较常用的部分,另外还有interface结构,unique case 等也是可综合的,由于SV标准中缺少了可综合子集的定义,往往让人忽略了其作为硬件描述语言的初衷,而且SV是完全兼容Verilog的,意味着你也可以在SV中一部分用Verilog去描述。综上,我们可以发现SV中的可综合子集相比Verilog具有更高效、更有效率、更少的代码描述电路行为的能力。对于相同的算法逻辑,更少的代码,更具抽象的描述行为其实往往带来更少的BUG,这样的结果是显而易见的。

● END ●

systemverilog参考模型(SystemVerilog常用可综合子集)(8)

喜欢就点亮“在看”吧

,