#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
, что цикл — ваш лучший вариант.