4

我已阅读“Verilog 综合中的非阻塞分配,致命的编码风格!” 通过克利福德卡明斯。他说这个问题底部的代码是“保证”合成成一个三触发器管道,但不能保证正确模拟(例如 pipeb3,第 10 页;“保证”注释在第 12 页)。该文件获得了最佳论文奖,因此我认为该声明是正确的。http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

我的问题:如果不参考模拟语义,如何定义 Verilog 综合的正确性?非常感谢。

我想加分问题是:假设它不是下面的代码,请给出最简单的 Verilog 程序,它具有明确定义的综合语义并且没有明确定义的模拟语义。再次感谢。

事实上,有人可以给我一段在模拟和合成时定义良好的 Verilog,但两者会产生不同的结果吗?

编码:

module pipeb3 q3, d, clk);
  output [7:0] q3;
  input [7:0] d;
  input clk;
  reg [7:0] q3, q2, q1;

  always @(posedge clk) q1=d;
  always @(posedge clk) q3=q2;
  always @(posedge clk) q1=d;
endmodule

PS:万一有人关心,我认为正确合成工具的合理定义可能是“合成硬件将做正确模拟器可以做的事情”。但这与论文不符。

[我现在认为论文是不对的。1364-2001 标准的第 5.2 节明确指出,Verilog 程序的含义是由其模拟定义的,然后标准继续定义(非确定性和所有)。没有提及合成工具必须提供的任何“保证”超过模拟器。

还有另一个标准 1364.1-2002 描述了可综合子集。没有明显提到合成硬件的语义应该与模拟有所不同。第 5.2.2 节“对边缘敏感的存储设备建模”说应该使用非阻塞分配来建模触发器。用标准语言来说,这意味着不支持使用其他任何东西。

作为最后一点,上一段中提到的部分说阻塞分配可用于计算非阻塞分配的 RHS。这似乎违反了卡明斯的建议 #5。

Cliff Cummings 被列为 1364.1-2002 标准工作组的成员。该标准在 IEEE 网站上被列为已替换,但我不知道它是由什么替换的。]

4

3 回答 3

10

全部 -

是时候让我加入有用的背景信息和我自己的观点了。

首先 - IEEE-1364.1-2002 Verilog RTL 综合标准从未被任何供应商完全实施,这就是为什么我们都不急于更新标准或提供综合标准的 SystemVerilog 版本。据我所知,该标准并未“被替换”,并且刚刚过期。据我所知,标准中描述的属性从未被任何供应商完全实现。我认为所有供应商都实施的标准中唯一有用的功能是供应商应该在读取任何用户代码之前设置宏 `define SYNTHESIS,以便您现在可以使用 `ifndef SYNTHESIS - `endif 作为通用替代品对于特定于供应商的 // synopsys translate_on - // synopsys translate_off pragma-comments。

Verilog 是作为一种模拟语言发明的,从未打算成为一种综合语言。在 1980 年代后期,Synopsys 认识到工程师真的很喜欢这种 Verilog 仿真语言,并开始定义他们(Synopsys)可以识别并通过综合转换为硬件的语言子集。我们现在将此称为 RTL 综合子集,随着综合工具供应商发现将新型描述转换为硬件的独特和创造性方法,该子集会随着时间的推移而增长。

确实没有“定义的 Verilog 综合的正确性”。Don Mills 和我在 1999 年写了一篇题为“产生模拟和综合不匹配的 RTL 编码风格”的论文,以警告工程师合法的 Verilog 编码风格可能会推断出具有不同行为的合成硬件。 http://www.sunburst-design.com/papers/CummingsSNUG1999SJ_SynthMismatch.pdf

考虑到这一点,如果综合结果始终与 Verilog 模拟的行为相匹配,则无需运行门模拟。RTL 模拟的设计是正确的。因为没有保证匹配,工程师运行 gate-sims 来证明门行为与 RTL 行为相匹配,或者他们尝试运行等价检查工具来数学证明综合前 RTL 代码与综合后门模型等价,因此不需要门模拟。

至于额外的问题,这真的很难,因为 Verilog 语义定义得相当好,即使定义是它是一个合法的竞争条件。

至于具有不同结果的仿真和综合中定义良好的代码,请考虑:

module code1c (output reg o, input a, b);

  always
    o = a & b;
endmodule

在模拟中,您永远不会超过 time-0。由于缺少敏感度列表,模拟将永远循环。在推断组合逻辑时,综合工具甚至不考虑敏感度列表,因此您会得到一个 2 输入与门和一个关于缺少敏感度列表项的警告,这可能导致综合前和综合后仿真之间的不匹配。在 Verilog-2001 中,我们添加了 always @* 来避免这个常见问题,在 SystemVerilog 中我们添加了 always_comb 来删除敏感度列表并通知综合工具设计者预期的逻辑。

至于论文是否应该提供正确综合行为的保证,它可能不应该提供,但我的论文中描述的保证定义了工程师可以根据多种综合工具的经验对综合工具的期望。

“作为最后一点,上一段中提到的部分说阻塞分配可用于计算非阻塞分配的 RHS。这似乎违反了卡明斯的建议 #5。”

你是对的,这确实违反了编码准则#5,我认为不应该使用。

在 VHDL 设计中经常违反编码准则 #5,因为 VHDL 变量不能触发另一个进程。我发现 VHDL 阵营在这个问题上平分秋色。一半的人说您不应该使用变量分配,而另一半人说您不应该使用变量来提高仿真性能,但随后需要将变量分配与最终的信号分配混合以触发其他过程。

如果您违反了编码准则 #5,并且如果您的代码是正确的,那么模拟将起作用并且综合也将起作用,但是如果您的代码中有任何错误,则很难调试违​​反编码准则 #5 的设计,因为组合件的波形显示没有意义。波形显示中组合逻辑的输出仅在未断言复位且在时钟沿时更新,这不是真正的组合硬件的行为方式,并且在使用波形显示调试这些设计时已证明这是一个难题(I没有在论文中包含此信息)。

问候 - Cliff Cummings - Verilog 和 SystemVerilog 大师

于 2012-06-27T19:33:58.147 回答
1

我相信正确合成的原因是因为在真正的硅中,“阻塞”和“非阻塞”之间没有区别。

正如您所描述的,Synthesis 将读取并创建三个背靠背链接的触发器。

这在综合中不会成为问题(假设您没有违反触发器保​​持时间),因为真正的门会出现延迟。在 clk 的上升沿,该值需要几个 nsd才能传播到q1。当时间d传播到 时q1q1将已经被第二次触发器采样,与q2和类似q3

这在模拟中不起作用的原因是没有门延迟。在时钟的上升沿,q1将立即被替换为d,可能之前q1被第二个触发器采样。在实际电路中(具有适当的建立和保持时间),q1保证在第一个触发器可以改变其输出值之前在时钟的上升沿进行采样。

于 2012-06-26T00:17:06.867 回答
0

我知道这个 3 岁,但是当有人试图编辑它时,你的帖子只是被标记了。克里夫的回答当然是全面的,但它并不能真正回答你的问题。另一个答案也是完全错误的。

我的问题:如果不参考模拟语义,如何定义 Verilog 综合的正确性?

你是对的,当然。只有在(a)结果(输出)以与原始(输入)相同的方式进行模拟,在可能对时序/等问题做出一些考虑之后,和/或(b)合成器输出可以正式的情况下,合成才是“正确的”证明等效于合成器输入。

给出最简单的 Verilog 程序,该程序具有明确定义的综合语义,但没有明确定义的模拟语义

原则上,这是不可能的。合成器供应商试图定义基于具有良好定义的模拟语义的代码的模板。然而,Verilog 曾经(并且现在)定义不明确,并且 NBA 最初并不存在于该语言中,因此您会遇到像管道示例这样的怪异之处。最好忘记他们。

事实上,有人可以给我一段在模拟和合成时定义良好的 Verilog,但两者会产生不同的结果吗?

综合中“定义明确”(与“正确”相反)的唯一定义是多个供应商将产生完全相同的错误结果。这不太可能。我猜经典的异步重置异步设置时钟 F/F 会很接近。

于 2015-07-16T13:38:17.817 回答