Как сделать логическую операцию для каждого экземпляра в векторе экземпляров - PullRequest
0 голосов
/ 10 апреля 2019

Скажем, у меня есть модуль со входами 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 провода и перехватить этов качестве входных данных, я знаю, что мог бы сделать это, используя оператор создания:

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)
)

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

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

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

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

1 Ответ

0 голосов
/ 10 апреля 2019

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

...