gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:34:17 27 4
gpt4 key购买 nike

我已经阅读了“ 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


PS:万一有人在意,尽管我对正确的综合工具做出了合理的定义,但我可能会遵循“综合的硬件将执行正确的模拟器可以做的事情”的思路。但这与论文不一致。

[我现在认为该文件不正确。 1364-2001标准的5.2节明确指出,Verilog程序的含义是通过模拟然后由该标准继续定义(不确定性和全部)来定义的。没有提及综合工具必须在模拟器之上提供的任何“保证”。

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

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

Cliff Cummings被列为1364.1-2002标准工作组的成员。该标准在IEEE网站上已被替换为标准,但我无法确定它被替换为什么。]

最佳答案

全部-

是时候让我了解有用的背景信息和我自己的见解。

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

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行为相匹配,或者他们尝试运行等效检查工具以数学方式证明合成前的门TLT代码与合成后的门模型等效,因此不需要gate-sims。

至于奖金问题,这确实很难,因为Verilog语义已经很好地定义了,即使定义是合法的竞争条件。

至于在模拟和综合中具有不同结果的定义明确的代码,请考虑:

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

always
o = a & b;
endmodule


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

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


“最后一点,上一段所指的是
分配可用于计算非阻塞分配的RHS。这个
似乎违反了卡明斯的建议5。”


没错,这确实违反了编码准则5,在我看来,不应使用。

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

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

问候-Cliff Cummings-Verilog和System

关于verilog - 从Verilog代码合成的硬件正确意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11199123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com