2012-03-31 140 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; 在第二個模塊,但它不會工作。爲什麼不?

第二個是什麼與輸出中的奇怪間距?

謝謝你的時間。

回答

4
  1. always @(posedge clk)不會在每個時鐘沿自動執行。 always塊一旦到達其當前執行的末尾就只能重新啓動(不能同時有兩個線程執行塊)。直到8個時鐘之後,您的始終阻止纔會達到end,因爲它滯留在您的(重複循環)循環中。只有在8個posedge時鐘之後才能完成循環,命中always塊的結尾,然後在下一個posedge上重新開始。

  2. start <= 1'b1是一個非阻塞賦值,只能在always塊內執行。

  3. $顯示可能保留足夠的空間來打印32位小數的最大值。如果您不希望所有額外空間嘗試使用%0d而不是%d

+0

謝謝,我第一次在這裏發帖,我擔心verilog部分不會很活躍。 1)所以執行掛在'@(posedge clk)$ display(「%d \ ti =%d」,$ time,i);'?另外,這是如何合成邏輯? 2)硬輸入電路的標準方式是什麼?我認爲分配和總是程序代碼塊,但我認爲硬連線更像是門級的事情。 – 2012-04-01 04:04:15

+0

@ChrisMorin它可能不如大多數部分活躍,但大多數問題看起來像他們至少得到一個或兩個答案。是的,執行在顯示行上暫停。 @(posedge clk)意味着「在此等待,直到時鐘的正沿,然後運行下一條語句」。我不確定如何回答'這是如何合成的'...我想它會創建一個計數器,運行多達8位,然後重複,類似於您的輸出。至於如何硬連接輸入,分配語句將DUT上的端口設置爲常數值沒有任何問題。 – Tim 2012-04-01 06:35:56