卢骏 · 2020年09月03日

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

此时编译仿真正常

更多相关阅读

奔跑吧,SOC(三) 互联总线协议
奔跑吧,SOC(二) 片上互联总线
奔跑吧,SOC(一) 软件是怎么控制硬件的

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

推荐阅读
关注数
20052
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息