传递向量并对其执行操作会导致 X

Passing a vector and performing operations on it results in X

这是我要实现的模块。我想要做的是,接收一个矢量,比如 2 位宽,有 4 个元素,我将其线性化并从测试平台传递到 test_module1。现在我想对其进行去线性化并对其执行一些组合操作以获得基于 Rosenbrock 函数的适应度值。但是,我得到的适应度值为 XX。

我无法理解这里的问题。

module test_module1 ( x, fitness);
    input   [4*2 -1:0]  x;  
    output  [1:0]   fitness;

    wire [1:0] x_i;
    wire [1:0] x_im1;
    wire [1:0] fitness_val = 2'b00;
    wire [3:0] a;
    wire [3:0] b;
    wire [1:0] x_array1 [3:0];
    
    genvar k;
    assign fitness = fitness_val;
    genvar j;
    
    generate
      for (j =0 ; j <4 ; j = j+1) begin
          assign x_array1[j] = x[2*j +: 2];
      end
    

      for (k=1; k<4; k=k+1) begin
            assign x_i      = x_array1[k];
            assign x_im1    = x_array1[k-1];
            assign a = 100*(x_i[1:0] - x_im1[1:0])*(x_i[1:0] - x_im1[1:0]);
            assign b = (1 - x_im1[1:0])*(1 - x_im1[1:0]);
            assign fitness_val = fitness_val + a[2:1] + b[2:1];
        end
    endgenerate 
endmodule

测试平台:

module tb_tm1();
  wire  [1:0]   fitness;
  wire [4*2-1:0] x_array;
  
  test_module1 tm1(x_array, fitness);
  
  assign x_array = 8'b11100100;
  
endmodule

我得到的输出是这样的:

X(未知值)的原因是由于多个驱动程序争用同一信号。

例如,信号 fitness_val 有 5 个驱动程序。第一行是:

wire [1:0] fitness_val = 2'b00;

这是一个连续赋值,这意味着模拟器总是试图将其驱动到0。其他4个驱动程序来自for k循环:

assign fitness_val = fitness_val + a[2:1] + b[2:1];

如果您要手写循环,您将有 4 行相同的 assign 行。 fitness_val 应该只有 1 个驱动程序,而不是 5 个。

您在那个 for 循环中有所有 5 个信号的多个驱动程序。

assign fitness_val 行的另一个问题是它创建了一个组合循环。您不应在连续作业的左轴和右轴上同时显示 fitness_val