从Verilog代码合成的硬件是正确的是什么意思

use*_*059 4 verilog system-verilog

我读过"Verilog综合中的非阻塞分配,杀死的编码样式!" 作者:Clifford Cummings.他说,这个问题底部的代码"保证"被合成为三个触发器管道,但不保证能够正确模拟(例如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
Run Code Online (Sandbox Code Playgroud)

PS:如果有人关心,我虽然对正确的综合工具的合理定义可能与"合成的硬件将做一些正确的模拟器可以做的事情"的方式相符.但这与论文不一致.

[我现在认为这篇论文不对.1364-2001标准的第5.2节明确指出Verilog程序的含义是由其模拟定义的,然后标准继续定义(非确定性和所有).除了模拟器之外,综合工具必须提供的任何"保证"都没有提及.

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

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

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

Cli*_*ngs 10

全部 -

是时候让我充实了有用的背景信息和我自己的意见.

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

Verilog被发明为一种模拟语言,从未打算成为一种综合语言.在20世纪80年代后期,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代码等同于合成后门模型,因此不需要gate-sims.

至于奖金问题,这真的很难,因为Verilog语义很明确,即使定义是合法的竞争条件.

至于模拟和合成中定义良好的代码,结果不同,请考虑:

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

  always
    o = a & b;
endmodule
Run Code Online (Sandbox Code Playgroud)

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

至于论文是否应该提供正确的合成行为保证,它可能不应该,但我的论文中描述的保证定义了工程师可以根据多种综合工具的经验从综合工具中获得什么.

"作为最后一点,前一段中提到的部分说阻止分配可用于计算非阻塞分配的RHS.这似乎违反了Cummings的建议#5."

你是对的,这确实违反了编码指南#5,在我看来不应该使用.

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

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

问候 - Cliff Cummings - Verilog&SystemVerilog Guru