Скажем, у меня есть модуль со входами 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)
)
Заранее спасибо!