Yosys综合流程中如何为Xilinx原语提供映射信息
Yosys 面向Xilinx原语设计的综合实操说明
核心支持性结论
Yosys 完全支持直接基于手动例化的Xilinx原语完成全流程综合,无需对原语本身做兼容性改写。
Yosys核心维护团队长期内置了面向Xilinx 7系列、UltraScale、UltraScale+全系列的原语兼容模型,无论是手动例化的IO原语、LUT、进位链、块RAM、DSP块,这些硬件原语在综合过程中不会被默认当作无定义黑盒处理,可参与后续的时序关联、网表导出环节。
Xilinx原语的映射信息加载流程
要让Yosys正确识别、保留所有手动例化的Xilinx原语,综合环节需要按三步配置映射信息:
- 加载对应架构的原语定义库
手动例化的原语端口、参数规则,需要通过Yosys自带的官方原语定义文件补全给Yosys的解析器,避免出现“未知模块”的识别错误。加载时需要指定对应器件系列的cell模型文件,不要用Xilinx官方的仿真库文件替代,避免出现参数不兼容问题。 - 标记原语为层级保留模块
默认的综合优化流程会对所有普通模块做展开、逻辑合并操作,需要通过属性标记把所有Xilinx原语设置为“禁止优化裁剪”,Yosys加载官方原语定义库时会自动给这些原语附上keep_hierarchy = 1的保留属性,不需要额外逐一定义。 - 匹配对应架构的综合流程
不要使用通用的synth_generic流程跑带Xilinx原语的设计,这类通用流程会把手写例化的原语展开成基础逻辑门,破坏原有的硬件结构。需要调用Yosys内置的techmap映射规则,既保证通用逻辑部分能正确映射到Xilinx硬件单元,也能完整保留手动例化的原语结构。
最小可复现实践示例
含Xilinx原语例化的示例设计(top.v)
module top( input wire in_sig, output wire out_sig ); // 直接例化Xilinx 7系列原语 IBUF input_buffer ( .I(in_sig), .O(buf_to_lut) ); LUT2 #( .INIT(4'hC) // 固定实现:lut_out = a & b ) lut_logic ( .I0(buf_to_lut), .I1(1'b1), .O(lut_to_obuf) ); OBUF output_buffer ( .I(lut_to_obuf), .O(out_sig) ); endmodule
对应Yosys综合脚本
# 读入用户手写的含原语例化的设计 read_verilog top.v # 加载Yosys内置的Xilinx原语定义,补全映射信息 read_verilog -lib $::env(YOSYS_DATADIR)/techlibs/xilinx/cells_sim.v # 执行Xilinx架构专属综合流程,匹配7系列器件 synth_xilinx -family 7 # 导出最终综合网表,校验原语保留情况 write_verilog -noattr result_netlist.v
校验标准:综合完成后打开result_netlist.v文件,能看到IBUF、LUT2、OBUF三个原语被完整保留,端口连线关系和RTL定义完全一致,即表示映射信息加载正确。
常见踩坑提示
- 不要在加载原语定义时使用
-overwrite参数,否则会覆盖用户例化的原语连接关系,出现端口错位 - 综合时不要额外加
flatten参数,否则会把原语内部的层级结构打散,破坏原语定义
内容的提问来源于stack exchange,提问作者N1T1N
相关产品推荐
相关产品推荐

