我读过“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网站上被列为替换,但我不知道它被替换为什么。]
答案 0 :(得分: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代码等同于合成后门模型,因此不需要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& SystemVerilog Guru
答案 1 :(得分:1)
我相信正确合成的原因是因为在真正的硅片中,“阻塞”和“非阻塞”之间没有区别。
如你所描述的,
综合将读取并创建三个背靠背链接的触发器。
这在合成中不是问题(假设你没有违反翻牌保持时间),因为真正的门会出现延迟。在clk的上升沿,值d
需要几ns才能传播到q1
。当d
传播到q1
时,q1
将在第二次翻牌时被采样,类似于q2
和q3
。
这在模拟中不起作用的原因是因为没有门延迟。在时钟的上升沿,q1
将立即替换为d
,可能在第二次翻转采样q1
之前。在实际电路中(具有适当的建立和保持时间),q1
保证在第一个触发器改变其输出值之前在时钟的上升沿采样。
答案 2 :(得分:0)
我知道这3岁了,但是当有人试图编辑时,你的帖子就被标记了。克利夫的答案当然是全面的,但它并没有真正回答你的问题。另一个答案也是错误的。
我的问题:如果确定了Verilog合成的正确性 不参考模拟语义?
当然,你是对的。合成只是“正确的”#39;如果(a)结果(输出)以与原始(输入)相同的方式模拟,在可能对时间/等问题做出一些考虑之后,和/或(b)合成器输出可以被正式证明等同于合成器输入。
给出最简单的Verilog程序,该程序定义明确 合成语义并没有明确定义的模拟 语义
原则上,这是不可能的。合成器供应商试图定义基于具有明确定义的模拟语义的代码的模板。但是,Verilog的定义很差,并且NBAs最初并不存在于语言中,所以你有像管道示例那样的奇怪之处。最好忘记他们。
事实上,有人可以给我一块明确定义的Verilog 当模拟和合成时,两者产生不同 结果
定义良好的唯一定义' (而不是“正确的”#)在综合中,多个供应商将产生完全相同的错误结果。这是不太可能的。我想经典的异步重置和异步设置时钟F / F会很接近。