仿真与综合电路行为的不匹配
always 敏感列表
不完整的敏感列表
综合仍会推断出正确的电路(与门),但仿真行为与综合电路不符。

完整的敏感列表,但赋值顺序错误
综合仍会推断出正确的电路(与或门),但仿真行为与综合电路不符。

函数
函数会被综合为位组合逻辑,而如果函数中的代码对应锁存器,则综合前仿真视为锁存器,综合后仿真却视为组合逻辑,出现不匹配。

Case
Full Case
// synopsys full_case
表示所有可能的 case 都已经列出,未列出的都是“不关心”的。
- 推导出 4 个 3 输入与门。

- 推导出 4 个 2 输入与门,
en
信号被优化掉了。

Parallel Case
// synopsys parallel_case
告诉综合工具应并行检验所有条件,即使存在重叠的条件。
重叠的条件平常会推导出优先级编码器,但在 parallel case
中会推导为无优先级。
z
的 case 条件优先级高于y
,所以y
的条件中必须排除与z
重叠的部分,推导出优先级。

- 在
parallel case
中,各个条件无优先级,故各自z
和y
各自推导出 2 输入与门。

casex
casex
将 x
态视作不关心。当信号被初始化为未知状态时,可能会导致 x
态传播,但 casex
不能检测到这样的问题。
- 当
en
因为某种原因变为x
态,casex
仍会根据addr
进行匹配、执行,掩盖了x
态的问题。addr
也是一样。

- 不要使用
casex
,最好使用casez
。
casez
casez
将 z
态视作不关心,可能会导致 casex
一样的问题。
- 但是用
casez
于建模地址解码器和优先级编码器时非常有用,可以用?
去匹配。

初始化
赋值 x
初始化
x
对于verilog仿真器是未知,对于综合工具是不关心(利于综合优化)。
- 赋值
x
可能导致仿真综合不匹配,但是在 FSM 设计中可能有用,可以在仿真时检测错误的状态转换。 s == 2'b11
时产生不匹配,但是若2'b11
是不期望达到的状态,可以用于仿真调试。

- 这种方法可以综合成更小、更快的设计。

使用 translate_on/translate_off
初始化
?

DFF:translate_on/translate_off
的一般用法
translate_on/translate_off
在打印信息的时候很有用,但用于建模功能却很危险。- 一个例外是带异步复位和置位功能的 DFF ,典型的编码风格可以综合出正确的电路,并在 99% 的时间中仿真正确。

- 但是,当
rstn
和setn
都拉低后,rstn
再拉高,此时q
却未被置位。需要使用不可综合的构造才能完全与综合后的电路行为 100% 匹配。

延时
在赋值左侧设置延时可能导致仿真与综合电路行为不匹配。
- 当
in
发生改变,经过 65 个时间单位才退出always
块,期间in
再次发生改变也不会再次进入always
块,计时期间其他事件都被忽略。这显然与综合后电路的行为不符。
