对于下面的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
...
答案 0 :(得分:3)
在编码顺序逻辑时使用非阻塞分配(q<=d;
)。非阻塞分配将在NBA地区分配LHS,我们可以观察到LHS和RHS之间的时钟延迟。
有关非阻塞分配使用的更多信息,请参见this paper。
就在时间0处执行的always
块而言,在时间0处有clk
从x
到1
的过渡 (来自initial
块)。结果,模拟器将其视为上升沿。请注意,reg
的默认值为x
。
我们可以根据需要在Verilog / SV中制作不同类型的时钟发生器。有关不同类型的时钟发生器的示例,请参见Cummings paper。