Имея сложную иерархию модулей (многие из которых создаются при генерации), мне нужно получить связку проводов от каждого из модулей низкого уровня
в одномерный массив.
parameter HL_MODULE_PARAMETER = ll_module.LL_MODULE_PARAMETER
Кажется, работает просто отлично, когда ll_module - простое создание экземпляра. Не тогда, когда генерируется ll_module .
Предварительный расчет параметров верхнего уровня сверху донизу исключен, поскольку иерархия очень сложна (не говоря уже о безобразии решения). В этой ситуации должен быть очень элегантный способ передачи информации о параметрах вверх по иерархии.
//-----------------------------------------------
module A #(
parameter WIDTH = 8) (
input x,
output y,
output[WIDTH-1:0] z);
endmodule // A
//-----------------------------------------------
module B #(
parameter WIDTH = 10) (
input x,
output y,
output[WIDTH-1:0] z);
endmodule // B
//-----------------------------------------------
module T #(
parameter MOD_TYPE = 1,
parameter WIDTH = MOD_TYPE ? g0.m.WIDTH : g1.m.WIDTH) (
input x,
output y,
output[WIDTH-1:0] z);
generate
if(MOD_TYPE == 1) begin : g0
A m(.x(x), .y(y), .z(z));
end else begin : g1
B m(.x(x), .y(y), .z(z));
end
endgenerate
endmodule
//-----------------------------------------------
Приведенный выше код компилируется без ошибок. Но симуляция завершается с сообщением:
Error: Illegal reference to a parameter below a generate construct: g0.m.WIDTH