如何消除Vivado中未分配端口引发的ASSIGN-9 Lint违规?
解决Vivado中ASSIGN-9代码检查违规(未连接模块输出端口)
你的场景是:generate循环中实例化的最后一个test1模块,其next输出端口未连接任何信号,触发了Vivado的ASSIGN-9 lint违规提示,但你需要保留这个未连接的功能状态,仅消除lint告警。以下是几种可行的解决方案:
方法一:显式连接到标记为保留的悬空Wire
在test2模块内部声明一个带约束属性的wire,专门接收未使用的输出,告诉综合工具不要优化掉这个信号:
module test2 #( parameter param = 3 ) ( input clk, input first ); wire [0:param - 2] link; // 声明用于接收未使用输出的wire,添加约束防止被优化 (* dont_touch="true", keep="true" *) wire unused_next; genvar i; generate for (i = 0; i < param; i = i + 1) begin : test1_ test1 t1 ( .clk(clk), .prev(i ? link[i-1] : first), // 最后一个实例的next连接到悬空wire .next(i < param - 1 ? link[i] : unused_next) ); end endgenerate endmodule
这种方法通过显式连接消除端口未连接的问题,同时属性确保工具不会因该wire未使用而触发新告警。
方法二:在代码中精准屏蔽ASSIGN-9违规
利用Vivado支持的lint属性,仅对未连接的next端口屏蔽ASSIGN-9检查,不会影响其他代码的lint规则:
generate for (i = 0; i < param; i = i + 1) begin : test1_ test1 t1 ( .clk(clk), .prev(i ? link[i-1] : first), // 仅对当前端口屏蔽ASSIGN-9检查 .next(* lint_off="ASSIGN-9" *) () (* lint_on="ASSIGN-9" *) ); if (i < param - 1) begin assign link[i] = t1.next; end end endgenerate
如果你的Vivado版本不支持端口级lint属性,也可以对整个实例块进行屏蔽(需谨慎,会屏蔽该实例内所有ASSIGN-9违规):
generate for (i = 0; i < param; i = i + 1) begin : test1_ (* lint_off="ASSIGN-9" *) test1 t1 ( .clk(clk), .prev(i ? link[i-1] : first) ); (* lint_on="ASSIGN-9" *) if (i < param - 1) begin assign link[i] = t1.next; end end endgenerate
方法三:通过Vivado工程设置全局屏蔽特定违规
若不想修改代码,可在工程综合设置中忽略ASSIGN-9违规:
- 打开工程
Settings窗口 - 导航到
Synthesis > Options > More Options - 添加综合选项:
-lint -disable ASSIGN-9
这种方式会全局关闭ASSIGN-9检查,适合该违规对工程无影响的场景,但会屏蔽所有模块的同类告警,可能错过其他需关注的未连接端口问题。
内容的提问来源于stack exchange,提问作者Vladouch
相关产品推荐
相关产品推荐

