2015-04-06 37 views
0

我對下面的代碼有問題。該代碼在ISE 14.2中進行了綜合。如何通過for-variable索引for循環中的reg或內存?

input [1:8176] m_d_in; 
reg [1:511] m_d [1:16]; 
integer i; 

always @ (*) 
    begin 
    for (i=0; i<16; i=i+1) 
     begin 
     m_d[i+1] = m_d_in[ 1+511*i : 511+511*i]; 
     end 
    end 

合成後,此錯誤顯示出來:
HDL編譯器:1660_ <誤差線>「CodeName.v> <的地址」:程序分配到非寄存器I是不允許的,左手側應REG /整數/時間/ genvar
錯誤的行是指這樣的:

reg [4:0] i; 
0123:

m_d[i+1] = m_d_in[ 1+511*i : 511+511*i]; 

我也使用測試

genvar i; 

代替:

integer i; 

,並得到了完全同樣的錯誤我上面寫的!
我知道有一個解決方案通過使用案例而不是上面的代碼,但對我來說它不是正確的解決方案。
非常感謝。

回答

1

既然你是範圍是一致的,Indexing vectors and arrays with +:也是可能的:

always @* begin 
    for (i=0; i<16; i=i+1) 
    m_d[i+1] = m_d_in[511*i+1 +: 511]; 
end 

的索引部分選擇(+:/-:)和generate塊(來自Morgan的回答)在IEEE標準1364-2001中引入。任何現代模擬器和合成器都將支持它們。

0

如果您使用wire而不是reg,那麼可以將一個賦值行包裝在一個生成中。

module tb(
input [1:8176] m_d_in 
); 
wire [1:511] m_d [1:16]; 

genvar i; 

generate 
    for (i=0; i<16; i=i+1) begin 
    assign m_d[i+1] = m_d_in[ 1+511*i : 511+511*i]; 
    end 
endgenerate 

endmodule 

爲了保持reg和使用產生你需要做的:

module tb(
input [1:8176] m_d_in 
); 
reg[1:511] m_d [1:16]; 

genvar i; 

generate 
    for (i=0; i<16; i=i+1) begin 
    always @* begin 
     m_d[i+1] = m_d_in[ 1+511*i : 511+511*i]; 
    end 
    end 
endgenerate 

endmodule