记录用yosys综合得到synth.v文件的过程
1.一定要测试初始cpu文件的可行性,tb来test确认都能pass以后再开始,不然这里错后面全错全部重来。
我的cpu文件用到了:
2.打开yosys并读取以上文件
在此文件夹打开终端
1.在终端输入:
yosys
打开yosys软件
然后输入:
read_verilog cpu_singlecycle.v; read_verilog decode_assign.v; read_verilog execute_assign.v; read_verilog rf.v; read_verilog single_port_async_ram.v; read_verilog dff.v; read_verilog configurations.v
看到每个最后一行都是“successfully”就ok,如下:
2.设置顶层模块并使用synth指令来综合:
synth -top cpu
3.找你想用的pdk的lib库,把它放到这个目录下,eg:
我是用的pdk45nm,用到了stdcells的lib和v文件来源: mflowgen/freepdk-45nm: ASIC Design Kit for FreePDK45 + Nangate for use with mflowgen (github.com)
目前只用到stdcells.lib文件后续,也会用到stdcells.v文件,可以先下载下来。
4.把上面的stdcells.lib映射进来:
dfflibmap -liberty stdcells.lib
abc -liberty stdcells.lib
clean
5.把结果写入synth.v文件:
write_verilog synth.v
这些指令的含义在文章末尾可以找到。
最后我们就得到了synth.v文件:
打开后内容大概是这样:
可看到原本的代码变成了各种门 和非常多的线。
验证synth文件的可行性:
创建一个新文件夹为下一步仿真做准备,放入相关文件(synth和configuration,反正提示缺啥放啥就行),运行:
iverilog -o v.out cpu_tb_t2.v synth.v
发现报错未知模块
这是因为我们synth内部不是用了很多门吗,这些门定义存放在刚刚的stdcells.v文件内,所以现在就是把刚刚下载的stdcells.v放到相同目录下的时候了。
在synth文件前面加入inculde:
`include "stdcells.v"
这里我用到的是我自己用脚本修改过的文件
然后把其它提示需要补充的文件放进来,就可以看到PASS验证通过:
(中间省略)
可知道我们生成的这个synth是可以成功运行在初始cpu代码下运行的指令的,可以进入下一步:仿真。
YosysHQ/yosys: Yosys Open SYnthesis Suite (github.com)
ascend-freepdk45/lib at master · marlls1989/ascend-freepdk45 (github.com)
yosys常用命令及含义:
abc 使用ABC进行技术映射 use ABC for technology mappingcheck 检查设计中的明显问题 check for obvious problems in the design
clean 移除未使用的电池和电线 remove unused cells and wires
dfflibmap 触发器技术映射 technology mapping of flip-flops
fsm 提取和优化有限状态机 extract and optimize finite state machines
hierarchy 检查、扩展和清理设计层次结构
memory 将存储器转化成基础单元 translate memories to basic cells
opt 执行简单的优化 perform simple optimizations
proc 将进程转换为网表 translate processes to netlists
read_verilog 从Verilog文件中读取模块 read modules from Verilog file
synth 通用综合脚本 generic synthesis script
write_verilog 将设计写入Verilog文件write design to Verilog file
hierarchy相关语法:
hierarchy [-check] [-top <module>]
-check 检查设计层次结构。当使用未知模块作为单元格类型时,将生成错误。
-top <module> 使用指定的顶层模块构建设计层次结构。其它模块(未使用的模块)将被删除。当使用-top选项时,将在指定的top模块上设置'top'属性。否则,带有'top'属性集的模块将隐式地被用作顶级模块,如果这样的模块存在的话。