Verilog表达式的计算结果为“x”

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];

我正在用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];
    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应该在链接中提供