Yosys生成含DFF的BLIF无法被ABC读取的问题求助
问题原因与解决办法
错误原因分析
- Liberty库加载失败:报错提到无法识别
.h后缀文件,说明你的mycells.lib中包含include语句引用了.h文件,ABC的通用read命令无法解析该后缀,导致库文件加载不完整,后续找不到DFF定义。 - DFF单元不匹配或未定义:
- 要么
mycells.lib中没有定义名为DFF的时序单元; - 要么Yosys生成的BLIF中DFF的端口(如
C作为时钟端)与Liberty库中DFF的端口命名(如部分库用CLK)不匹配; - 重复的
dfflibmap操作可能干扰了DFF的映射流程。
- 要么
解决步骤
1. 修复Liberty库文件加载问题
- 替换/include内容:打开
mycells.lib,找到引用.h文件的include语句,将.h文件的内容直接复制粘贴到mycells.lib中并删除原include行;或者将.h文件重命名为.lib,修改include路径为新文件名。 - 使用ABC专用命令加载库:ABC中加载Liberty库必须用
read_liberty命令,而非通用的read命令,修改ABC脚本为:
read_liberty ./yosys-yosys-0.23/manual/PRESENTATION_Intro/mycells.lib read_blif ./designs/aes_core.blif
2. 确保Liberty库中存在正确的DFF定义
检查mycells.lib,确认包含端口匹配的DFF单元定义,示例如下:
cell(DFF) { area : 1.0; pin(D) { direction : input; } pin(Q) { direction : output; } pin(C) { direction : input; clock : true; } timing() { // 按需添加时序约束信息 } }
如果库中DFF的时钟端口名为CLK,需修改Yosys的dfflibmap步骤添加端口映射,或调整Liberty中的端口名为C以匹配BLIF输出。
3. 优化Yosys综合脚本
原脚本中abc前后重复调用dfflibmap,且使用-prepare选项(用于生成映射模板),这可能导致DFF未正确映射到库单元。调整脚本如下:
read_verilog ./designs/apbtoaes128/trunk/rtl/*.v hierarchy -check -top aes_core proc techmap -map ./oss-cad-suite/share/yosys/adff2dff.v synth # 先映射DFF到库单元,再执行ABC组合逻辑映射 dfflibmap -liberty ./yosys-yosys-0.23/manual/PRESENTATION_Intro/mycells.lib abc -liberty ./yosys-yosys-0.23/manual/PRESENTATION_Intro/mycells.lib write_blif -gates ./designs/aes_core.blif
该脚本会将设计中的DFF直接替换为mycells.lib中定义的单元,生成的BLIF将使用库中实际的DFF名称,避免ABC找不到对应单元。
4. 额外排查点
- 检查BLIF文件中DFF的端口名与Liberty库中的定义是否完全一致(ABC对大小写敏感);
- 如果Liberty中的DFF包含复位/置位端口,需确保Yosys综合时保留或处理这些端口逻辑,避免端口不匹配;
- 使用Yosys的
write_liberty命令导出映射后的库,验证DFF单元是否正确生成。
内容的提问来源于stack exchange,提问作者Pu Yuan
相关产品推荐
相关产品推荐

