Verilog Dflipflop代码的意外结果

时间:2018-07-14 04:26:35

标签: verilog

对于下面的verilog dff示例,最后显示输出(仅显示前两行)。我无法理解为什么总是在零时间执行always块,而我却写了always @(posedge clk)。 posege clk不在时间零发生。你能帮我理解输出吗?

module main;
reg d,clk;
wire q;

always #5 clk++;
always #10 d++;

dff dff(d,clk,q);  

initial 
begin
d = 1;
clk = 1;
$monitor("time = %d d = %d clk = %d q = %d",$time,d,clk,q);
#50 $finish ;
end
endmodule

module dff(input wire d,clk, output reg q);
always @(posedge clk)
begin
q = d;
$display("time = %d inside module dff",$time);
end
endmodule

Output is
time =                    0 inside module dff
time =                    0 d = 1 clk = 1 q = 1
...

1 个答案:

答案 0 :(得分:3)

在编码顺序逻辑时使用非阻塞分配q<=d;)。非阻塞分配将在NBA地区分配LHS,我们可以观察到LHS和RHS之间的时钟延迟。

有关非阻塞分配使用的更多信息,请参见this paper

就在时间0处执行的always块而言,在时间0处有clkx1的过渡 (来自initial块)。结果,模拟器将其视为上升沿。请注意,reg的默认值为x

我们可以根据需要在Verilog / SV中制作不同类型的时钟发生器。有关不同类型的时钟发生器的示例,请参见Cummings paper