Verilog中直接将wire赋值给输出LED无法通过Yosys综合的问题
问题:Verilog直接将wire赋值给输出端口为何编译失败?
以下代码编译失败,退出时返回错误码-6:
module and_gate ( input [1:0] io_button, output [2:0] io_led ); wire wire1; assign wire1 = io_button[0]; assign io_led[0] = wire1; endmodule
但仅将输出赋值改为取反操作后,即可正常编译:
module and_gate ( input [1:0] io_button, output [2:0] io_led ); wire wire1; assign wire1 = io_button[0]; assign io_led[0] = ~wire1; endmodule
是否Verilog不允许在不对wire做任何修改的情况下,直接将其赋值给输出端口?
解答
Verilog本身完全允许直接将wire信号原样赋值给输出端口,这种写法属于标准合规的语法,不存在禁止性规则。
你遇到的编译失败并非语法限制导致,更可能是以下常见原因:
- 综合工具的冗余逻辑检查:部分综合工具会将这种“无逻辑变化的直接传递”判定为冗余路径,若工具开启了严格的冗余逻辑报错选项,就会触发编译失败。而添加取反操作后,路径存在实际逻辑运算,工具不会将其标记为冗余。
- 工具版本或配置差异:不同版本的编译/综合工具对冗余逻辑的处理策略不同,旧版本工具可能对这类无运算的代码兼容性较差;另外,若工具配置了“禁止空逻辑路径”的规则,也会触发错误。
- 未完全驱动的端口:你的代码中
io_led是3位输出,但仅驱动了第0位,剩余两位未赋值。不过这一点在两个版本代码中一致,通常只会触发警告而非编译失败,所以优先级低于前两种原因。
建议检查编译工具的配置选项,关闭冗余逻辑强制报错的设置,或者尝试更新工具版本来解决问题。
内容的提问来源于stack exchange,提问作者Kevin McQuown
相关产品推荐
相关产品推荐

