找回密码
 注册
关于网站域名变更的通知
查看: 321|回复: 1
打印 上一主题 下一主题

Tcl 在 Vivado 中的应用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-6-29 19:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Xilinx © 的新一代设计套件Vivado®相比上一代产品 ISE,在运行速度、算法优化和功能整合等很多方面都有了显著地改进。但是对初学者来说,新的约束语言 XDC 以及脚本语言 Tcl 的引入则成为了快速掌握 Vivado 使用技巧的最大障碍,以至于两年多后的今天,仍有很多用户缺乏 升级到 Vivado 的信心。
& s9 j' c+ v! y
本文介绍了 Tcl 在 Vivado 中的基础应用,希望起到抛砖引玉的作用, 指引使用者在短时间内快速掌握相关技巧,更好地发挥 Vivado 在 FPGA 设计中的优势。
! p% T- x/ C5 o
TCL的背景介绍和基础语法
Tcl(读作 tickle)诞生于 80 年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,目前已经广泛应用在几乎所有的 EDA 工具中。Tcl 的最大特点就是其语法格式极其简单甚至可以说僵化,采用纯粹的 [命令选项 参数] 形式,是名副其实的“工具命令语言”(即 Tcl 的全称 Tool Command Language)。
0 }% P, W* ]* b: h, k# \
实际上 Tcl 的功能可以很强大,用其编写的程序也可以很复杂,但要在 Vivado 或大部分其它 EDA 工具中使用,则只需掌握其中最基本的几个部分。
; u+ {5 a" k& A# h
注:在以下示例中,% 表示 Tcl 的命令提示符,执行回车后,Tcl 会在下一行输出命令执行结果。 // 后是作者所加注释,并不是例子的一部分。

- `0 r0 E! J/ |9 B: K7 l( q1 B

( x) D* s1 }% j" V8 G5 S5 o
打印主要通过 puts 语句来执行,配合特殊符号,直接决定最终输出内容。

8 |, d, w* J+ y  S& V6 a* {0 l( ]
可以看到 Tcl 对文件的操作也是通过设置变量,改变属性以及打印命令来进行的。上述写文件的例子中通过 puts 命令在 my_file.txt 文件中写入两行文字,分别为“Hello World!” 和 myVar 变量的值,然后在读文件操作 中读取同一文件的内容。
0 S8 f7 H8 r" a9 Y- t
控制流和循环命令
" ^5 L2 E. e4 t9 X' F; b
Tcl 语言中用于控制流程和循环的命令与 C 语言及其它高级语言中相似,包括 if、while、for 和 foreach 等等。

1 l4 M4 C9 ^0 Y5 e1 Q4 m
具体使用可以参考如下示例,
8 a8 [3 o- R/ J! e+ U8 K
子程序/过程
Tcl 中的子程序也叫做过程(Procedures),Tcl 正是通过创建新的过程来增强其内建命令的能力,提供更强的扩展性。具体到 Vivado 的使用中,用户经常可以通过对一个个子程序/过程的创建来扩展或个性化 Vivado 的使用流程。
. O: y7 g& s6 `- B* U% I! Q5 S
+ }4 \  {3 H1 z2 g, k
一些特殊符号

4 G- k9 \; E6 Z
注: 反斜杠出现在行尾以允许命令在下一行继续时,必须是这一行的最后一个字符,其后不能有空格。

- \1 u- F2 I" @  D5 a; a
7 t  F6 u  C2 a' q/ q1 u- X* U; s5 f
Tcl 语言的基本语法相对简单,但要熟练掌握仍需日常不断练习。Xilinx 网站上有很多相关资料,这里推荐 两个跟 Tcl 相关的文档 UG835 和 UG894 ,希望对大家学习 Vivado 和 Tcl 有所帮助。

: L  @2 J  ^, _6 t  m
在Vivado 中使用 Tcl定位目标
在 Vivado 中使用 Tcl 最基本的场景就是对网表上的目标进行遍历、查找和定位,这也是对网表上的目标进行约束的基础。要掌握这些则首先需要理解 Vivado 对目标的分类。

; T5 X" M1 w. \2 h- _- i( H
目标的定义和定位

* `# Q( G1 @$ j
如上图所示,设计顶层的 I/O 称作 ports,其余底层模块或是门级网表上的元件端口都称作 pins。而包括顶层在内的各级模块,blackbox 以及门级元件,都称作 cells。连线称作 nets,加上 XDC 中定义的 clocks,在 Vivado 中一共将网表文件中的目标定义为五类。要选取这五类目标,则需用相应的 get_*命令,例如 get_pins 等等。

6 Q) R! X1 O0 A% f4 J3 Z/ Z
  • get_ports
    7 F- ^8 B; e1 S# V% h
ports 仅指顶层端口,所以get_ports 的使用相对简单,可以配合通配符“* ”以及 Tcl 语言中处理 list 的命令一起使用。如下所示,

3 K7 [4 @4 |  l
8 U" C, A5 J. U8 f0 X0 }
  • get_cells/get_nets

    + l: \8 s7 |5 l- G% ?) l. J9 N
不同于 ports 仅指顶层端口,要定位 cells 和 nets 则相对复杂,首先需要面对层次的问题。这里有个大背景需要明确:Vivado 中 Tcl/XDC 对网表中目标的搜索是层次化的,也就是一次仅搜索一个指定的层次 current_instance,缺省值为顶层。

8 |3 J9 S) _3 f" d* J- h
以右图所示设计来举例,若要搜索 A(不含 a1,a2)层次内的所有 cells 和名字中含有 nt 的 nets,有两种方法:

) m* _8 o% U, B% S6 @
$ \. D6 T3 K2 e) c( N$ I3 R
4 Q  q$ P' J* P- x4 @4 k9 T
若要将搜索层次改为 A+B+b1,则可以写一个循环,逐一用 current_instance 将搜索层次指向 A,B 和 b1,再将搜索到的 cells 或 nets 合成一个 list 输出即可。

, v# y. I) ]8 z# F  l1 V; _
若要将搜索层次改为当前层次以及其下所有子层次,可以使用 -hierarchical (在 Tcl 中可以简写为-hier)

- L/ p2 D4 `  F
2 y. b! [/ l' f  Z, ]1 ~
在使用-hierarchical 时有一点需要特别留意,即后面所跟的搜索条件仅指目标对象的名字,不能含有代表 层次的“/” 。下面列出的写法便是一种常见的使用误区,并不能以此搜索到 A 及其下子层次内所有的 cells。

! d3 e/ r3 t) _7 i( b  Y
$ `' A9 k6 \) K. A, ~
  • get_pins
    0 A! p$ a2 W3 t# `# X4 e6 L) N( X/ U& I
pins 在 Vivado 数据库中有个独特的存在形式,即 / 。这里的“ / ”不表示层次,而是其名字的一部分,表示这个 pin 所属的实体。也就是说,在使用 get_pins 配合-hier 来查找 pins 时,“ / ”可以作为名字的一部分,出现在搜索条件内(注意与上述 get_cells 和 get_nets 的使用区别)

7 g' H( k% q4 o2 t* Z2 G

# [% |3 s1 b/ S
" x- p! p) [  b6 _5 U- R! G
目标之间的关系
0 z1 Y7 Q9 Q1 m$ @! c) |/ b
Tcl 在搜索网表中的目标时,除了上述根据名字条件直接搜索的方式,还可以利用目标间的关系,使用 -of_objects(在 Tcl 中可以简写为-of)来间接搜索特定目标。Vivado 中定义的五类目标间的关系如下页左图所示。

; B4 g' P- h- b: J9 b( s, ^) @) o
6 o6 G% I. E& t2 `0 @5 g
以上示右图的设计来举例,

( N1 h* `! O% q' m( J9 D1 ^
! S  y4 G5 ^8 b* J. z/ j/ o. ?* p
下图是一个更复杂的示例,涉及跨层次搜索。可以看到在 get_pins 时,要加上-leaf 才能准确定位到门级 元件(或 blackbox)的端口 q。另外,在实际操作中,使用get_nets 和 get_pins 时,需要视情况而加上其它 条件(-filter)才能准确找到下述例子中的 cells (i2) 。

  Z+ f" {$ g3 T, \- c1 W! s7 X1 R
5 u6 K. s3 z0 \1 N
高级查找功能

% u' l( _. e% e9 {% ^; r" ?' l; W1 k
在使用 get_*命令查找网表中的目标时,除了名字这一直接条件,往往还需要辅以其它更复杂的条件判断,这就需要用到高级查找功能:-filter 结合 Tcl 支持的各种关系和逻辑运算符(==, !=, =~, !~, <=, >=, >,
! v2 J! _3 {% e

1 _9 b% b8 Q- U
在创建子程序时也常常用到-filter,例如下述 get_p 的子程序/过程就可以用来返回指定管脚的方向属性,告诉用户这是一个输入管脚还是一个输出管脚。需要特别指出的是,通常在-filter 后会使用{ },但此时需要对 $direction 做变量替换,必须如下所示改用" " 。
/ I7 W* u7 ^: B& E
' X3 K0 q1 H: u# G. K/ @: l+ ~
Tcl 在 Vivado 中的延伸应用
Tcl 在 Vivado 中的应用还远不止上述所列,其它常用的功能包括使用预先写好的 Tcl 脚本来跑设计实现流程,创建高级约束(XDC 不支持循环等高级 Tcl 语法)以及实现复杂的个性化设计流程等等。Tcl 所带来的强大的可扩展性决定了其在版本控制、设计自动化流程等方面具有图形化界面不能比拟的优势。

3 A! n- R3 a6 l/ u- J, H; Y
Vivado 在不断发展更新的过程中,还有很多新的功能,包括 ECO、PR、HD Flow 等等都是从 Tcl 脚本方 式开始支持,然后再逐步放入图形化界面中实现。这也解释了为何高端 FPGA 用户和熟练的 Vivado 用户都更 偏爱 Tcl 脚本。
篇幅所限,不能一一展开。关于以上 Tcl 在 Vivado 中的延伸应用,敬请关注 Xilinx 官方网站和中文论坛 上的更多技术文章。
, S! H$ D; ~  i9 U9 _
1 E# ^( x1 U. X. @: p/ I# h3 n
( v. T8 p3 a+ ]! F% p

该用户从未签到

2#
发表于 2023-6-30 10:41 | 只看该作者
FPGA现在还是比较好的行业,发展方向比较多,硬件加速,图像处理,优点还是很多的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-20 00:18 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表