在generate块for循环中实例化模块时可否通过if修改不同实例的端口连接
解答
你说的用法是支持的,但是你贴的示例代码语法写错了,不能把if分支直接放在模块实例的端口列表内部,调整写法就能实现你要的效果。
错误点说明
你当前的代码把if...else逻辑直接写进了模块实例的端口连接列表里,不符合Verilog的语法规则,编译时会直接报错。
正确实现方式
写法1:三目运算符直接映射(最简洁,适合你当前的场景)
直接在端口连接的位置用三目运算符做条件判断,修改后的完整代码如下:
genvar g_i; generate for (g_i = 0; g_i < PWLINK_NUM; g_i++) begin : pwrlink pdndlvrlnlpwrlinkvert_cbb pdndlvrlnlpwrlink_cbb( .dftmeasen(g_i == 0 ? pwr_dftmeasen : 1'b0), // 直接用三目做条件判断 .bldr_en(bldr_en[g_i]), .bldr_mode(bldr_mode[g_i]), .bldr_strength(bldr_strength[g_i]), .hven(hvenout[g_i]), .legacy_mode_en(legacy_mode_en[g_i]), .force_on(force_on[g_i]), .pwrup(pwrup[g_i]) // 其余未列端口按需求正常补充即可 ); end endgenerate
写法2:generate块内条件分支写全实例(适合多端口同时修改的复杂场景)
如果有多个端口需要根据g_i的值调整连接,可以把完整的模块实例写在if...else分支里:
genvar g_i; generate for (g_i = 0; g_i < PWLINK_NUM; g_i++) begin : pwrlink if (g_i == 0) begin pdndlvrlnlpwrlinkvert_cbb pdndlvrlnlpwrlink_cbb( .dftmeasen(pwr_dftmeasen), .bldr_en(bldr_en[g_i]), .bldr_mode(bldr_mode[g_i]), .bldr_strength(bldr_strength[g_i]), .hven(hvenout[g_i]), .legacy_mode_en(legacy_mode_en[g_i]), .force_on(force_on[g_i]), .pwrup(pwrup[g_i]) ); end else begin pdndlvrlnlpwrlinkvert_cbb pdndlvrlnlpwrlink_cbb( .dftmeasen(1'b0), .bldr_en(bldr_en[g_i]), .bldr_mode(bldr_mode[g_i]), .bldr_strength(bldr_strength[g_i]), .hven(hvenout[g_i]), .legacy_mode_en(legacy_mode_en[g_i]), .force_on(force_on[g_i]), .pwrup(pwrup[g_i]) ); end end endgenerate
两种写法最终实现的效果完全一致:索引为0的模块实例dftmeasen端口接pwr_dftmeasen信号,其余实例的dftmeasen端口都接固定低电平,其他端口的连接逻辑不受影响。
内容的提问来源于stack exchange,提问作者yuval
相关产品推荐
相关产品推荐

