在sv的assertion中,会用到时钟打拍操作。一般会在assertion代码块中,显示的写上使用的时钟,
property counter_2;
@(posedge clk)
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2: assert property(counter_2);
如果说,不写使用的时钟,即如下代码:
property counter_2;
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2: assert property(counter_2);
编译就会有如下错误:
Error-[NCIFA] No clock inferred for assertion
tb.sv, 50
tb, "cover_counter_2"
The concurrent assertion statement has no clock as a whole or in part.
Assertions cannot be unclocked in SystemVerilog.
因为没有指定时钟,所以##1操作,就不知道使用什么时钟可以实现延迟一个时钟的操作。
如果说,我们编写的assertion,都使用一个时钟,那么我们可以把这个时钟,定义为全局的时钟。这样,编写的assertion中,就不在需要显示指定时钟,就可以直接使用##这样的操作。
定义全局时钟,使用 default clocking进行定义。
default clocking cb @(posedge clk);
endclocking: cb
然后编写assertion。
property counter_2;
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2: assert property(counter_2);
此时编译仿真正常