2012-03-31 47 views
3

VHDLのコースを受講した後、Verilogを自分で学習し始めました。私は、行動声明が実行される順序を理解することに問題があります。ここに問題のコードがあります。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は、実行中の場所を覚えていて、時計が呼び出されるたびにそこから続行しますか?もしそうなら、どこで止まっていますか? これはどのように合成されますか?

他の二つのマイナーな質問:

私は 開始< = 1'b01を書き込もうとしました。 の代わりに を割り当てます。assign start = 1'b01; 2番目のモジュールで が動作しません。何故なの?

2番目の出力には奇妙な間隔がありますか?

ありがとうございます。

答えて

4
  1. always @(posedge clk)すべてのクロックエッジで自動的に実行されません。 alwaysブロックは、現在の実行の最後に達したら再起動できます(同時に2つのスレッドでブロックを実行することはできません)。あなたのalwaysブロックは、あなたの(リピートサイクル)ループでスタックされているので、8クロック後までendに到達しません。 8ポーズクロック後にのみ、ループを終了し、alwaysブロックの最後をヒットし、次のポゼッジで再スタートすることができます。

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

  3. $ディスプレイは、おそらく32ビットの10進数の最大値を出力するのに十分な領域を予約しています。余分な空白をすべて残さない場合は、%dの代わりに%0dを試してください。

+0

ありがとう、ここに私の初めての投稿と私は、verilogセクションはあまりアクティブではないと心配していた。 1)実行は '@(posedge clk)$ display("%d \ ti =%d "、$ time、i);'また、これはどのように論理に合成されますか? 2)入力を回路に配線する標準的な方法はどちらですか?私は割り当てと常に両方とも手続き型コードのブロックであると思ったが、ハードワイヤリングはゲートレベルのもののように見える。 –

+0

@ChrisMorinおそらくほとんどのセクションよりもアクティブではありませんが、ほとんどの質問は少なくとも1つまたは2つの回答を得ているようです。はい、実行は表示行で一時停止します。 @(posedge clk)とは、単に「時計の正の端まで待ってから、次の文を実行する」という意味です。私は正確にどのように 'これは合成された'と答えているかわからない...私はあなたの出力に似て8ビットまで実行し、その後繰り返すカウンタを作成すると思います。入力をハードワイヤリングする方法に関しては、DUTのポートを一定値に設定するassign文には何も問題ありません。 – Tim