verilog中2矩阵的乘法

Multiplication of 2 matrix in verilog

我已经用 Verilog 编写了 matrx 乘法代码。

module multiply3x3(i1,i2,i3,i4,i5,i6,i7,i8,i9,j1,j2,j3,j4,j5,j6,j7,j8,j9,prod);

output reg [31:0]prod;

wire [7:0]resultant[3:0][3:0]; 
wire [7:0]a[3:0][3:0];
wire [7:0]b[3:0][3:0]; 

genvar i,j,k;

generate

for (i = 0; i <= 2; i=i+1) begin:i_
      for (j = 0; j <= 2; j=j+1) begin:j_
         assign resultant[i][j] = 8'd0;
         for (k = 0; k <= 2; k=k+1) begin:k_
            assign resultant[i][j] = resultant[i][j] + a[i][k] * b[k][j];
         end
      end
   end

endgenerate   

endmodule
initial begin
#100 prod = {resultant[0][0],resultant[0][1],resultant[0][2],resultant[1][0],resultant[1][1],resultant[1][2],resultant[2][0],resultant[2][1],resultant[2][2]};
end

这是乘法发生的地方,但我无法得到它的输出。

我做错了什么? 考虑正确声明 a,b。

累积 (a = a + p) 不适用于电线。类型 wire 应该模拟物理线。

您必须将变量 resultant 声明为 reg。在 Verilog 中,reg 类型在某些情况下可以像其他编程语言中的变量一样对待。 此外,您不能在线路或 reg 上多次使用 assign 语句(就像您在 https://pastebin.com/txrcwUBd 的第 78 行和第 80 行中所做的那样)。您应该使用 always(而不是 generate)块来执行此类操作。

更正的 Verilog:

reg [7:0] resultant[3:0][3:0];
int i, j, k;

always @(*)
   for(i=0; i<3; i=i+1)
      for(j=0; j<3; j=j+1) begin
         resultant[i][j] = 8'd0;
         for(k=0; k<3; k=k+1)
            resultant[i][j] = resultant[i][j] + (a[i][k]*b[k][j]);
      end