Как переписать этот код с помощью выражения Generate?
У меня есть код Verilog, который выглядит примерно так.
module top (
.
.
input a_2;
input a_1;
input a_0;
);
bottom I_bottom(
.
.
.a(a_2);
);
bottom I_bottom_2(
.
.
.a(a_2);
);
bottom I_bottom_1(
.
.
.a(a_1);
);
bottom I_bottom_0(
.
.
.a(a_0)
);
endmodule
Как мне написать этот код, используя generate
заявление? Обратите внимание, что входы в top
фиксируются в top
, Я не могу изменить это на массив, как a[2:0]
,
2 ответа
Создайте вектор для приравнивания к отдельным проводам порта. Тогда используйте generate
и индексировать вектор для каждого сигнала. Это работает одинаково для входов или выходов.
Вы должны построить вектор вручную, но от конвертации куда-то не уйдет из-за первоначального требования сохранить имена отдельных портов. По крайней мере, это делается только один раз и делается кратко.
module top (
.
.
input a_2;
input a_1;
input a_0;
);
wire [4:0]vec_a = {a_4, a_3, a_2, a_1, a_0};
generate genvar i;
for(i=0; i<5; i=i+1) begin
bottom I_bottom(
.
.
.a(vec_a[i]);
);
end
endgenerate
endmodule
Просто чтобы сделать явное предложение @toolic, сделанное в комментарии, вы можете написать массив экземпляров следующим образом:
module top (
input a_3,
input a_2,
input a_1,
input a_0
);
bottom I_bottom[3:0] (
.a({a_3,a_2,a_1,a_0})
);
endmodule
Обратите внимание, что я переименовал ваш экземпляр I_bottom
в I_bottom[3]
и подключил его к входу a_3
не a_2
, Я не уверен, что вы намеревались нарушить схему там.
Я понимаю, что это не отвечает на поставленный вопрос, так как не использует generate
заявление. Я думаю, что мне нравится решение, которое использует generate
лучше.