verilog / systemverilog通过生成的模块层次结构向上传递参数

时间:2018-09-16 07:50:07

标签: parameters verilog system-verilog hdl

具有复杂的模块层次结构(许多模块在generate下实例化)我需要从每个低级模块中获取一堆电线  变成一维数组

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 :(得分:0)

我在EDAPlayground的多个不同工具上尝试了parameter HL_MODULE_PARAMETER = ll_module.LL_MODULE_PARAMETER,只有其中一个对这种语法感到满意。其他所有人都抱怨右边的值不是一个常量表达式。我认为根据LRM模块,路径表达式不被视为常量表达式(即使它们是常量表达式),因此错误消息将符合LRM。作为此声明的参考,请查看constant_expression生成和module_path_expression上的 A.8.3表达式

您正在使用的工具似乎更宽松,因为它允许在参数分配的右侧进行简单的模块路径表达式,这些表达式不会经过生成,但不允许后者。我不确定您是否会找到满足您其他条件的解决方案会很幸运(避免从上到下预先计算参数值)。