如何用Assertion检查“某事件在仿真过程中一定要发生”
前言:在数字电路验证中,我们经常会碰到这样一个需求:检查某个信号在仿真结束前应该至少拉高过一次或者只拉高一次。比如一个简单的握手协议要求request每拉高一次就要收到一个acknowledge信号。如果acknowledge需等待的cycle数不确定,我们在构造断言时会自然而然的想到##[1:$]这类写法,如:
property p_handshake_check();
@(posedge clk) rdy |-> ##[1:$] acpt ##1 !acpt;
endproperty
a_handshake_check: assert property(p_handshake_check) else $error();
但是##[1:$]这样的写法会影响仿真效率,为什么呢?因为这样写法可以分解为无数个并行check的进程, 以如下sequence为例:
sequence seq_abc();
$rose(a) |-> b[*1:8000] ##1 c ##1 d;
endsequence
可以分解为8000个并行的进程