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

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

日志

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

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

D.  覆盖率增强

在SystemVerilog-2012标准中,引入了三个重要的增强性功能,为功能覆盖率服务。这些增强在SystemVerilog标准委员会的数据库中有相同的编号Mantis2506,但是在本文中,将其分为三点进行介绍。


1.        覆盖点变量(Mantis 2506)

在之前版本的SystemVerilog标准中,一个覆盖点coverpoint可以拥有一个可选的标签label。这个label仅仅是一个名字,它的用法十分有限。主要用在交叉覆盖率的定义和覆盖率报告中。例如:


在最新的SystemVerilog-2012标准中,将label定义变为一个变量名。对于这个变量的数据类型,我们能够直接指定,或者通过软件工具从代码中推断出其类型。通过使用label名称,可以用来描述更加复杂的coverpoint、coverpointbins以及crosscoverage。如果没有指定数据类型,那么这个coverpoint的语法同之前版本中的没有区别(这个语法是向后兼容的)。下面的代码是SystemVerilog-2012标准中的一个例子,它的语法与之前的版本有着很大的不同。这些不同只是针对于仿真软件工具,对用户来说是透明的。


2.        覆盖表达式bins…with()(Mantis 2506)

在最新的SystemVerilog-2012标准中,为coverpointbin和crossbin的定义添加了with()方法。使用bins…with()结构,可以排除掉bin中我们不关心的值。这个bin只会在with()中表达式为真的值出现时进行统计。bins…with()结构的语法与SystemVerilog中数组定位的方法with()的语法很类似。使用隐含的变量item用来表示候选值。这个变量可以作为表达式中的一部分,用来计算。如果表达式不成立,这个候选值就会被忽略,同时被排除在bin的计数值之外。


在下面的例子中,bin的定义包含了从0-255之间所有能被16整除的数值。

可以使用一个拥有bin的coverpoint的名字,在这个coverpoint中,替代所有可能的值的范围,如下面的例子中的b。


3.        在覆盖组中调用函数(Mantis 2506)

在一个大型设计中,定义的验证覆盖点以及其交叉覆盖会变得非常复杂。在之前版本的SystemVerilog代码中,需要使用大量复杂的代码实现。通常这些代码在定义多重覆盖点的时候会被重复使用。在SystemVerilog-2012标准中,增添了一项功能,允许在一个覆盖点或者交叉覆盖点中定义并且调用函数。这使得我们能够以可重用的方式,更高效的定义复杂的覆盖点或者交叉覆盖点。在覆盖率表达式中使用函数任然有许多的限制,这些限制不在本文的讨论范畴。


下面是一个从SystemVerilog-2012标准中改造而来的例子。变量a和b是32位的向量,所以a和b交叉覆盖点的数量非常巨大。这时可以使用bins…with()结构来限制bins的数量,但这仍会留下数量巨大的代码,使得很难被重用。在这个例子中,定义了一个函数,用来限制需要关注的数值的范围,从而减少的交叉覆盖的适量。在构造覆盖组的时候对取值范围进行约束,这能够使得该定义变得简洁、高效并且可重用。


E.  断言增强

在SystemVerilog-2012标准中,引入了10项新特性用来增强和提供新的断言功能。

1.        增加断言中的数据类型(Mantis 2328)

在之前版本的SystemVerilog标准中,不允许在断言中使用real的类型值(浮点类型),也不允许使用例如字符串和队列的动态数组。在SystemVerilog-2012标准中,取消了这些限制。在下面的例子中的断言里,引用了一个队列元素,在之前版本的语法中是无法实现的。


2.              断言中的静态类属性(Mantis 2353)

在之前版本的SystemVerilog标准中,不允许并发的断言访问一个类中的属性变量。在SystemVerilog-2012标准中,稍稍放宽了这一限制,允许并发断言访问类中的静态属性变量。


3.              增加采样值的数据类型(Mantis 3213)

SystemVerilog中的一个时刻被分割成一些时间片。使用$sampled、$past或者其他系统采样函数可以返回一个变量或是一个表达式在这个仿真时刻一开始的值。断言和其他一些SystemVerilog结构都在PerponedRegion时间片对当前仿真时刻的值进行采样。


在之前版本的SystemVerilog标准中,限制了$sampled采样的数据类型,也同样限制了对其他采样函数的引用。最明显的是real(浮点)类型和自动变量是不允许使用的。这个限制使得对于特定类型的数据,使用断言十分困难。例如在模拟/数字混合的信号模型中,需要用到的real类型值。在SystemVerilog-2012标准中,绝大部分的这些数据类型的限制被解除了。


在下面的例子中,采样函数$past引用了for循环中的控制变量i。在之前的版本中这是不允许的。


考虑到向后兼容性,SystemVerilog-2012标准中改变了检查器中自由变量的采样方式,这与之前版本的SystemVerilog并不兼容(检查器和自由变量的首次引入是在SystemVerilog-2009标准)。在之前的版本中,会返回一个错误的值,而在SystemVerilog-2012标准中,这个错误的定义被修正了。


4.              $global_clock方案的新规则(Mantis 3069)

SystemVerilog-2009标准在形式验证的断言结构中引入了全局时钟的概念。但它们只能是在整个设计中,唯一的全局时钟定义。在验证包含有多个时钟域的设计时,这个规则让验证变得十分困难。由于只有一个全局始终,$global_clock系统函数可以在设计的任何层次被调用。


SystemVerilog-2012标准修改了全局时钟的定义,允许设计在不同的层次模块中指定当前域的全局时钟。尽管在设计中的不同层次中,会存在多个全局时钟,但在某一个层次下,只允许使用单一的全局时钟。在定义了全局时钟的范围内,$global_clock系统函数即指的是该层次中的全局时钟。


SystemVerilog-2012标准并不是完全的兼容SystemVerilog-2009标准。SystemVerilog-2009标准中允许在没有顶层的模块中定义全局时钟,并且使用$global_clock在子层次之外的地方引用。这种方式在SystemVerilog-2012标准下会产生错误。


5.              序列的默认时钟(Mantis 2412)

在之前版本的Systemverilog标准中,对于命名的断言序列,一个属性只能拥有一个默认时钟。SV2009 checker中定义的sequence以及进程中调用的sequence不能使用默认时钟,这样限制了在checker中对于sequence的使用。


下面的例子,是从标准增强的解释中改变而来的。在之前版本的SystemVerilog中,由于sequence不能在checker中引入默认时钟,因此不能正常工作。



6.              序列方法和序列表达式(Mantis 3191)

在之前版本的Systemverilog标准中,在一个一个断言序列的实例中使用triggered和matched的序列方法。我们可以在一个序列表达式中,通过参数传递使用这些方法。这限制了那些有用的方法,使得难以编写高效、可重用的的代码。在Systemverilog-2012标准中,改进了triggered和matched序列方法,允许他们在序列实例和序列表达式中被使用

 

7.              结果延迟的立即断言(Mantis 3206)

在之前版本的Systemverilog标准中,可以像执行普通的采样函数一样,执行立即断言。但是,在仿真的某一时刻,当一个进程包含断言毛刺时,立即断言会被出发多次,导致断言报错。


在Systemverilog-2009标准中,引入了延迟的立即断言,以减小毛刺带来的威胁。虽然已经很大程度上减少了受到毛刺影响的可能性,但是为了让延迟断言的行为模块拥有同立即断言同样的灵活性,仍然可能会出现多次出发立即断言的不合理可能。


在Systemverilog-2012标准中,新引入了结果延迟断言结构。在一个仿真的时刻,结果立即断言会在Postponed时间片执行($strobe和$monitor也在同一时间片执行)。Postponed时间片严格约束了在一个行为模块中做什么。就其本质而言,信息会被打印输出,但是变量不会被复制。一个结果延迟立即断言没有延迟断言灵活,但是却可以完全避免毛刺的印象。结果断言通过以下关键字进行定义:assertfinal 、assumefinal和coverfinal。


在下面的例子中,断言A1是一个立即断言,它失败的风险很高。在一个时刻会被always_comb触发多次(由于信号毛刺的原因,会被进程多次读取)。断言A2是一个延迟立即断言,毛刺仍会发生,但是会产生较少的错误。断言A3是一个结果延迟断言,可以避免毛刺的影响,但是不能使err_cnt的值增加(即使包含一个begin…end模块也不行)。


8.              精细的断言控制(Mantis 3295)

之前版本的SystemmVerilog标准中,可以使用$assertkill、$assertoff和$assertion系统函数对断言进行控制。这些任务提供了中等颗粒度的的断言控制。在Systemverilog-2012标准中,增添了一个新的系统函数$assertcontrol,用来对断言进行精细控制。这个系统函数可以通过设置断言类型(并发、立即、或者延时立即),或者指令类型(assert、assume、cover、expect),对断言进行使能、关闭或者杀死等控制。这个任务还能够使能或关闭行为模块中的断言的执行和期望的状态。$assertcontrol完整的语法不在本文的讨论范围,在这里我们仅仅通过一个简单的例子介绍它的用法:


9.              Checker的输出参数(Mantis 2093)

在Systemverilog-2009标准中,增加了一个检查器结构。检查器作为验证环境中的一个模块,被用来封装序列、属性、断言和覆盖率。一个检查器可以实例化其他检查器,但是在Systemverilog-2009标准中,它只能拥有输入参数。这使得构建复杂检查器变得很困难。在Systemverilog-2012标准增强了checker的功能,允许它拥有输出参数。


10.          Checker中的新功能(Mantis 3033)

在Systemverilog-2009标准中,引入了检查器来封装断言和覆盖率的定义。因此,检查器是一个可重用的组件。检查器非常有用,但是由于受限于它能够封装的对象,它很难成为一个复杂的验证模块。在Systemverilog-2012标准中,通过加入一些新的结构,检查器的功能得到了显著的扩展。这些新的特性包含:

  • always_comb,always_latch和always_ff

  • 程序上的阻塞赋值

  • 检查器变量的连续赋值

  • 程序的条件和循环语句

  • 立即断言

  • Task任务

  • let声明


这些新功能,使得检查器的建模更高效,并且可重用。

在Systemverilog-2009标准中,检查器中允许always程序存在。但是always_comb,always_latch和always_ff这些不允许。在Systemverilog-2012标准中,正好相反,always程序是非法存在的。同时还修改了checker的参数、外部变量采样的语法规则。这些变化在不同的SystemVerilog版本下仿真,会产生不同的结果。


F.  VPI增强

在Systemverilog-2012标准中,为验证程序接口VPI(VerificationProcedural Interface)添加了四个主要特性,同时也依据勘误表进行了很多修正。这些增强具体为:

  • VPI支持软约束(Mantis 3884)

  • VPI可以访问类中的内置进程(Mantis 3193)

  • 其它(Mantis 3116,Mantis3188)

这些新特性的讨论不在本文范畴内。


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

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



点赞

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

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

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

GMT+8, 2024-3-29 02:04 , Processed in 0.017945 second(s), 11 queries , Gzip On, Redis On.

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