我是Verilog的新手,所以我什至不确定我是否正确使用了语法。我需要将每个8位的2条输入总线相乘。我试图只用一根线就得到每个8×1的结果,更像是连接8个结果(每8×1乘法一个)。
module m8bit(
input reg[7:0]A,
input reg[7:0]B);
wire [63:0] P;
genvar i,j;
integer k=0;
for(i=0; i<8; i=i+1) begin
for(j=0; j<8; j=j+1)begin
P[k]=(A[i])*(B[j]);
k<=k+1;
end
end
如您所见,我使用genvar i
和j
来迭代总线的数字,但是由于需要在一根导线[63:0]P
中获得所有结果,我可以t使用i
或j
(在循环重新开始时会重置)。当我尝试编译时,出现以下错误:
** Error: (vlog-13069) mult8bit.v(21): near "[": syntax error, unexpected '['.
** Error:mult8bit.v(21): (vlog-13205) Syntax error found in the scope following 'P'.
Is there a missing '::'?
答案 0 :(得分:0)
一些东西。
当您说A[i] * B[j]
时,每个数组选择器都会从输入中选择一个位。结果被分配给P[k]
的单个位。我认为这不是您真正想要的。因此,首先处理变量的声明。
verilog中的所有操作只能在procedural
块内进行,例如always
块,或作为连续赋值的结果,即assign
语句。因此,在您的情况下,您需要对assign
使用P
(因为P
是 wire ):assign P[k] = A[i]* B[j]
;
由于您在generate
中使用了genvars
块来生成verilog语句,因此您不能以这种方式使用k
。您不能在generate
块中修改变量。 Verilog语法也不允许您对genvars进行独立分配。但是您可以在索引中使用表达式,即P[i * 8 + j]
,这可能是最简单的方法。
因此,这是一个可编译的示例:
module m8bit(
input reg[7:0]A[8],
input reg[7:0]B[8],
output wire [16:0] P[64]);
genvar i,j;
for(i=0; i<8; i=i+1) begin
for(j=0; j<8; j=j+1)begin
assign P[i * 8 + j]=(A[i])*(B[j]);
end
end
endmodule