代码之家  ›  专栏  ›  技术社区  ›  Ranju

verilog dflipflop代码的意外结果

  •  0
  • Ranju  · 技术社区  · 6 年前

    对于下面的verilog dff,最后显示示例输出(仅显示前两行)。我无法理解为什么always块在时间0时执行,而我已经编写了always@(posedge clk)。posedge 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 回复  |  直到 6 年前
        1
  •  3
  •   sharvil111    6 年前

    使用 非阻塞分配 ( q<=d; )编码时 相继的 逻辑。非阻塞分配将在nba区域分配lhs,我们可以观察到lhs和rhs之间的时钟延迟。

    参考 this paper 有关非阻塞分配用法的详细信息。

    至于 always 在时间-0执行的块,有一个 clk x 1 时间-0 (来自 initial 块)。因此,模拟器将其视为正边。注意,默认值为 reg 是的。

    我们可以根据需要在verilog/sv中制作不同类型的时钟发生器。参考 Cummings paper 例如不同类型的时钟生成器。