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

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

此时编译仿真正常

此条目发表在验证相关分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。