Verilog DFF模拟生成x输出

时间:2014-04-21 20:41:57

标签: verilog flip-flop

这应该是最简单的解决问题,但由于某种原因我无法弄明白。我目前正在自学Verilog,并且正在为这些模块开发非常基本的模块和测试平台。其中一个模块是D触发器(DFF)。这是DFF模块(无复位):

module DFF( clk, D, Q );
    parameter n = 1;    // DFF width
    input clk;
    input [n-1:0]  D;
    output [n-1:0] Q;
    reg [n-1:0] Q;

    always @( posedge clk ) begin
        Q <= D;
    end
endmodule

以下是测试平台:

module DFF_tb;
    reg clk, D;
    reg Q;

    DFF #(1) DUT ( clk, D, Q );

    initial begin
        clk = 1'b0;
        forever #10 clk = ~clk;     // Generate clock
    end

    initial begin   
        D = 0;                          // Check D = 0
        if ( Q !== 0 ) $display( "[FAIL] Q = 0" );

        #40 D = 1;                      // Check D = 1
        #40
        if ( Q !== 1 ) $display( "[FAIL] Q = 1" );

        $finish;                            // Complete test
    end
endmodule

这是模拟: enter image description here

测试台reg Q在模拟期间保持x(认为Q [0]没有......)。

知道为什么吗?谢谢!

1 个答案:

答案 0 :(得分:2)

你没有重置翻牌,因此在第一个时钟边缘之前,Q没有任何已知值。

通常,翻牌具有异步重置,应在测试台的模拟开始时置位。 FF中的始终阻止应为:

always @( posedge clk or posedge reset ) begin
  if (reset)
     Q <= '0;
  else
     Q <= D;
end

另外,您不需要将Q定义为reg。它可以是电线。 edaplayground.com

上的工作代码