用来与设计功能和时序作比较的属性描述
断言可以用来完成:
可读性好,可以用来服务于设计文档;
用来检查算法模型的断言在形式验证(formal verification)中可以穷尽计算,找出可能的违例(violation);
可以自由地打开或者关闭;
一小部分子集甚至可以用来综合或者移植到emulation中,用来完成跨平台地移植;
[name:] assert(expression)[pass_statement][else fail_statement]
// 如果状态为REQ,但是req1或者req2均不为1时,断言将失败
time t;
always @(posedge clk)
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 ->event1;
assert(y == 0) else flag = 1;
always @(state)
assert(state == $onehot) else $fatal;
base_rule1: assert property(cont_prop(rst, in1, in2)) pass_stat else fail_stat;
// Request-Grant协议描述:
// request拉高,在2个周期后,grant拉高,在1个周期后,request拉低,在1个周期后,grant拉低
property req_grant_prop
@(posedge clk) req ##2 gnt ##1 !req ##1 !gnt;
endproperty
assert property req_grant_prop else $error("Req-Gnt Protocol violoation");
// assertion可以直接包含一个property
assert property(@(posedge clk))
disable iff(!reset) // property内部可以设置条件来关闭或打开
a |=> b ## 1 c;
// assertion也可以清晰地独立地声明property
assert property(my_prop);
property my_prop;
@(posedge clk);
disable iff(!reset); // property内部可以设置条件来关闭或打开
a |=> b ## 1 c;
endproperty
sequence s1;
@(posedge clk) a ##1 b ##1 c;
endsequence
sequence s2;
@(posedge clk) 1 ##1 c;
endsequence
property p1;
@(posedge clk) disable iff (!reset)
s1 |=> s2;
endproperty
|=>
运算符sequence s1;
@(posedge clk) a ##1 b ##1 c;
endsequence
sequence t2;
(a ##[2:3] b) or (c ##[1:2] d);
endsequence
sequence用来提供下列的场景描述:
sequence可以在module、interface、program、clocking块和package中声明;
sequence不可以在类中声明,property会把sequence包含起来使用,property要被设置断言来检查或者覆盖sequence,检查和覆盖也不能发生在类中
sequence也可以提供形式参数,用来提高复用性
sequence s20_1(data, en);
(!frame && (data = data_bus)) ##1 (c_be[0:3] == en);
endsequence
蕴含(implication)操作符用来表示,如果property中左边的先行算子(antecedent)成立,那么property右边的后续算子(consequent)才会被计算;
如果先行算子不成功,那么整个属性就默认地被认为成功,这叫做“空成功”(vacuous success);
蕴含结构只能用来属性定义中,不能在序列中使用;
蕴含可以分为两类:交叠蕴含(overlapped implication)和非交叠蕴含(non-overlapped implication);
|->操作符
是交叠交错符号
|=>操作符
是非交叠交错符号