Verilog表达式的计算结果为“x”
我正在用Verilog编写矩阵乘法模块,遇到了一个问题,表达式的计算结果是一堆“xxxx”:Verilog表达式的计算结果为“x”,verilog,Verilog,我正在用Verilog编写矩阵乘法模块,遇到了一个问题,表达式的计算结果是一堆“xxxx”: // multiplies 5x32 matrix by 32x5 matrix module matmul(input [4959:0] A, input [4959:0] B, output reg [799:0] out); integer i,j,k; integer start = 0; reg [31:0] placeholder_A [4:0][31:0];
// multiplies 5x32 matrix by 32x5 matrix
module matmul(input [4959:0] A, input [4959:0] B, output reg [799:0] out);
integer i,j,k;
integer start = 0;
reg [31:0] placeholder_A [4:0][31:0];
reg [31:0] placeholder_B [31:0][4:0];
reg [31:0] placeholder_out [4:0][4:0];
always @(A or B) begin
// initialize output to zeros
for (i=0; i<800; i=i+1)
out[i] = 0;
// initialize placeholder output to zeros
for (i=0; i<5; i=i+1)
for(j=0; j<5; j=j+1)
placeholder_out[i][j] = 32'd0;
// turn flat vector A array into matrix
for (i=0; i<5; i=i+1)
for(j=0; j<32; j=j+1) begin
placeholder_A[i][j] = A[start +: 31];
start = start + 32;
end
start = 0;
// turn flat vector B array into matrix
for (i=0; i<32; i=i+1)
for(j=0; j<5; j=j+1) begin
placeholder_B[i][j] = B[start +: 31];
start = start + 32;
end
start = 0;
// do the matrix multiplication
for (i=0; i<5; i=i+1) // A.shape[0]
for(j=0; j<5; j=j+1) // B.shape[1]
for(k=0; k<32; k=k+1) // B.shape[0] or A.shape[1]
placeholder_out[i][j] = placeholder_out[i][j] + (placeholder_A[i][k]*placeholder_B[k][j]); // this is where I am having problems
start = 0;
// flatten the output
for (i=0; i<5; i=i+1)
for(j=0; j<5; j=j+1) begin
out[start] = placeholder_out[i][j];
start = start + 1;
end
end
endmodule
占位符_out变量,因此out输出被评估为'xx…xxx',我无法理解为什么。通过测试台检查信号时,占位符A和占位符B都包含有效值。任何帮助都将不胜感激。
您可以在这里运行测试台:我从代码片段中观察到的一些事情。首先,输入没有足够的宽度。所需宽度为32*5*5=5120。所以我们需要5120位的输入向量输入[5119:0]A,输入[5119:0]B。一个linting工具可能已经发现了这个问题 其次,需要在计算开始时将start初始化为零。这将避免在开始时锁定,并将从A的第零个索引计算,并避免X进一步传播
always @(A or B) begin
//...
start=0;
我建议使用always_梳,而不是手动灵敏度,但这是一个问题
作为旁注,根据我的理解,给定的代码片段将创建大型组合硬件。您可能需要检查不同网络上的合成结果是否存在计时冲突,并应用一些替代逻辑。这意味着变量计算中涉及的某些内容尚未初始化为正确的值。您需要通过转储放弃表单、添加可用的打印语句或通过其他方式调试模拟。为您的测试台提供代码也是一个好主意。@Serge,testbench应该在链接中提供