2017-01-04 54 views
0

先生, 我有一些關於總是塊內循環的懷疑。請澄清我。所有迭代都在單個時鐘週期完成?當循環內部的循環內部始終阻塞時會發生什麼? 請幫我找錯在下面的programm.Thank您for循環裏面始終posedge時鐘

reg [5:0] c; 
reg [2:0] m; 
reg G[5:0][2:0] = {{1'b1,1'b0,1'b0},{1'b0,1'b1,1'b0},{1'b0,1'b0,1'b1}, {1'b1,1'b1,1'b0},{1'b0,1'b1,1'b1},{1'b1,1'b0,1'b1}}; 
integer i; 
integer j; 
always @(posedge clk1) 
begin 
    for(i=0;i<6;i=i+1) 
     begin 
      c[i]=0; 
      for(j=2;j>=0;j=j-1) 
       begin 
        c[i] <= c[i]^(m[j]&G[2-j][i]); 
       end 
     end 
end 
+0

你的代碼看起來像一個'C'代碼。切勿以HDL編寫任何代碼作爲軟件代碼。首先,你應該考慮硬件,你想創建,然後你應該相應的編碼。這裏有什麼設計? –

回答

0

想到一個always塊爲一體的軟件一點點那款硬件的一點點。 靈敏度列表是觸發器列表,當它們中的任何一個發生變化時,軟件會執行以計算新輸出應該是什麼。

對於組合always塊中的所有輸入都在靈敏度列表(使用@(*)構建體),因此,如果任何輸入的變化,硬件的那一點的輸出可能會改變(組合邏輯的相當多的定義)。因此,如果任何輸入發生變化,軟件將執行以計算組合邏輯的新輸出結果。

對於連續always塊,只有時鐘和(如果存在)異步復位在靈敏度列表中,因爲沒有其他輸入直接導致輸出發生變化。因此,對於順序模塊,如果時鐘(或異步復位)發生改變,那麼軟件會執行以計算該少量順序邏輯的新輸出。

所以,在你的情況下,你有一個連續的always沒有異步復位。這是一些模擬一點點順序邏輯的軟件。此時序邏輯的輸出僅在時鐘改變時纔會改變(如果clk1上有一個上升沿)。因此,如果clk1上有上升沿,always塊內的代碼開始執行,以便計算數組c的新值將會是什麼(您的時序邏輯的輸出,因爲這是變量分配給這個特定的always塊)。在這個特定的代碼中碰巧存在循環這一事實並不重要。如果clk1上有一個上升沿,那麼這些循環將完全執行(無需等待clk1上的更多上升沿),以便計算c的新值。