从Verilog代码合成的硬件正确意味着什么

从Verilog代码合成的硬件正确意味着什么,verilog,system-verilog,Verilog,System Verilog,我读过Clifford Cummings的“Verilog合成中的非阻塞分配,致命的编码风格!”。他说,这个问题底部的代码“保证”被合成成一个三触发器管道,但不能保证正确模拟(示例pipeb3,第10页;“保证”注释在第12页)。这份文件获得了最佳论文奖,所以我认为这是真的 我的问题是:如果不参考模拟语义,Verilog合成的正确性是如何定义的?非常感谢 我想问题的好处是:假设不是下面的代码,给出一个最简单的Verilog程序,它有定义良好的合成语义,但没有定义良好的模拟语义。再次感谢 事实上,

我读过Clifford Cummings的“Verilog合成中的非阻塞分配,致命的编码风格!”。他说,这个问题底部的代码“保证”被合成成一个三触发器管道,但不能保证正确模拟(示例pipeb3,第10页;“保证”注释在第12页)。这份文件获得了最佳论文奖,所以我认为这是真的

我的问题是:如果不参考模拟语义,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网站上被列为已被替换的标准,但我无法说出它被替换了什么。]

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

综合将阅读这些内容,并创建三个背靠背链接的触发器,如您所述

这在合成中不会是一个问题(假设您没有违反flop hold time),因为真正的门显示延迟。在clk的上升沿,值
d
需要几个纳秒才能传播到
q1
。当
d
传播到
q1
时,
q1
将已经被第二次触发器采样,与
q2
q3
类似

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

All-

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

首先,IEEE-1364.1-2002 Verilog RTL综合标准从未被任何供应商完全实施,这就是为什么我们没有人急于更新标准或提供综合标准的SystemVerilog版本。据我所知,该标准没有被“取代”,只是刚刚过期。据我所知,标准中描述的属性从未被任何供应商完全实现过。我认为标准中唯一有用的功能是所有供应商都实现了,供应商应该在读取任何用户代码之前设置宏“定义合成”,因此,您现在可以使用`ifndef SYNTHESIS-`endif作为特定于供应商的//synopsys translate\u on-//synopsys translate\u off pragma注释的通用替换

Verilog是作为一种模拟语言被发明的,从来没有打算成为一种合成语言。20世纪80年代末,Synopsys认识到工程师们非常喜欢这种Verilog模拟语言,并开始定义他们(Synopsys)将识别并通过合成转换为硬件的语言子集。我们现在将其称为RTL合成子集,随着合成工具供应商发现将新类型的描述转换为硬件的独特和创造性方法,该子集会随着时间的推移而增长

实际上没有“定义Verilog合成的正确性”。Don Mills和我在1999年写了一篇题为“产生模拟和合成不匹配的RTL编码风格”的论文,警告工程师关于合法的Verilog编码风格可能推断出具有不同行为的合成硬件。

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

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

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

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

  always
    o = a & b;
endmodule
模拟