2013-07-15 209 views
2

我有一個高速緩存內存模塊,我希望字可尋址但具有字節寫入使能信號。For循環始終阻止

always @ (posedge clk) begin 
    //stuff... 
    if(write) begin 
     //Word accessible only 
     //memData[lastInIndex][lastInOffset] <= lastWriteData; 

     //Supporting byte accessible 
     if(lastWrEn[0]) 
      memData[lastInIndex][lastInOffset][7:0] <= lastWriteData[7:0]; 
     if(lastWrEn[1]) 
      memData[lastInIndex][lastInOffset][15:8] <= lastWriteData[15:8]; 
     if(lastWrEn[2]) 
      memData[lastInIndex][lastInOffset][23:16] <= lastWriteData[23:16]; 
     if(lastWrEn[3]) 
      memData[lastInIndex][lastInOffset][31:24] <= lastWriteData[31:24]; 
    end 
    //more stuff... 
end 

如果我正在寫一個字到內存中,我可以指定哪些字節應該被忽略,哪些字節應該被寫入每個字中。我測試了這個代碼,它模擬得很好。我想參數化一個字中有多少個字節(在64位的情況下,每個字現在有8個字節)。我不希望複製和粘貼更多幾乎相同的行,而是希望有一些for循環來實例化我的邏輯。

always @ (posedge clk) begin 
    //stuff... 
    if(write) begin 
     //Word accessible only 
     //memData[lastInIndex][lastInOffset] <= lastWriteData; 

     //Supporting byte accessible 
     begin : BYTE_SELECTION_GENERATE 
      integer i; 
      for(i=0; i<bytesPerWord; i=i+1) 
       if(lastWrEn[i]) 
        memData[lastInIndex][lastInOffset][i*8+7:i*8] <= lastWriteData[i*8+7:i*8]; 
     end 
    end 
    //more stuff... 
end 

我有一個名爲wordSize參數,用於指定每個字有多少位含有(通常爲32或64)。還有另一個參數是parameter bytesPerWord = wordSize/8。當我嘗試編譯這個版本時,我收到一個錯誤,說i is not a constant。我也嘗試過genvargenerate,但是這些都是不允許的。有沒有一種方法可以根據bytesPerWord參數生成我想要的硬件,或者我將不得不依賴一串醜陋的`ifdef語句?

回答

4

誤差i is not a constant你得到是因爲Verilog的不允許部分與用於範圍(net[i:j])的上和下限值的動態值選擇,因爲這將允許在總線的比特的數量來動態地改變,這在硬件上是不可能的。

以來的位數的特殊情況

然而被選擇的是永遠不變,你可以使用索引部分選擇運營商,它看起來像:

memData[lastInIndex][lastInOffset][i*8 +: 8];

這不相同你正在嘗試做的事情(從i * 8開始選擇8位),但它使用一個特殊的操作符來完成它。

+0

現在*有*是一個模糊的語法,沒有記錄在我讀過的任何教程中! lol tyvm – Suedocode

+0

這在技術上是Verilog2001的一個特性,所以它可能不是很老的教程的一部分。 – Tim