поддержка портов многомерного массива в icarus verilog - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь использовать многомерные массивы в качестве портов в моем коде системного журнала. верхний модуль является трехмерным массивом, тогда как подмодуль является двумерным. Упрощенный тестовый стенд и дизайн выглядят следующим образом:

  module TB();

      wire  [3:0]d_inAll  [0:99][0:9];
      wire  [3:0]d_outAll [0:99][0:9];

      genvar iX;
      for (iX=0; iX<100; iX=iX+1)begin
           someDesign DUT_i(.d_in(d_inAll[iX]) , .d_out(d_outAll[iX]));
      end

   endmodule

и проект

module someDesign(input wire [3:0] d_in[0:9],
                  output wire[3:0] d_out [0:9]);

  genvar i;
  for (i=0; i<10; i=i+1)begin
    assign d_out[i] = d_in[i];
  end

endmodule 

Я пытался скомпилировать этот код с версиалогом icarus, но он завершился неудачно со следующей ошибкой.

../elaborate.cc:1439: failed assertion rval_net->pin_count() == prts[0]->pin_count()

Это ошибка компилятора или какая-то функция еще не поддерживается? Есть ли другой метод, который я мог бы использовать, чтобы обойти проблему? Я знаю, что могу использовать массивы, но я бы предпочел не использовать их, так как это сделает дизайн более подверженным функциональным ошибкам.

1 Ответ

2 голосов
/ 25 апреля 2020

Это ошибка, поэтому она не поддерживается. Кажется, он поддерживает одномерные распакованные порты массива, поэтому вы можете переместить одно из измерений массива в сторону упакованного.

module TB();

      wire  [0:9][3:0]d_inAll  [0:99];
      wire  [0:9][3:0]d_outAll [0:99];

      genvar iX;
  for (iX=0; iX<100; iX=iX+1)begin : fiX
           someDesign DUT_i(.d_in(d_inAll[iX]) , .d_out(d_outAll[iX]));
      end

   endmodule

module someDesign(input wire [0:9][3:0] d_in,
                  output wire[0:9][3:0] d_out);

  genvar i;
  for (i=0; i<10; i=i+1)begin
    assign d_out[i] = d_in[i];
  end
endmodule
...