4

VHDL のコースを受講した後、Verilog を独学で学び始めたところです。行動ステートメントが実行される順序を理解するのに苦労しています。これが問題のコードです。

//This files is an experiment into the order in which verilog executes it's statements

module MainCircuit(clk, start);

    parameter cycles = 8;
    input clk;
    input start;
    //input [15:0] data;

    integer i;

    always @(posedge clk)
    begin
        if(start)
        begin
            i=0;

            repeat(cycles)
            begin
                @(posedge clk) $display("%d\ti = %d", $time, i);
                i = i + 1;
            end
        end
    end

endmodule

module tester;

    reg clk;
    wire start;

    assign start = 1'b1;
    initial clk = 1'b0;

    MainCircuit myMain(clk, start);
    initial repeat(40)
    begin
        #5 clk = 1'b1;
        #5 clk = 1'b0;
    end

endmodule

そしてここに出力があります

                  15    i =           0
                  25    i =           1
                  35    i =           2
                  45    i =           3
                  55    i =           4
                  65    i =           5
                  75    i =           6
                  85    i =           7
                 105    i =           0
                 115    i =           1
                 125    i =           2
                 135    i =           3
                 145    i =           4
                 155    i =           5
                 165    i =           6
                 175    i =           7
                 195    i =           0
                 205    i =           1
                 215    i =           2
                 225    i =           3
                 235    i =           4
                 245    i =           5
                 255    i =           6
                 265    i =           7
                 285    i =           0
                 295    i =           1
                 305    i =           2
                 315    i =           3
                 325    i =           4
                 335    i =           5
                 345    i =           6
                 355    i =           7
                 375    i =           0
                 385    i =           1
                 395    i =           2

正のクロック エッジごとにゼロにリセットされない理由がわかりません。myMain は実行中の場所を覚えており、クロックが呼び出されるたびにそこから続行しますか? もしそうなら、それはどこで止まっていますか?そして、これらすべてをどのように合成するのでしょうか?

その他の 2 つの小さな質問:

start <= 1'b01; と書いてみました。assign start = 1'b01; の代わりに 2番目のモジュールでは機能しません。なぜだめですか?

2番目は、出力の奇妙な間隔の原因は何ですか?

お時間をいただきありがとうございます。

4

1 に答える 1

4
  1. always @(posedge clk)すべてのクロック エッジで自動的に実行されるわけではありません。always ブロックは、現在の実行の最後に到達した場合にのみ再開できます (1 つのブロックを同時に 2 つのスレッドで実行することはできません)。end(繰り返しサイクル)ループでスタックしているため、常にブロックは8クロック後まで到達しません。8 ポーズエッジ クロック後にのみ、ループを終了し、always ブロックの最後に到達して、次のポーズエッジで再開できます。

  2. start <= 1'b1はノンブロッキング代入であり、always ブロック内でのみ実行できます。

  3. $display は、おそらく 32 ビット 10 進数の最大値を出力するのに十分なスペースを確保しています。余分なスペースをすべて入れたくない場合は、%0d代わりに%d.

于 2012-03-31T18:41:31.513 に答える