在Verilog中增加变量以索引导线(使用循环)

时间:2019-03-03 01:56:09

标签: verilog

我是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 ij来迭代总线的数字,但是由于需要在一根导线[63:0]P中获得所有结果,我可以t使用ij(在循环重新开始时会重置)。当我尝试编译时,出现以下错误:

** 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 '::'?

1 个答案:

答案 0 :(得分:0)

一些东西。

  1. 当您说A[i] * B[j]时,每个数组选择器都会从输入中选择一个位。结果被分配给P[k]的单个位。我认为这不是您真正想要的。因此,首先处理变量的声明。

  2. verilog中的所有操作只能在procedural块内进行,例如always块,或作为连续赋值的结果,即assign语句。因此,在您的情况下,您需要对assign使用P(因为P wire ):assign P[k] = A[i]* B[j];

    < / li>
  3. 由于您在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