我已阅读“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 网站上被列为已替换,但我不知道它是由什么替换的。]