verilog / systemverilog, передавая параметры вверх через сгенерированную иерархию модулей - PullRequest
0 голосов
/ 16 сентября 2018

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

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

1 Ответ

0 голосов
/ 16 сентября 2018

Я пробовал parameter HL_MODULE_PARAMETER = ll_module.LL_MODULE_PARAMETER на нескольких различных инструментах EDAPlayground, и только один из них был доволен этим синтаксисом. Все остальные жаловались, что значение справа не является постоянным выражением. Я думаю, что в соответствии с модулем LRM выражения пути не считаются константными выражениями (даже если они и есть), поэтому сообщения об ошибках будут соответствовать LRM. В качестве ссылки для этого утверждения, посмотрите в выражении A.8.3 на производство constant_expression и module_path_expression.

Инструмент, который вы используете, кажется более гибким, так как он позволяет простые выражения пути модуля, которые не проходят, генерирует справа от назначения параметра, но запрещает последнее. Я не уверен, что вам повезет найти решение, которое удовлетворяет вашим другим условиям (избегайте предварительного вычисления значений параметров сверху вниз).

...