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番目の出力には奇妙な間隔がありますか?
ありがとうございます。
ありがとう、ここに私の初めての投稿と私は、verilogセクションはあまりアクティブではないと心配していた。 1)実行は '@(posedge clk)$ display("%d \ ti =%d "、$ time、i);'また、これはどのように論理に合成されますか? 2)入力を回路に配線する標準的な方法はどちらですか?私は割り当てと常に両方とも手続き型コードのブロックであると思ったが、ハードワイヤリングはゲートレベルのもののように見える。 –
@ChrisMorinおそらくほとんどのセクションよりもアクティブではありませんが、ほとんどの質問は少なくとも1つまたは2つの回答を得ているようです。はい、実行は表示行で一時停止します。 @(posedge clk)とは、単に「時計の正の端まで待ってから、次の文を実行する」という意味です。私は正確にどのように 'これは合成された'と答えているかわからない...私はあなたの出力に似て8ビットまで実行し、その後繰り返すカウンタを作成すると思います。入力をハードワイヤリングする方法に関しては、DUTのポートを一定値に設定するassign文には何も問題ありません。 – Tim