Yosys技术问询:如何移除Verilog中的无用内部连线wire
问题
原始Verilog代码:
module demo(input a, output b); wire c; assign c = ~a; assign b = c; endmodule
执行以下Yosys命令尝试移除无用内部连线c:
read_verilog demo.v opt clean write_verilog demo_opt.v
但生成的代码中仍保留了c:
/* Generated by Yosys 0.24+25 (git sha1 a27a297eb, x86_64-w64-mingw32-g++ 9.2.1 -Os) */ Dumping module `\demo'. (* cells_not_processed = 1 *) (* src = "demo.v:1.1-10.10" *) module demo(a, b); (* src = "demo.v:3.15-3.16" *) input a; wire a; (* src = "demo.v:4.16-4.17" *) output b; wire b; (* src = "demo.v:7.10-7.11" *) wire c; assign b = ~ (* src = "demo.v:8.16-8.18" *) a; assign c = b; endmodule
如何通过Yosys彻底移除无用的内部连线c?
解决方案
核心问题是Yosys默认保留的源文件属性标记(如src注释),会限制基础优化命令对未使用信号的清理。可以通过以下几种方式解决:
方法1:添加purge命令
purge专门用于清理未被驱动或未被使用的网线、寄存器,在基础优化后执行即可:
read_verilog demo.v opt clean purge write_verilog demo_opt.v
方法2:清除属性标记后再优化
用strip移除所有Verilog属性,让优化命令不受标记约束:
read_verilog demo.v strip opt clean write_verilog demo_opt.v
方法3:使用更彻底的优化命令
替换opt为opt_full(包含更激进的逻辑优化),再配合purge确保清理干净:
read_verilog demo.v opt_full clean purge write_verilog demo_opt.v
执行任意方案后,生成的代码都会移除c,最终效果如下:
/* Generated by Yosys ... */ module demo(a, b); input a; output b; assign b = ~a; endmodule
内容的提问来源于stack exchange,提问作者alex137
相关产品推荐
相关产品推荐

