我剛剛開始學習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; 在第二個模塊,但它不會工作。爲什麼不?
第二個是什麼與輸出中的奇怪間距?
謝謝你的時間。
謝謝,我第一次在這裏發帖,我擔心verilog部分不會很活躍。 1)所以執行掛在'@(posedge clk)$ display(「%d \ ti =%d」,$ time,i);'?另外,這是如何合成邏輯? 2)硬輸入電路的標準方式是什麼?我認爲分配和總是程序代碼塊,但我認爲硬連線更像是門級的事情。 – 2012-04-01 04:04:15
@ChrisMorin它可能不如大多數部分活躍,但大多數問題看起來像他們至少得到一個或兩個答案。是的,執行在顯示行上暫停。 @(posedge clk)意味着「在此等待,直到時鐘的正沿,然後運行下一條語句」。我不確定如何回答'這是如何合成的'...我想它會創建一個計數器,運行多達8位,然後重複,類似於您的輸出。至於如何硬連接輸入,分配語句將DUT上的端口設置爲常數值沒有任何問題。 – Tim 2012-04-01 06:35:56