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
我已经用 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