Yosys生成EDIF文件后Vivado无法识别GND/VCC单元求助
我之前刚碰到过一模一样的问题!其实这是Yosys生成的EDIF文件里,GND和VCC单元的格式和Vivado期望的Xilinx原语不匹配导致的:
- Yosys输出的GND/VCC单元用的引脚是
Y,但Vivado的官方GND/VCC原语要求引脚是O - EDIF里的单元类型写的是
GND/GND,但Vivado只认单纯的GND原语类型
这就直接导致Vivado把这些单元当成黑盒,根本没法完成优化步骤。
怎么搞定它?
有两种靠谱的方法可以调整Yosys的输出,让EDIF兼容Vivado:
方法1:用Yosys自带的Xilinx映射库
修改你的run_yosys.ys脚本,在综合后加上一步techmap,用Yosys官方提供的Xilinx映射文件修正单元定义:
read_verilog top.v # 明确指定目标是Artix-7系列,让综合更精准 synth_xilinx -family artix7 -top top # 用官方映射文件修正GND/VCC等单元的格式,适配Vivado techmap -map $::env(YOSYS_DIR)/techlibs/xilinx/cells_map.v # 生成兼容的EDIF文件 write_edif top.edif
小提示:如果你的Yosys没自动设置
YOSYS_DIR环境变量,直接换成实际路径就行,比如/usr/share/yosys/techlibs/xilinx/cells_map.v
方法2:手动修正GND/VCC单元
要是方法1不生效,你可以直接在Yosys脚本里手动调整这两个单元的引脚和类型:
read_verilog top.v synth_xilinx -top top # 处理所有GND单元:把引脚Y改成O,修正单元类型 foreach i [get_cells -filter "ref_name == GND"] { rename $i/Y $i/O set_attr $i ref_name GND } # 处理所有VCC单元:同样调整引脚和类型 foreach i [get_cells -filter "ref_name == VCC"] { rename $i/Y $i/O set_attr $i ref_name VCC } write_edif top.edif
验证修正后的流程
改完Yosys脚本后,重新运行你的shell脚本:
#!/bin/bash yosys run_yosys.ys vivado -nolog -nojournal -mode batch -source run_vivado.tcl
这时候Vivado的opt_design和link_design应该就不会再报GND/VCC的黑盒错误了,能顺利走完流程生成比特流。
为啥全Vivado流程没问题?
因为Vivado自己的综合工具会直接生成符合自身规范的Xilinx原语,不需要额外适配。而Yosys作为第三方综合工具,默认生成的EDIF在一些细节上和Vivado的要求有差异,所以需要我们手动调整这些单元定义来兼容。
内容的提问来源于stack exchange,提问作者MattHusz




