Как выполнить логическую операцию для каждого экземпляра в векторе экземпляров

#verilog #system-verilog

#verilog #система-verilog

Вопрос:

Допустим, у меня есть модуль с вводом N битов и одного бита, который я создаю следующим образом:

 module foo (
   input wire [N-1:0] x,
   input wire y
);

foo u__foo (
    .x(x),
    .y(x == something)
);
  

И я хочу создать M их в виде вектора и подключить провод с M*N битами, я знаю, что могу сделать это так:

 wire [M*N-1:0] x;

foo u__foo [M-1:0] (
   .x(x)
)
  

Но я хочу выполнить логическую операцию над каждым N битом M*N провода и подключить его также в качестве входных данных, я знаю, что мог бы сделать это, используя оператор generate:

 genvar i;
generate
    for (i = 0; i < M; i = i   1) begin
         foo u__foo (
            .x(x[i*N  : N]),
            .y(x[i*N  : N] == something)
         )
    end
endgenerate
  

Или путем вычисления его в цикле и подключения к нему:

 reg [M-1:0] y;
always @* begin
    for (i = 0; i < M; i = i   1) begin
        y[i] = x[i*N  : N] == something;
    end
end

foo u__foo [M-1:0] (
   .x(x),
   .y(y)
)
  

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

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

 foo u_foo [M-1:0] (
    .x(x),
    .y(x[N-1:0] == something)
)
  

Заранее спасибо!

Комментарии:

1. единственный синтаксический сахар, который приходит на ум в этом случае, — это оператор concat {} для чего- то (или аналогично упакованной структуры).

Ответ №1:

Нет. Вы можете манипулировать порядком битов с помощью потоковых операторов, но я думаю generate , что цикл — ваш лучший вариант.