1

これは整理するのが最も簡単な問題ですが、何らかの理由でそれを理解できません。私は現在 Verilog を独学で学んでおり、演習として非常に基本的なモジュールとこれらのモジュール用のテスト ベンチを開発しています。これらのモジュールの 1 つが 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

そして、ここにシミュレーションがあります: ここに画像の説明を入力

テスト ベンチ reg Q は、シミュレーションの間 x のままです (Q[0] はそうではありません...)。

理由はありますか?ありがとう!

4

1 に答える 1

2

フロップをリセットしないため、最初のクロック エッジの前に、Q には既知の値がありません。

通常、フロップには非同期リセットがあり、テスト ベンチでのシミュレーションの開始時にアサートする必要があります。FF の always ブロックは次のようになります。

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

また、Q を reg として定義する必要はありません。それはワイヤーでありえます。edaplayground.com の作業コード

于 2014-04-21T20:57:50.937 に答える