路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

当我们谈论SystemVerilog-2012的时候在谈什么?(上)

已有 7472 次阅读| 2016-7-9 17:20 |个人分类:验证前沿资讯

摘要

随着IC硬件设计的规模和复杂度的不断提高,验证的工作量急剧增加,与此同时SystemVerilog也保持着同步的发展。当SystemVerilog-2009标准完成不久后,标准组织立即开始了下一代SystemVerilog标准的制定,寻求更高效的验证方式和模型,以应对设计复杂度的增长。几乎是有史以来最快的速度,仅仅用了3年时间,SystemVerilog-2012标准便进入了投票阶段。一些新的、强大的功能加入了新的标准,包括多重类继承、用户定义的net类型、断言增强等等。目前EDA公司的产品已经全面兼容了SystemVerilog-2012标准的语法。


这篇文章主要讨论SystemVerilog-2012标准新增的功能,重点关注这些新的特性在面对复杂设计时如何提高验证的效率。同时文章还将涉及新增功能(例如类的多重继承)对UVM的支持。

 

I. 介绍

SystemVerilog现已成为了主要的数字设计和验证的语言。起先,在2002年,它是作为Accellera的标准对Verilog-2001硬件描述语言进行了大量扩展,这些扩展大大增强了Verilog建模和验证的功能。在2005年,IEEE将这些扩展功能部分制定为1800-2005 SystemVerilog标准。而基本的Verilog语言仍是一个独立的标准IEEE 1364-2005。


到了2009年,IEEE批准了1800-2009 SystemVerilog标准。SystemVerilog-2009标准包含了Verilog HDL标准,这标志着Verilog作为一个独立标准的历史结束了。同时该标准也加入了一些新的功能。


SystemVerilog-2009标准并不是它发展的终点。随着设计规模和复杂度的迅速增长,设计和验证的语言的进化也需要同步跟上。时隔三年,SystemVerilog-2012标准中加入了很多新的功能,并且将最重要的TOP10列在了标准的目录上,例如设计建模、验证平台建模。


从SystemVerilog-2009标准发布以来,各大EDA工具厂商在实践中发现了一些模糊的定义以及印刷错误,这些都在SystemVerilog-2012标准得到了校正。

从2009到2012版的变化部分,在标准数据库中被命名为“Mantis”。Mantis一共列举了162项变化,分别如下:

  • 31项新增功能。

  • 60项功能的描述更新。

  • 71项诸如标点、字体的更正。

在本文中,我们将主要研究31项新增功能,看看这些功能是如何帮助我们书写更加简洁、高效的验证环境的。

 

II.   SystemVerilog-2012标准中的新功能


A.  面向对象增强

在SystemVerilog-2012标准中,对OOP的增强体现在三方面。其一,更加简洁的构造方法。其二,增加了避免竞争的程序代码。其三,类的多重继承。


1.              类型化的构造函数new()(Mantis 3001

SystemVerilog-2009标准中,要求构造的对象类型必须匹配构造方法new()的句柄类型。当构造完成后,一个子类的句柄可以传递给一个它的父类的句柄。而完成这个功能至少需要3行代码如下:


类型化的构造方法new(),在关键字new前增加了一个域操作符”::”,独立赋值的对象,指定构造对象的类型,这样可以将上述的三行代码简化成一行:


这个新功能属于简化增强,并没有增添新的函数,但是却能够减少代码量,增加代码的可读性。


2.              类属性的非阻塞赋值(Mantis 2112)

在之前的SystemVerilog版本中,不允许对类的属性进行非阻塞赋值,但是这一限制在SystemVerilog-2012中被取消了。


非阻塞赋值主要用于RTL设计当中,但在验证中它也十分有用。使用非阻塞赋值允许验证工程师利用SystemVerilog内置的事件调度机制,控制并发执行的程序。如何使用非阻塞赋值并不在本文的讨论范畴。这项增强特性可以有效的改善验证代码的质量,增强验证平台的功能。


3.              类的多重继承(Mantis 1356)

该特性是SystemVerilog-2012中引入的最重要的一项新增特性。虽然它的完整的语法描述和接口类中的机制不在本文的讨论范畴,但我们提供了一个关于多重继承在接口类中使用的例子如下:


本文将在第三部分(SectionIII),详细讨论使用多重继承,如何在UVM验证平台中提高验证效率。


B.  随机化约束增强

SystemVerilog-2012标准中,引入了两项关于随机化约束的改进,用于提供更灵活的随机化激励的产生。


1.        软约束Soft Constraints(Mantis 2987)

之前所有SystemVerilog标准版本中的约束,都被称之为HardConstraints。对于这些约束,在随机化过程中,必须满足其约束的范围,否则仿真环境就会报错。这对于复杂的验证环境而言,便会存在问题。例如,通常一个事务类(TransactionClass)拥有内置的、正确的约束条件,但是在验证中,往往需要修改约束,特意产生一些错误的激励,此时的约束会与内置的约束产生冲突,仿真环境报错。为此,工程师们需要编写额外的代码来规避这个问题,首先关闭内置的约束,然后注入新的约束,最后当测试结束再重新开启内置约束。


SystemVerilog-2012标准中引入了新的特性SoftConstraints。当一个约束同软约束发生冲突时,软约束会被忽略。这项特性使得编码更加的灵活。在类中,我们可以将内置的常用约束定义为软约束。当进行特殊的测试时,外部的约束可以覆盖内置的软约束。由此实现了功能,避免了冲突。


在这个例子中,约束randomizewith{}的范围同内置的约束产生了冲突。但是此时并不需要额外的代码去避免错误的产生。因为randomizewith{}的优先级更高,类中内置的约束dflt被覆盖了。


2.              独一性约束 Uniqueness Constraints(Mantis3028)

在之前所有的SystemVerilog标准版本中,让一个数组中的所有成员,或者一系列变量,产生不同的随机变量,使得任意两个成员都拥有不同的值,是一件比较困难的事情。对于一个小的数组或一组很少的变量,可以通过多重约束实现。但是对于规模很大的一组变量或数组,这几乎是不可实现的。

SystemVerilog-2012标准中引入了独一性约束Uniqueness Constraints,它可以有效的实现上面我们的需求,并且只需要简短的一行代码。


约束c1确保在随机化时,a、b、c的值各不相同。约束c2确保在随机化时,数组data_array中的每一个元素的值都不相同。


 

C.  通用的编程增强

在本文中,引入了10项关于增强通用编程的新特性。大多数特写可以帮助我们使用更简洁的代码,书写更高效的验证环境,验证复杂的设计。


1.        用户定义的net类型(Mantis 3398)

SystemVerilog允许程序员使用typedef自定义新的变量类型。用户定义的变量类型,是一种功能强大的建模结构,在设计和验证中都有广泛的使用。不幸的是,之前版本的SystemVerilog标准,并不允许用户定义net数据类型用来完成设计模块的互连。


SystemVerilog-2012标准中,增强了自定义的能力,允许用户使用关键字nettype自定义net类型。与变量variable不同的是,nets类型需要赋值和用以解决多重驱动的函数。新的nettype声明可以同时进行赋值和解决多驱动函数的定义。

对于SystemVerilog内置的net类型,例如wire,是一个四值(4-state)逻辑。用户定义的nets大大扩展了这一限制,允许一个net类型包含如下:

  • 四值整形(向量)类型,包含压缩数组packed array、压缩结构体packedstructure、压缩联合体packedunions。

  • 二值整形类型,包含bit、byte、int等等。

  • real和shortreal类型。

  • 定长非压缩数组、非压缩结构体、非压缩联合体(用户自定义net类型,其元素必须为有效的数据类型)

用户自定义net类型的完整语法规则不在本文的讨论范畴内。在SystemVerilog-2012标准中有一个简单的例子解释了该概念:


这里的nettype声明并定义了一个net,它的数据类型是T(拥有一个real和一个二值逻辑),使用Tsum函数解决多重驱动。


让nets拥有real(浮点指针)值是一个很重要的新特性。它使得建模更精确,同时满足了混合信号(模拟和数组)设计的仿真需求。替代了之前使用的复杂、难于维护、速度慢的co-simulation环境。使用SystemVerilog语言,能够简化验证环境减少代码量,同时在仿真性能上提高验证效率。


2.              缺省类型的网表连接(Mantis 3724)

SystemVerilog中的module、interface和program实例的端口类型和尺寸可以被参数化定义。在编译阶段,通过配置方法和条件编译,可以选择不同的模型。这些功能对于提高设计和验证的灵活性起到了很大的左右,但是同时需要大量的各种各样的数据类型,满足网表中设计模块之间的互连。在之前的版本中,这一点是很难做到的。


在SystemVerilog-2012标准中,增加了一种新的缺省类型的net,被称为一种interconnect net类型,它能够更加简便和高效的,使用不同类型的nets生成统一化网表。Interconnect nets可以将网表的连接和类型分开,这使得连接可以通用,而类型则由实际组件的接口类型来决定。缺省类型interconnect nets的语法很简单,使用关键字interconnect与一般指定的net类型进行区分。


需要注意的是,interconnect nets只能被用来连接另一个端口是net类型或者interconnect net类型。不能用来链接到另一个使用变量类型作为端口的另一端。


3.              参数化的任务和函数(Mantis 696)

SystemVerilog(原生自VerilogHDL的部分)中,定义参数化的模块,一种流行的、高效的代码风格。参数化模块作为一个独立的版本,在每一次使用的时候可以被重新配置。SystemVerilog中的类,同样可以参数化定义,并且在实例化的时候进行重定制。


在之前SystemVerilog版本中有一个限制,即任务task、函数function和类的方法classmethods不能进行参数化定义。例如,一个总线的位宽可以被定义为16bits、32bits甚至是64bits,但是对于每一种的位宽,需要不同的任务task来对应,这样会产生冗余的代码,低效并容易引入错误。


SystemVerilog中的任务和函数引入参数化定义,已经变成了一个长期的诉求。但不幸的是,定义模块和类参数的语法同调用任务和函数的并不兼容。所以,SystemVerilog委员会将此项增强的请求一直搁置起来。


到了SystemVerilog-2012标准制定的时候,终于将这项期盼已久的增强加入了进来。这里采用的一种简单又新奇的方法解决了参数冲定义的语法不兼容问题,使用了参数化类中的静态方法。一个类中的参数,在每次使用的时候可以被重复定义,并且在使用类的域名时,类中的静态方法可以在任意地方被调用执行,这样类中的参数就可以被重定义了。


下面是从SystemVerilog-2012标准中改编的一个例子:



在这个例子中,函数ENCODER_f和DECODER_f作为函数的模板,通过传参可以为任意位宽的数据服务。通过重定义类的参数DECODE_W,每次调用的时候都可以指定返回数据的大小和输入参数的大小。


从严格意义上来说,参数化的task和function并不是一个新的特性,而是对于之前针对之前SystemVerilog版本的一次修正。没有新的语法和语义规则的引入,有的只是使用参数化的类,在每一次调用task和function的时候定制。


4.              参数化的用户自定义类型(Mantis 1504)

SystemVerilog中的用户自定义类型在验证中是一个很强大,并且广泛使用的特性。但是仍然有一个限制,利用关键字typedef定义适用于所有它的实例化对象,在每一次使用用户自定义类型的时候不能进行再定制。


在SystemVerilog-2012标准中,允许用户自定义参数化的类型,这样在每次实例化的时候就可以通过参数再定制。同参数化的task和function类似,完成参数化的用户自定义也需要借助参数化的类来实现。例如:

在这个例子中,将类P定义为virtual虚类型,代表这个类自身不能被构造,但是在这个类中的静态定义,例如typedef,则可以通过使用类的域名,在任何地方被引用。


参数化的用户自定义类型是一项新的特性,而不仅仅是之前版本的一项澄清说明。没有新的语法和语义规则的引入,有的只是使用参数化的类,在每一次实例化参数化的用户自定义类型时进行定制。


5.              let结构中的显式缺省类型参数(Mantis 2835)

SystemVerilog中允许在let结构定义宏Macro,这些宏可以被用在任何程序代码中,并且在使用的时候,这些macro体可以根据需要进行扩展。let结构同文本替代编译指令`define很相似,但是却没有像`define一样具有条件编译的危险。


let结构最初是在SystemVerilog-2009标准中被引入的,它的语法允许显式的定义形参的数据类型,或者隐性的继承一个实参的类型。SystemVerilog-2009标准允许显式的类型参数和缺省类型的参数混合定义,但需要首先定义缺省类型的参数,不允许显式类型的参数定义跟随在缺省类型的参数之后。


到了SystemVerilog-2012标准中,允许在let结构中,显式类和缺省类的参数以各种顺序混合存在。这时需要使用关键字untyped明确定义缺省类型参数。let结构的语法同断言属性assertion properties的定义相同


6.              $countbits系统函数(Mantis 2476)

在之前版本的SystemVerilog标准中,提供了许多便利的系统函数,他们会返回一些向量值的信息。例如$countones,$onehot,$onehot0和$isunknown。

在SystemVerilog-2012标准中,新添加了一个系统函数$countbits。这个函数将返回向量的位宽。使用这个新的系统函数,可以更加简洁高效的书写出,检查某个向量的位宽的验证代码。没有$countbits的帮助,我们需要使用一个循环来实现这个功能。


这项增强针对先前标准版本中的bit-value系统函数的予以规则进行了许多修正。



7.              动态数组的ref参数(Mantis 2929)

SystemVerilog语言允许模块端口和task/function的形参指向一个引用类型的实参,通常这个参考类型是一个指针。相对于inpuit、output或者inout,一个引用端口或者形参被声明为ref。


在之前版本的SystemVerilog标准中,ref类型的端口或者参数可以引用一个静态数组,但是不能够引用动态数组。在SystemVerilog-2012标准中增加了这项功能。


这个例子在之前版本的SystemVerilog标准中是非法的。解决办法是在task中定义数组名称,但是无论是在同一个项目或是不同的项目,task中的存在数组的名称,都将使得task难以复用。


8.              在for循环变量中使用var type()(Mantis 2901)

SystemVerilog为原先的Verilog语言添加了在for循环的迭代中,声明for循环的功能。在之前版本的SystemVerilog中,该迭代的数据类型的定义比较繁杂,例如:


SystemVerilog-2012标准中,提供了更加灵活的方式,允许for循环中的迭代器的数据类型在编译阶段就被计算出来,这一功能使用var type()声明实现。语法var type()已经是SystemVerilog标准的一部分了,但是之前的版本不允许它在for循环的声明中使用。例如:


在这个例子中,假设SIZE没有被重定义,变量i将会被声明为logic[127:0]类型。如果SIZE被冲定义了,变量i则会相应的变化。


9.              `begin_keywords 1800-2012(Mantis 3750)

相对之前的每一版SystemVerilog标准中,SystemVerilog-2012标准为新的语言功能保留了一些新的关键字:implements,interconnect,nettype,soft。


SystemVerilog提供了一个编译指令,用来将SystemVerilog的版本通知软件编译工具。这个指令只会影响到这些被保留的关键字。这并不是一个会影响到语法和语义的向后兼容的指令。包括两个针对之前版本的SystemVerilog指令,它们依次如下:


您可以在手机移动端同步关注订阅号“路科验证”。

如需转载请联系路科验证,并注明出处“路科验证”。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 06:17 , Processed in 0.016056 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部