1
我正在嘗試實現一個可合成的 verilog模塊,它產生2個向量/數組的向量乘積,每個向量包含八個16位無符號整數。 Design Compiler報告錯誤symbol i must be a constant or parameter
。我不知道如何解決它。這是我的代碼。Verilog矢量內部產品
module VecMul16bit (a, b, c, clk, rst);
// Two vector inner product, each has 8 elements
// Each element is 16 bits
// So the Output should be at least 2^32*2^3 = 2^35 in order to
// prevent overflow
// Output is 35 bits
input clk;
input rst;
input [127:0] a,b;
output [35:0] c;
reg [15:0] a_cp [0:7];
reg [15:0] b_cp [0:7];
reg [35:0] c_reg;
reg k,c_done;
integer i;
always @ (a)
begin
for (i=0; i<=7; i=i+1) begin
a_cp[i] = a[i*15:i*15+15];
end
end
always @ (b)
begin
for (i=0; i<=7; i=i+1) begin
b_cp[i] = b[i*15:i*15+15];
end
end
assign c = c_reg;
always @(posedge clk or posedge rst)
begin
if (rst) begin
c_reg <= 0;
k <= 0;
c_done <= 0;
end else begin
c_reg <= c_done ? c_reg : (c_reg + a_cp[k]*b_cp[k]);
k <= c_done ? k : k + 1;
c_done <= c_done ? 1 : (k == 7);
end
end
endmodule
正如你所看到的,我想通過一個循環來複制a
到a_cp
,這是做正確的方式?
如果是的話,我應該如何定義它i
並且常量可以用作for循環中的步進器?
該索引可能應該由'i * 16'移位,否則切片之間會有重疊。我建議在'+:'之前和之後加上空格以使其脫穎而出:'a [i * 15 +:16];' – Greg