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_mapquartus_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 知识体系一览

说了这么多,我画了一张图帮你理清思路:

网表提取工具知识体系 Synplify Vivado Quartus .edf / .edn .dcp (内部格式) .vo / .vqm 环境变量设置 settings64 脚本 QUARTUS_ROOTDIR synplify -tcl script.tcl vivado -mode batch quartus_sh -t script.tcl 输出:EDIF / Verilog 网表文件

3.5 避坑指南

最后,分享几个我踩过的坑:

  • 版本兼容性:Synplify 2021 生成的 EDIF 网表,在 Vivado 2023 里可能打不开。我建议尽量用同一年的工具链。
  • 网表完整性:提取网表后,一定要检查一下有没有 unconnected 的端口。我曾经因为漏了一个引脚,导致整个逻辑还原失败。
  • 文件编码:Quartus 的 .vo 文件默认是 ANSI 编码,如果你用 UTF-8 的编辑器打开,中文注释会乱码。嗯,这个小问题。
💡 我的习惯

每次提取网表后,我都会用 grepfindstr 快速扫描一下文件,看看有没有 unknownblackbox 关键字。如果有,说明综合时有些模块没识别出来,得回去检查代码。

好了,工具环境配好了,命令行也会用了。接下来你就可以拿着这些网表去做逻辑还原了。记住,工具只是手段,理解网表背后的电路结构才是真本事。

专注资料整理