weiqi7777

sv使用default clocking指定全局默认时钟

0
阅读(2440)

在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);

此时编译仿真正常