0%

SynMismatch

仿真与综合电路行为的不匹配

always 敏感列表

不完整的敏感列表

综合仍会推断出正确的电路(与门),但仿真行为与综合电路不符。

image-20230720143819953

完整的敏感列表,但赋值顺序错误

综合仍会推断出正确的电路(与或门),但仿真行为与综合电路不符。

image-20230720144229002

函数

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

image-20230720144650001

Case

Full Case

// synopsys full_case 表示所有可能的 case 都已经列出,未列出的都是“不关心”的。

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

Parallel Case

// synopsys parallel_case 告诉综合工具应并行检验所有条件,即使存在重叠的条件。

重叠的条件平常会推导出优先级编码器,但在 parallel case 中会推导为无优先级。

  • z 的 case 条件优先级高于 y ,所以 y 的条件中必须排除与 z 重叠的部分,推导出优先级。
image-20230720151307235
  • parallel case 中,各个条件无优先级,故各自 zy 各自推导出 2 输入与门。
image-20230720151449582

casex

casexx 态视作不关心。当信号被初始化为未知状态时,可能会导致 x 态传播,但 casex 不能检测到这样的问题。

  • en 因为某种原因变为 x 态,casex 仍会根据 addr 进行匹配、执行,掩盖了 x 态的问题。addr 也是一样。
image-20230720152943467
  • 不要使用 casex ,最好使用 casez

casez

casezz 态视作不关心,可能会导致 casex 一样的问题。

  • 但是用casez 于建模地址解码器和优先级编码器时非常有用,可以用 ? 去匹配。
image-20230720155035661

初始化

赋值 x 初始化

x 对于verilog仿真器是未知,对于综合工具是不关心(利于综合优化)。

  • 赋值 x 可能导致仿真综合不匹配,但是在 FSM 设计中可能有用,可以在仿真时检测错误的状态转换。
  • s == 2'b11 时产生不匹配,但是若 2'b11 是不期望达到的状态,可以用于仿真调试。
image-20230720155817399
  • 这种方法可以综合成更小、更快的设计。
image-20230720160434574

使用 translate_on/translate_off 初始化

image-20230720162603383

DFF:translate_on/translate_off 的一般用法

  • translate_on/translate_off 在打印信息的时候很有用,但用于建模功能却很危险。
  • 一个例外是带异步复位和置位功能的 DFF ,典型的编码风格可以综合出正确的电路,并在 99% 的时间中仿真正确。
image-20230720163244781
  • 但是,当 rstnsetn 都拉低后,rstn 再拉高,此时 q 却未被置位。需要使用不可综合的构造才能完全与综合后的电路行为 100% 匹配。
image-20230720163442624

延时

在赋值左侧设置延时可能导致仿真与综合电路行为不匹配。

  • in 发生改变,经过 65 个时间单位才退出 always 块,期间 in 再次发生改变也不会再次进入 always 块,计时期间其他事件都被忽略。这显然与综合后电路的行为不符。
image-20230720164319176