1.什么是Assertion
断言
:用来与设计功能和时序做比较的属性描述
- 断言可以用来完成:检查设计的内容、提高设计的可视度和调试能力、检查设计特性在验证中是否被覆盖
- 可读性好,因此也可以用来服务于设计文档
- 用来检查算法模型的断言在形式验证中可以穷举计算,找出可能的违例
- 可以自由地打开或者关闭
- 一小部分子集甚至可以用来综合或者移植到emulation中,用来完成跨平台的移植
2.断言的类型划分
断言可以分为立即断言和并行断言这两种常见的类型
立即断言(immediate assertion): 非时序、执行时如同过程语句、可以在initial/always过程块或者task/function中使用
立即断言可以结合 $fata、$error、$warning、$info
给出不同严重级别的消息提示
[name:] assert(expression) [pass_statement][else fail_statement]
//如果状态为REQ,但是req1或者req2均不为1时,断言将失败
always @ (posedge clk) begin
if(state == REQ)
assert(req1||req2) //立即断言
else begin
t = $time;
#5$error("assert failed at time %0t", t);
end
end
always @ (state)
assert (state == $onehot) else $fatal;
并行断言(concurrent assertion): 时序性的、关键词property用来区分立即断言和并行断言,与设计模块一同并行执行
并行断言只会在时钟边沿激活,变量的值是采样到的值
base_rule1:assert property(cont_prop(rst,in1,in2)) pass_state else fail_state;
//Request-Grant协议描述:request拉高,在2个周期后,grant拉高,
//在1个周期后,request拉低,在1个周期后,grant拉低
property req_grant_prop
@(posedge clk) req ##2 gnt ##1 !req ## !gnt;
endproperty
assert property req_grant_prop else $error ("Req-Gnt Protocol violoation");
3.assertion、property、sequence关系
- assertion可以直接包含一个property
- assertion也可以清晰地独立声明property
- 在property内部可以有条件地关闭
- property块可以直接包含sequence
- 复杂的property也可以独立声明多个sequence
3.1 断言中的property
结合sequence对时序和逻辑的描述,property可以用来描述设计的确切行为。
property可以在验证中用来做assumption,checker或者coverage:
- 当使用assert关键词时,可以用作checker来检查设计是否遵循property的描述
- 当使用assume关键词时,可以作为环境的假设条件,对于仿真环境和形式验证均起到对激励进行假设的作用
- 当使用cover关键词时,可以将property是否真正通过作为断言覆盖率来衡量
property可以在module、interface、clocking块或者package中声明
property共有七种:
分类 | 用途 |
---|---|
sequence | 只有满足sequence条件,property才可以通过 |
negation | 不期望出现这个negation条件,property通过;可以用NOT关键词 |
disjunction | 至少要有一个满足,property通过;可以用OR关键词 |
conjunction | l例如exp1 and exp2,只有两个exp都满足时,property通过;可以用AND关键词 |
if…else | 条件选择 |
implication | 蕴含,同sequence中用法一致 |
instantiation | 命名一个property后,可以在另外一个property中使用 |
3.2 断言中的sequence
sequence: 是用来表示在一个或者多个时钟周期内的时序描述,是property的基本构建模块
,并经过组合来描述复杂的功能属性
sequence用来提供下列的场景描述:
- 第一个时钟周期,第一个表达式成立的
- 接下来在若干时钟周期后,第二个表达式也成立
- 以此类推,在接下来的若干时钟周期,后续的表达式也成立
sequence可以在module interface、program、clocking块和package中声明
sequence s1;
@ (posedge clk) a ##1 b ##1 c;
endsequence