Vivado一些好用的隐藏功能

文章来源:FPGA入门到精通

Vivado 里藏着一堆大多数人没用过的功能,我挑了几个出来,分享给大家。

1、Tcl Console 里任何命令后面加 -help

可能很多朋友知道这个,但真的去用的人不多。

在 Vivado 的 Tcl Console 里输入 get_cells -help,它会打印出这个命令的所有参数、用法和示例。

不只是 get 开头的命令,Vivado 里所有的 Tcl 命令都支持。

直接在 Tcl Console 里敲 report_property -help,即可看到所有选项。

这个技巧的厉害之处在于,Vivado 的 Tcl 命令体系非常庞大,UG835 有几千页,没人能全记住。但只要你记住一个规则,就是任何命令后面加 -help,你就能在需要的时候即时查到所有用法,不用去翻文档。

2、.jou 文件是你的 GUI 操作录像。

Vivado 每次启动 GUI 的时候,会在工程目录下生成一个 .jou 文件。

你用鼠标点的每一步操作,综合、实现、打开设计、跑时序报告,全部被记录在这个文件里。

换句话说,你在 GUI 里做了一整套操作流程,然后打开 .jou 文件,里面的内容就是一份完整的 Tcl 脚本。

可以直接 source 这个文件来复现整个流程。

也可以把关键操作摘出来,保存成你自己的自动化脚本。

.jou 文件在工程目录下,文件名一般是 vivado_.jou。

3、get 命令的五件套配合 -filter 表达式

Vivado 里最常用的五个 Tcl 查询命令是 get_cells、get_nets、get_ports、get_pins、get_clocks。

很多人会用最基本的用法,比如 get_ports clk,但不知道它们配合 -filter 之后有多强大。

举个例子。

如果想找出所有没有被分配管脚的顶层端口,一条命令搞定:

get_ports -filter {PACKAGE_PIN == ""}

如果想找出所有总线端口:

get_ports -filter {BUS_NAME != ""}

如果想找出设计中所有的触发器,看看综合工具到底推断出了多少寄存器:

get_cells -hier -filter {IS_SEQUENTIAL == 1}

如果想找出所有时钟引脚:

get_pins -hier -filter {IS_CLOCK == 1}

filter 支持正则匹配。你想找出名字里包含 uart 的所有网线:

get_nets -hier -filter {NAME =~ *uart*}

还支持逻辑组合。找出所有 LUT3 类型的、名字包含 samp 的单元:

get_cells -hier -filter {REF_NAME == LUT3} *samp*

这个东西的用处在于,当设计规模大了之后,GUI 里想找一个特定的信号或者模块,手动翻层次树简直是灾难。用 Tcl 的 get + filter 组合,精准定位。

有时候觉得,Vivado 的 GUI 适合做可视化浏览,但真正干精细活还得靠 Tcl Console。

4、tcl.pre 和 tcl.post 钩子

这个东西知道的人不多,但用起来特别爽。

Vivado 的综合和实现流程被分成很多子步骤,比如 synth_design、opt_design、place_design、route_design。

每个子步骤执行前后,Vivado 都会检查是否有对应的 Tcl 脚本需要执行。

具体来说,可以创建一个 tcl.pre 文件放在工程目录下,Vivado 在综合之前会自动执行它。tcl.post 则是在综合之后执行。

对实现阶段也一样。

实际用途呢?

比如你有一个自动生成约束的脚本,需要在每次综合之前根据当前的版本号更新 XDC 里的字符串。你可以写一个 synth_1.tcl.pre,把自动更新约束的逻辑放进去。每次点 Run Synthesis,Vivado 自动先执行这个脚本,然后再综合。

# synth_1.tcl.pre
set build_id [clock seconds]
set_property -dict [list \
VERILOG.DEFINE.FW_VERSION $build_id \
] [get_filesets sources_1]
puts "Build ID set to $build_id"

或者你想在每次实现之后自动生成一份自定义的资源报告:

# impl_1.tcl.post
report_utilization -hierarchical -file custom_util.rpt
report_timing_summary -file custom_timing.rpt
puts "Custom reports generated."

命名规则是 {run_name}.tcl.pre 和 {run_name}.tcl.post。synth_1 对应综合,impl_1 对应实现。