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的断言检查;