概要
Assertion是用来与设计功能和时序作比较的属性描述。比如grant信号应该在request信号拉高后的第二个周期拉起,但是却在第三个周期才拉起,这就是时序的违例,不符合协议。
- assertion可以用来完成:检查设计的内容;提高设计的可视度和调试能力;检查设计特性在验证中是否被覆盖。
- 可读性好,因此也可以用来服务于设计文档;
- 用来检查算法模型的断言在形式验证中可以穷尽计算,找出可能的违例;
- 可以自由地打开或者关闭
- 一小部分子集甚至可以用来综合或者移植到emulation中,用来完成跨平台的移植。
在verilog中不支持断言,断言语言通过不断地进化,发张成独立的语言分支——SVA
断言的类型:
1.立即断言
- 非时序的
- 执行时如同过程语句
- 可以在过程快或者函数与方法中调用
2.并行断言
- 时序性的
- 关键词property用来区分立即断言和并行断言
- 之所以称为并行,是指他们与设计模块一同并行执行。
立即断言
立即断言可以结合$fata、$error、$warning、$info给出不同严重级别的消息提示。
[name:] assert(expression)[pass_statement][else fail_statement]
always@(posedge clk)begin
if(state == REQ)
assert(req1||req2)//立即断言
else begin
t = $time;
#5$error("assert failed at time %0t",t);
end
end
assert (y==0) else flag=1;
并行断言
并行断言只会在时钟的边沿激活,变量的值是采样到的值。并行断言可以在过程块、module、interface 和program中定义。
base_rule1:assert property(cont_prop(rst,in1,in2)) pass_state else fail_state;
//Rquest-Grant协议描述:request拉高,在2个周期后,grant 拉高,在一个周期后property拉低,在一个周期后,grant拉低。
property req_grant_prop
@(posedge clk)
req
##2 grant
##1 !req
## !grant
endproperty
assert property req_grant_prop else $error("Req-Gnt Protocol violation");
断言中的property
-
结合sequence序列对时序和逻辑的描述,property可以用来描述设计的确切行为。
-
property可以在验证中用来做assumption、checker或者coverage
- 当时用assert关键词时,可以用作checker来检查设计是否遵循property的描述
- 当时用assume做关键词时,可以作为环境的假设条件,对于仿真环境和形式验证均起到对激励进行假设的作用
- 当时用cover关键词时,可以将property是否通过 作为断言覆盖率来衡量
-
property可以在module、interface、clocking块或者package中声明。
-
property也可以同sequence一样具备形式参数
-
共有七种property:
分类 用途 sequence 只有满足sequence条件,property才可以通过 negation 不期望出现这个negation条件,property通过;可以用NOT关键词 disjunction 至少要有一个满足,property通过;可以用OR关键词 conjunction 例如exp1 and exp2,只有两个exp都满足时,property通过;可以用AND关键词 if…else 条件选择 implication 蕴含,同sequence中用法一致 instantiation 命名一个property后,可以在另外一个property中使用
断言中的sequence
- 用来表示在一个或者多个时钟周期内的时序描述。
- 是property的基本构成模块,并经过组合来描述复杂的功能属性。
suqence 用来提供下列的场景描述:
- 第一个时钟周期,第一个表达式成立
- 接下来若干个时钟周期后,第二个表达式成立
- 类推,在接下来若干时钟周期,后续的表示式也成立。
sequence可以在module、interface、program、clocking块和package中声明,但不能在类里面声明。
sequence可以提供形式参数,用来提高复用性:
如下代码:
sequence s20_1(data,en);//data 和 en是形式参数
(!frame && (data == data_bus) ##1 (c_be[0:3] == en))
endsequence
后续精彩:
- sequence作为基本的组成部分,那么sequence如何使用?如何在其中使用各个操作符和系统函数,请看断言中的基本操作符与系统函数的使用;
- 断言中property又该如何使用?断言如何与设计绑定?请看property的使用及断言绑定
- 断言的覆盖率又该如何收集?请看断言检查和断言覆盖率