一、断言(SV Assertions)
1、定义
断言又被称为监视器或者检验器,在设计验证流程中被广泛使用,用于描述设计的属(property),可以完美地描述时序相关的状况,用于描述设计期望的行为,从而检验设计实际行为是否与设计意图相符,如果允许的设计属性不符合我们的期望,则断言失败;如果被禁止的设计属性发生,则断言失败。
用途:
(1)检查特定条件或事件序列的发生;
(2)提供功能覆盖(functional coverage),使用 cover 关键字 ;
2、分类
断言分为立即断言和并发断言,两者的主要区别在于断言析构时在同一个时间槽中处理的阶段不同
1、立即断言
立即断言检查当前仿真时间的条件,是非时序的,立即断言需要在过程块中定义的,测试表达式的计算跟Verilog HDL过程块中的行为一样,即一旦事件发生变化则表达式立刻被求值,其行为一般不依赖于具体的时钟,当断言判断表达式中的任何信号发生变化,该检查都会被立即执行,可以理解该断言为不需要耗费时间的断言。
语法
label: assert(expression) action_block;
- label:断言的的标签,便于编译器打印信息
- expression:断言的表达式,一般为布尔表达式
- action_block:执行块, pass_statement; else fail_statement;
- $fatal :a run-time fatal.
- $error :a run-time error,默认情况下,断言失败的严重程度是一个error.
- $warning :a run-time warning.
- $info : information.
示例1:
module test;
bit clk,a,b;
always #5 clk = ~clk; //clock generation
initial begin
a=1;
b=1;
#15 b=0;
#10 b=1;
a=0;
#20 a=1;
#2 b=0;
#5 b=1;
#20;
$finish;
end
//立即断言放在时序逻辑块中
always @(posedge clk) check1_a_and_b:assert(a&&b);
//立即断言放在组合逻辑块中
always_comb check2_a_and_b:assert(a&&b);
//assign c = assert(a&&b);//非法的,立即断言不能定义于连续赋值语句中
endmodule
打印结果:
test.check2_a_and_b: started at 15ps failed at 15ps
Offending '(a && b)'
test.check1_a_and_b: started at 15ps failed at 15ps
Offending '(a && b)'
test.check2_a_and_b: started at 25ps failed at 25ps
Offending '(a && b)'
test.check1_a_and_b: started at 25ps failed at 25ps
Offending '(a && b)'
test.check1_a_and_b: started at 35ps failed at 35ps
Offending '(a && b)'
test.check2_a_and_b: started at 47ps failed at 47ps
Offending '(a && b)'
文章来源:https://www.toymoban.com/news/detail-703485.html
说明:文章来源地址https://www.toymoban.com/news/detail-703485.html
- 上示代码没有写action_block,系统自动打印
- 在时序逻辑块中的立即断言,在每个时钟的上升沿都会去执行断言,但立即断言的采样与赋值并不是采的时钟上升沿前的a、b值,而是当前仿真时间的值,立即断言与时钟无关的,这与并行断言不同,主要原因在于立即断言的采样赋值时间与并行断言不同,这与SV的激励时序,
到了这里,关于(十二)SV的断言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!