SV Assertion
当时钟与信号同时跳变时,立即断言采集的是跳变后的电平,并发断言采集的是跳变前的电平。
1.立即断言 Immediate Assertions
立即断言检查当前仿真时间的条件,相当于 if else , 需要放在过程块中。
语法:
labels: assert(expression) action_block;
其中:
action block 操作块在断言表达式的求值之后立即执行
操作块指定在断言成功或失败时采取什么操作
action_block: pass_statement; else fail_statement;
例子:
assert(expression) $display("expression evaluates to true"); else $fatal("expression evaluates to false");
断言失败else:
可以用$fatal $error $warning $info打印
例子:
always @(posedge clk) begin
check_a_and_b:assert (a&&b) $display("a&&b is true");
else $error("a&&b is false");
end
2.并发断言 Concurrent Assertions
并发断言检查跨越多个时钟周期的事件序列。
我们可以认为并发断言是一个连续运行的模块,为整个仿真过程检查信号,所以需要在并发断言内指定一个采样时钟。
并发断言仅在有时钟周期的情况下出现
测试表达式是基于所涉及变量的采样值在时钟边缘进行计算的
可以在过程块、module、interface和program块内定义并发断言
区别并发断言和立即断言的关键字是property
并发断言格式:
断言名:assert property (判断条件) actionblock;
例子:
check_a_and_b:assert property(@(posedge clk) (a&&b)) $display("a&&b is true"); else $error("a&&b is false");
层次结构:
由低到高为:boolean expressions 布尔表达式 sequence序列 property属性
Sequence序列:
特性:1.可带参数 2.在property中被调用 3.可定义局部变量 4.可定义时钟周期
格式:sequence name_of_sequence(参数);
……
endsequence
例子:sequence seq_a_and_b;
@(posedge clk) a&&b;
endsequence
// 在 断 言 的 property 中 调 用 sequence
check_a_and_b: assert property(seq_a_and_b);
check_a_and_b: assert property(seq_a_and_b) $display("a&&b is true");
else $error("a&&b is false");
带参数的sequence例子:
sequence seq1(signal1,signal2);
@(posedge clk) signal1&&signal2;
endsequence
// 在 断 言 的 property 中 调 用sequence
check_a_and_b:assert property(seq1(a,b));
check_a_and_b: assert property(seq1(a,b)) $display("a&&b is true");
else $error("a&&b is false");
带时序关系的sequence :
在SVA中时钟延时用符号"##"来表示,如"##2"表示延时两个时钟周期;
sequence seq2;
@(posedge clk) a ##2 b ;
endsequence
//在断言的property中调用sequence
check_a_and_b: assert property(seq2);
其实也可以这样写
sequence seq2;
a ##2 b ;
endsequence
//在断言的property中调用sequence
check_a_and_b: assert property(@(posedge clk) seq2);
sequence内可以调用其它sequence:
sequence seq1;
@(posedge clk) a&&b;
endsequence
sequence seq2;
seq1;
endsequence
Property 属性
property是比sequence更高一层的单元,也是构成断言最常用的模块,其中最重要的性质是可以在property中使用蕴 含操作符(|-> |=>);
property格式:
property name_of_property(参数列表);
测试表达式或复杂的sequence;
endproperty
SVA提供了关键字 assert 来检查属性,assert的基本语法是:
assertion_name: assert property(property_name)
else $display("SVA error");
property与sequence的异同
1.任何在sequence中的表达式都可以放到property中;
2.任何在property中的表达式也可以搬到sequence中,但是只有在property中才能使用蕴含操作符;
3.property中可以例化其他property和sequence,sequence中也可以调用其他的sequence,但是不能例化property;
4.property需要用cover /assert/assume 等关键字进行实例化,而sequence直接调用即可;

触发判断:$rose(a); $fell(a); $stable(); $changed();
周期延时:##n ##[m:n] ##[*] ##[+] a[*3]
多个事件行为关系:intersect(a, b) a within b a ##2 b a ##[1:3] b a ##[3:$] b c throughout (a ##2 b) @ (posedge clk) a |-> b @ (posedge clk) a |=>##2 b
@ (posedge clk) $past(a,2) == 1'b1 @ (posedge clk) a [*3] @ (posedge clk) a [*1:3] @ (posedge clk) a [->3]
总线的断言函数

浙公网安备 33010602011771号