有一个复杂的模块层次结构(其中许多模块在生成下实例化)我需要从每个低级模块获得一堆连线到一维数组。
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
我在EDAPlayground上的多个不同工具上尝试了parameter HL_MODULE_PARAMETER = ll_module.LL_MODULE_PARAMETER
,其中只有一个对这种语法感到满意。所有其他人都抱怨右边的价值并不是一个常数。我认为根据LRM模块,路径表达式不被认为是常量表达式(即使它们类似),因此错误消息将符合LRM。作为这一主张的参考,请参阅constant_expression
生产和module_path_expression
的A.8.3表达式。
你正在使用的工具似乎更宽松,因为它允许简单的模块路径表达式,不通过生成,在参数赋值的右侧,但不允许后者。我不确定你会找到满足你的其他条件的解决方案(避免从上到下预先计算参数值)。