这部分内容还是比较复杂的,verilog检查代码行为更为底层,编码也更复杂。断言assertion抽象更高级的语言,提供更多函数或操作符,让描述信号时序更为简单。
推荐书籍《system verilog assertion应用指南》,另外,b站有人分享了路科关于assertion部分视频,可以借鉴学习
assertion断言最初用于验证设计的行为,是在仿真中嵌入或黏附于设计的检查,即设计中加入的检查。在cortex m3系列代码中,就看到设计代码后面通过条件编译使用断言。一旦特定的条件或事件序列出现,就会产生警告或错误信息。
使用断言,我们可以检查特定条件condition或事件序列的发生,并提供功能覆盖率functional coverage。断言可以分为immediate assertion和concurrent assertion,前者检查当前仿真时刻的条件,后者检查在多个周期内的事件序列sequence of event
即时断言,和if-else类似,需要在过程块中定义,语法如下,其中label可选,用于给断言语句取个名字,assert为关键词,expression执行完后立即执行action_block,action_block指明断言成功或失败,应该怎么做。
在action_block,由两部分组成,当expression为真时,执行pass_statement语句,反之执行fail_statement。当然,pass_statement和fail_statement都是可选的。
既然是断言,一些事情必须是满足的,断言失败可能会带来严重后果,默认情况下,断言失败的后果是error。当然,还可以指定后果等级,可以通过不同的系统函数抛出问题
如果断言语句,没有给出else分支,工具默认调用$error函数
来看一个实例,断言在always块中,并且pass_statement和fail_statement都没有给出
按照代码,可以用波形直观查看,即在时钟上升沿检查a和b是否同时为1
并发断言主要处理时序,即信号之间的配合,可以放在过程块、module、interface和program中。
举个例子,这类断言区别于前一类,增加了property关键词
发表评论