对于大规模的IC设计,designer通常会在RTL中加入一些辅助验证或者debug的逻辑,这些逻辑不可综合,代码覆盖率单独统计。
SystemVerilog Assertion非常完美的解决了这个问题
有两种方式:
通过systemverilog中的引导语
// covered off
// pragma coverage block = off, expr = off, fsm = off, toggle = off
// synopsys translate_off
// synthesis translate_off
// pragma translate_off
# 在这中间的代码,不统计覆盖率,逻辑综合时不map
sva code
// pragma translate_on
// synthesis translate_on
// synopsys translate_on
// pragma coverage block = on, expr = on, fsm = on, toggle = on
// covered on
# 在这之后的代码覆盖率正常统计,也会被综合
# 也就是说上述代码块可以插在RTL中的任何位置
# 不过为了代码风格统一,一般都放在最后
通过宏定义
这种方式比较直观,与通常所使用的宏定义相同,但是在收集coverage时如果打开,会影响coverage,需要手动exclude。
`ifdef ASSERT_ON
SVA code
`endif