Передача вектора и выполнение над ним операций приводит к X

avatar
GeekyScientist
1 июля 2021 в 18:40
49
1
3

Это модуль, который я пытаюсь внедрить. Что я хочу сделать, так это получить вектор, скажем, шириной 2 бита, имеющий 4 элемента, которые я линеаризую, и передать из тестового стенда в test_module1. Теперь я хочу делинеаризировать его и выполнить над ним некоторые комбинационные операции, чтобы получить значение пригодности на основе функции Розенброка. Однако я получаю значение пригодности как 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

Вывод, который я получаю, выглядит следующим образом: Output

Источник

Ответы (1)

avatar
toolic
1 июля 2021 в 18:57
2

Причина 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.

У вас есть несколько драйверов всех 5 сигналов в этом цикле for.

Еще одна проблема со строкой assign fitness_val заключается в том, что она создает комбинационный цикл. У вас не должно быть fitness_val как в левой, так и в правой части непрерывного назначения.