在 SystemVerilog case 语句的默认情况下,什么样的断言适合?
我有兴趣知道什么在模拟平台上效果最好或最好,什么通过综合工具具有最广泛的容忍度(忽略),以及什么在错误处理方面最实用。
以下是我想到的一些方法:
default:
$display("this should never occur")
// because all anticipated cases are supposed to be caught above
// and the default catch hints at an illegal or omitted case
endcase
或者,代替 $display()
$info("this should never occur")
或者,在 SystemVerilog 中
assert (false) $warning("this should never occur")
类似的情况也发生在优先级编码的嵌套 if...else 中,最终的 else 预计不会发生。
例如,我经常解析日志文件中的 $display() 输出,以查找测试台报告的问题,但它不适合设计本身中的代码。然而,使用抑制功能,$info 或 $warning 可能效果更好。我也不会使用$error,因为我不希望模拟消失。
还有一些 linting 工具,它们对不可合成的结构有自己的(或)容差。
我意识到,即使对于 2020 年之后的新工具,也存在不同的观点,并且在我将自己锁定在这样一个简单的不切实际且不可扩展的方法之前,我想先了解一下其优点和缺点。断言。 我不希望答案之间存在引用规则或完全一致。
我通常不喜欢用于模拟与综合的条件代码:最好是工具应该处理它,而不是我的容易出错的条件。另外,我希望使用语言语句,而不是任务或“定义”。
SystemVerilog 有一个
priority case
和一个 unique case
,如果没有 default
并且没有选择其他 case item,它会为您创建一个断言。
请注意,这对于顺序逻辑或组合逻辑来说效果很好,不会出现可能触发错误的故障。
否则,综合工具会忽略断言。