SystemVerilog(五):断言(SVA, SystemVerilog Assertion)

绿皮书这本书对知识的梳理比较琐碎凌乱,不能帮新手快速的建立知识结构。先梳理好结构和要点,再填补细节是理想的叙述方式。

1、断言属于一种验证方法,判断预期逻辑(对设计属性的描述)是否发生,通过内建函数来测试特定的时序关系和自动收集覆盖率数据。

2、立即断言:事件变化敏感,像过程块一条语句,与时序无关,必须放在过程块中。检查TB和DUT的信号值,跟if(a!=b)不同的是,希望表达式为真(==)。

<断言名>:assert (测试逻辑);

a1:assert (bus.cb.garant==2'b01)
else $error ("Grant not assert");

3、并发断言:时钟边缘敏感,周期性对仿真过程检查信号的采样值。以关键词“property”来定义。

property <属性名>;

测试逻辑;

endproperty

<断言名>:assert property(属性名);

//检测仲裁器request信号的断言,request信号除了在复位期间,其他时候不能是x或者z。
interface arb_if(input bit clk);
    logic [1:0] grant,request;
    logic ret;

    property request_2state;
        @(posedge clk) disable iff (rst); //同步复位语法,rst为1,则不进行判断
        $isunknown(requset)==0; //确保没有x或者z
    endproperty
    assert_request_2state:assert property(request_2state);
endinterface

4、SVA的基本构成:布尔表达式将设计中的信号组合起来,组成序列。然后序列逻辑或者有序的组合起来得到属性。最后通过管检测assert,cover和assume指示属性的具体作用。

5、序列:序列经常由有序的行为构建。序列提供了一种能力来构建和处理有序的行为。比如一个线性序列,是布尔表达式的一个有限列表。如果每个布尔表达式在对应的时钟标识被计算为真,那么这个线性序列在一个连续时钟标记的有限间隔上匹配。

布尔表达式-真-时间序列匹配

6、常用语句及系统函数:访问当前的采样值、访问过去的采样值、或者检测一个表达式采样值的变化。

disable iff(); 变量或表达式为真则不进行判断。

$sampled()

$isknown(requset) 检查表达时任何位是否为x或z。

$rose() 检测上升沿

|-> 如果先行算子匹配在同一个时钟周期,检测后续算子。

@(posedge sclk)   $rose(a) |->[2:4] $rose(b);

参考链接:https://wenku.baidu.com/view/8134076e763231126fdb1165.html  system_verilog_assertion

参考文献:systemverilog中的断言assertions---sva

7、由于断言是一条有时必须为真的语句,所以断言的失败应该具有一个与其相关联的严重程度。缺省情况下,一个断言失败的严重程度是error。其它的严重程度可以通过在失败语句中包含下列严重性系统任务重的一个来指定:

$fatal 运行时的致命错误

$error 运行时的错误

$warning 运行时的警告,可以用工具专用的方式取消

$info 不带有严重程度的断言失败

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章