Передайте срез одномерного массива двухмерного массива через модуль в systemverilog

У меня есть модуль с именем module2, который имеет двумерный распакованный массив для ввода и вывода. Я хочу передать каждый столбец ввода и вывода модулю module1. Я пробовал писать код следующим образом. Но он показывает синтаксическую ошибку в .xin(xin[0:7][i]).
Каким будет правильный синтаксис для передачи фрагмента массива через модуль?

module module2 #(parameter n=20) (input signed [n-1:0] xin [0:7][0:7],
                            output signed [n-1:0] xout [0:7][0:7]);

genvar i;
generate
for (i=0;i<=7;i=i+1) begin:block1
module1 #(.n(n)) l1(.xin(xin[0:7][i]),.xout(xout[0:7][i]));
endgenerate
endmodule

module module1 #(parameter n=10) (input signed [n-1:0] xin [0:7],
                                  output signed [n-1:0] xout [0:7]);
...
..

person Snigdha203    schedule 16.09.2015    source источник
comment
Разве порты module1 не должны быть [n-1:0] sig [0:7] вместо [n-1:0] sig [0:7][0:7]?   -  person Greg    schedule 16.09.2015
comment
да. извините, теперь я исправил сообщение. Тем не менее вопрос в силе.   -  person Snigdha203    schedule 16.09.2015


Ответы (2)


.xin(xin[0:7][i]) не является допустимым синтаксисом для индексации массива. Вы можете сделать .xin(xin[i][0:7]) или .xin(xin[i]).

Вы можете расширить массив, чтобы получить [0:7] всего первого индекса из определенного второго индекса:

.xin({xin_rotate[0][i],xin_rotate[1][i],xin_rotate[2][i],xin_rotate[3][i],
      xin_rotate[4][i],xin_rotate[5][i],xin_rotate[6][i],xin_rotate[7][i]})

Или создайте другой массив для вращения:

always_comb begin
  foreach(xin[idx0,idx1]) begin
    xin_rotate[idx1][idx0] = xin[idx0][idx1];
  end
  foreach(xout[idx0,idx1]) begin // rotate back
    xout[idx0][idx1] = xout_rotate[idx1][idx0];
  end
end
for (i=0;i<=7;i=i+1) begin : block1
  module1 #(.n(n)) l1(.xin(xin_rotate[i]),.xout(xout_rotate[i]));
end : block1
person Greg    schedule 16.09.2015
comment
Этот код отлично работает в VCS. Но когда я попытался запустить его в среде Design Vision, он сказал Конструкция 'foreach' is not supported. Мне нужно добавить genvar или что-то в этом роде, чтобы сделать его синтезируемым? - person Snigdha203; 17.09.2015
comment
По какой-то причине некоторые синтезаторы еще не добавили поддержку foreach. На данный момент вам нужно использовать двойной цикл for. Если можете, отправьте запрос на добавление функции в будущую версию. - person Greg; 17.09.2015

SystemVerilog позволяет выбирать только части (срез), которые ссылаются на группу соседних битов. Вам нужно будет добавить некоторую комбинационную логику для преобразования массива, проходящего через порты.

for (genvar i=0;i<=7;i++) begin:block1
 logic signed [n-1:0] _xin[0:7], _xout[0:7];
 always_comb foreach(_xin[j]) __xin[j] = xin[j][i];
 always_comb foreach(_xout[j])  xout[j][i] = _xout[j];
 module1 #(.n(n)) l1(.xin(_xin),.xout(_xout));
end
person dave_59    schedule 16.09.2015