SVA基础
(1)基本概念
什么是assertion?
- assertion是用来与设计功能和时序做比较的属性描述;
- assertion可以用来完成:①检查设计的内容;②提高设计的可视度和调式能力;③检查设计特性在验证中是否被覆盖;
- assertion可以自由的打开和关闭(约束也可以自由打开和关闭);
assertion可以被写在哪里?
- 可以写在过程块、module、interface和program中;
assertion覆盖率?
- ①仿真工具可以报告断言覆盖率,来指示哪些断言没有被触发;
- ②帮助检查是否验证计划捕捉到了所有需要的覆盖率;
- ③断言覆盖率和功能覆盖率可以共同量化验证进度;
(2)assertion分类
<1>立即断言
- 非时序的;可以在initial/always过程块或者task/function中使用
always@(posedge clk)
// 如果状态位REQ,但是req1或req2均不为1,断言将失败
if(state == REQ)
assert(req1 || req2)
else begin
t = $time;
#5 $error("assert failed at time %0t", t);
end
//*******************************************************************
assert(myfunc(a,b)) count1 = count+1;
else -> event;
//********************************************************************
assert(y==0) else falg=1;
<2>并行断言
- 时序性的;关键词property用来区分立即断言和并行断言;之所以称之为并行,是因为它们与设计模块一同并行执行。
property req_grant_prop
@(posedge clk) req ##2 gnt ##1 !req ##!gnt;
endproperty
assert property req_grant_prop else $error("Req-Gnt Protocol violoation);
注意:assertion可以直接包含一个property,也可以清晰地独立声明property,在property内部可以有条件地关闭。
- property块可以直接包含sequence;复杂的property也可以独立声明多个sequence。
什么是sequence?
- sequence是用来表示在一个或者多个时钟周期内的时序描述;是property的基本构建模块,并经过组合来描述复杂的功能属性;可以在module、interface、program、clocking块和package中声明。
- sequence可以提供形式参数,用来提高复用性。
sequence s21_1(data, en);
(!frame && (data==data_bus)) ##1 (c_be[0:3] ==en);
endsequence
什么是交叠交错符号和非交叠交错符号(蕴含操作符)?
- ①
|->
操作符号是交叠交错符号:如果条件满足,则评估其后续算子序列;如果条件不满足,则表现为空成功,不执行后续算子。
②
|=>
操作符号是非交叠交错符号:如果条件满足,则下一个周期评估其后续算子序列;如果条件不满足,则表现为空成功,不执行后续算子。
注意:可以把蕴含操作符当做if,|=>
是从下一拍(##1)开始检查,a |=> b
就相当于a|-> ##1 b
,实际上可以使用|->
完全替代|=>
。
property与sequence的相同和不同之处
- ①任何在sequence中的表达式都可以放到property中;
- ②任何在property中的表达式也可以搬到sequence中,但是只有在property中才能使用蕴含操作符;
- ③property中可以例化其他property和sequence,sequence中也可以调用其他的sequence,但是不能例化property;
- ④property需要用cover /assert/assume 等关键字进行实例化,而sequence直接调用即可;
(3)sequence
<1>基本操作符号
①##
##
用来表示周期延迟符号,例如##n
表示在n个时钟周期后,##0
表示在当前周期,即交叠周期。
举例
sequence a_b
// a有效的下一个时钟周期b有效
@(posedge clk) a ##1 b
endsequence
②##[min,max]
##[min,max]
表示在一个范围内的时钟周期延迟。min、max必须是非负