3、网表提取工具入门:常用网表提取工具介绍
做网表提取这行,说白了就是跟三大工具打交道:Synplify、Vivado、Quartus。我刚开始接触时也觉得头大,每个工具都有自己的脾气。但摸透了它们的套路,其实也就那么回事。
今天我就带大家把这三大工具的环境配好,再讲讲怎么用命令行把网表“拽”出来。嗯,咱们直接开干。
3.1 三大工具,各显神通
先说说它们各自的特点。你想想看,FPGA 厂商就那么几家,但综合工具却各有千秋。
| 工具 | 厂商 | 网表格式 | 我的评价 |
|---|---|---|---|
| Synplify | Synopsys | .edf/.edn (EDIF) | 综合速度快,网表干净 |
| Vivado | AMD (Xilinx) | .dcp (内部格式) | 生态完整,但有点重 |
| Quartus | Intel (Altera) | .vo/.vqm | 对老器件支持好 |
Synplify 是我个人比较偏爱的工具。为什么?因为它生成的网表特别“规整”。我在项目中遇到过几次,用 Synplify 综合出来的 EDIF 网表,层次结构清晰,信号命名也很有规律,后期做逻辑还原时省了不少力气。
Vivado 呢,功能确实强大。但它的 .dcp 格式是个“黑盒子”,里面打包了综合、布局布线的全部信息。想直接提取网表?得用它的 Tcl 命令才行。我记得有一次,客户给了一个 .dcp 文件,我折腾了半天才把网表导出来。
Quartus 对老工程师来说应该不陌生。它生成的 .vo 文件是 Verilog 格式的网表,可以直接打开看。但要注意,Quartus 的网表里经常会有一些“怪名字”,比如 ~ALTERA_MSEL~ 这种,提取时得留个心眼。
3.2 环境配置,别踩坑
配置环境这事,说难不难,说简单也容易翻车。我给大家总结几个要点。
我曾经因为安装路径里带了个“(1)”,结果 Synplify 死活跑不起来。折腾了两小时才发现是这个问题。
3.2.1 Synplify 环境配置
安装完 Synplify 后,需要设置环境变量:
# Windows 下设置
setx SYNOPSYS_SYN_HOME "C:\Synopsys\Synplify\2023.03"
setx PATH "%PATH%;%SYNOPSYS_SYN_HOME%\bin"
验证是否配置成功:
synplify_premier -version
如果能看到版本号,说明环境配好了。嗯,这一步很简单。
3.2.2 Vivado 环境配置
Vivado 的环境配置稍微复杂一点。它自带了一个设置脚本:
# Linux/Mac 下
source /opt/Xilinx/Vivado/2023.1/settings64.sh
# Windows 下
C:\Xilinx\Vivado\2023.1\settings64.bat
我个人习惯把这条命令加到 .bashrc 里,省得每次都要手动执行。
Vivado 的 Tcl 模式非常强大。配置好环境后,试试输入 vivado -mode tcl,你会打开一个新世界。
3.2.3 Quartus 环境配置
Quartus 的环境变量主要是 QUARTUS_ROOTDIR:
setx QUARTUS_ROOTDIR "C:\intelFPGA\20.1\quartus"
setx PATH "%PATH%;%QUARTUS_ROOTDIR%\bin64"
验证方法:
quartus_sh --version
3.3 命令行提取,这才是真功夫
GUI 操作谁都会,但真正高效的工程师都用命令行。为什么?因为可以写脚本批量处理啊!
3.3.1 Synplify 命令行提取
Synplify 支持 Tcl 脚本控制。下面是一个完整的网表提取脚本:
# extract_netlist.tcl
project -new my_project.prj
add_file -verilog top.v
add_file -verilog sub_module.v
impl -add impl_1
synplify -batch impl_1
project -save
# 提取 EDIF 网表
project -result_file "output/top.edf"
synplify -batch impl_1
执行命令:
synplify_premier -tcl extract_netlist.tcl
你看,几行脚本就搞定了。我在项目中经常用这种方式批量处理几十个设计。
3.3.2 Vivado 命令行提取
Vivado 的 Tcl 命令更丰富。提取网表的核心命令是 write_edif:
# 打开综合后的设计
open_checkpoint synth_1.dcp
# 写出 EDIF 网表
write_edif -force output/top.edf
# 也可以写出 Verilog 网表
write_verilog -force output/top_netlist.v
执行方式:
vivado -mode batch -source extract.tcl
Vivado 的 write_edif 命令必须在 synth_design 之后执行。如果你只打开了 .dcp 文件,记得先 link_design 一下。
3.3.3 Quartus 命令行提取
Quartus 的命令行工具叫 quartus_map 和 quartus_cpf:
# 综合并生成网表
quartus_map my_project --source=top.v --family="Cyclone V"
# 提取 Verilog 网表
quartus_cpf -c top.sof output/top.vo
或者用 Tcl 脚本:
# extract_quartus.tcl
load_package flow
project_open my_project
execute_module -tool map
write_verilog -file output/top.vo
project_close
执行:
quartus_sh -t extract_quartus.tcl
3.4 知识体系一览
说了这么多,我画了一张图帮你理清思路:
3.5 避坑指南
最后,分享几个我踩过的坑:
- 版本兼容性:Synplify 2021 生成的 EDIF 网表,在 Vivado 2023 里可能打不开。我建议尽量用同一年的工具链。
- 网表完整性:提取网表后,一定要检查一下有没有
unconnected的端口。我曾经因为漏了一个引脚,导致整个逻辑还原失败。 - 文件编码:Quartus 的 .vo 文件默认是 ANSI 编码,如果你用 UTF-8 的编辑器打开,中文注释会乱码。嗯,这个小问题。
每次提取网表后,我都会用 grep 或 findstr 快速扫描一下文件,看看有没有 unknown 或 blackbox 关键字。如果有,说明综合时有些模块没识别出来,得回去检查代码。
好了,工具环境配好了,命令行也会用了。接下来你就可以拿着这些网表去做逻辑还原了。记住,工具只是手段,理解网表背后的电路结构才是真本事。