SVA的动态控制($asserton,$assertoff,$assertkill等)

资料来源

(1) 硅芯思见:【91】SVA的动态控制 (qq.com)

1.$asserton, $assertoff, $assertkill

(1) 作用

注1:$assertoff暂时关闭所有断言的执行,如果该函数执行时断言正在执行,正在执行的断言不会被终止;

注2:$asserton重新启动断言执行;

注3:$assertkill将会终止设计中所有的断言,包括已经执行的断言;当遇到下一个断言需要开始执行时,需要使用$asserton启动;

(2) 使用示例: $asserton/$assertoff/$assertkill[(level[,list_of_modules_or_assertions])];

注1:level用于指定层以下哪几层设计收到函数的影响;如果level为0,函数将影响至顶层以下所有的设计;

注2:list_of_modules_or_assertions指定该函数作用于哪些模块或断言(不能指向序列,但可以指向属性);

注3:这些函数可以不指定参数,这样这些函数的作用域将默认为整个设计;

2.详细示例

2.1示例一

 

注1:第一次断言在3ns处触发,$assertoff发生在6ns处,所以第一次断言的执行没有收到$assertoff影响;

注2:第二次断言在15ns处触发,但是由于$assertoff发生在6ns处,所以第二次断言被关闭,不会执行;

注3:22ns处$asserton执行,重新启动断言检查,所以27ns处的第三次断言被有效触发执行;

2.2示例二

 

注1:6ns时,$assertkill执行,虽然这时3ns开始的断言在执行中,但是会立即被终止执行,即当前正在执行的断言会被$assertkill终止;如果后续的断言还要继续执行,需要使用$asserton重新开启断言检查;

2.3示例三

 

注1:$assertoff(1,test)表示所有例化在test的示例中的断言从6ns开始关闭,此时如果有断言正在执行,其将不受到$assertoff的影响,之后新的例化子test的示例中的断言将不再执行,直至后续$asserton重新开启断言检查;

2.4示例四

 

注1:$assertoff(0,u_dut0)将u_dut0及其以下所有层次断言关闭;

注2:$assertoff(1,u_dut1)将u_dut1模块的所有断言关闭,但是不包括其下所有层次;

注3:$assertoff(1,top_tb)将top_tb模块内所有断言关闭,但是不包括其下所有层次;

注4:$asserton(0,u_dut0)重新开启了u_dut0的断言检查; 

 

 

 

 

 

 

 

 

 

 

 

posted on 2022-02-13 21:48  知北游。。  阅读(6496)  评论(0编辑  收藏  举报

导航