Xilinx的新一代設(shè)計(jì)套件Vivado相比上一代產(chǎn)品 ISE,在運(yùn)行速度、算法優(yōu)化和功能整合等很多方面都有了顯著地改進(jìn)。但是對(duì)初學(xué)者來說,新的約束語言 XDC 以及腳本語言 Tcl 的引入則成為了快速掌握 Vivado 使用技巧的最大障礙,以至于兩年多后的今天,仍有很多用戶缺乏 升級(jí)到 Vivado 的信心。
本文介紹了 Tcl 在 Vivado 中的基礎(chǔ)應(yīng)用,希望起到拋磚引玉的作用, 指引使用者在短時(shí)間內(nèi)快速掌握相關(guān)技巧,更好地發(fā)揮 Vivado 在 FPGA 設(shè)計(jì)中的優(yōu)勢(shì)。
Tcl 的背景介紹和基礎(chǔ)語法
Tcl(讀作 tickle)誕生于 80 年代的加州大學(xué)伯克利分校,作為一種簡(jiǎn)單高效可移植性好的腳本語言,目前已經(jīng)廣泛應(yīng)用在幾乎所有的 EDA 工具中。Tcl 的最大特點(diǎn)就是其語法格式極其簡(jiǎn)單甚至可以說僵化,采用純粹的 [命令選項(xiàng) 參數(shù)] 形式,是名副其實(shí)的“工具命令語言”(即 Tcl 的全稱 Tool Command Language)。
實(shí)際上 Tcl 的功能可以很強(qiáng)大,用其編寫的程序也可以很復(fù)雜,但要在 Vivado 或大部分其它 EDA 工具中使用,則只需掌握其中最基本的幾個(gè)部分。
注:在以下示例中,% 表示 Tcl 的命令提示符,執(zhí)行回車后,Tcl 會(huì)在下一行輸出命令執(zhí)行結(jié)果。 // 后是作者所加注釋,并不是例子的一部分。
打印主要通過 puts 語句來執(zhí)行,配合特殊符號(hào),直接決定最終輸出內(nèi)容。
可以看到 Tcl 對(duì)文件的操作也是通過設(shè)置變量,改變屬性以及打印命令來進(jìn)行的。上述寫文件的例子中通過 puts 命令在 my_file.txt 文件中寫入兩行文字,分別為“Hello World!” 和 myVar 變量的值,然后在讀文件操作 中讀取同一文件的內(nèi)容。
控制流和循環(huán)命令
Tcl 語言中用于控制流程和循環(huán)的命令與 C 語言及其它高級(jí)語言中相似,包括 if、while、for 和 foreach 等等。
具體使用可以參考如下示例,
子程序/過程
Tcl 中的子程序也叫做過程(Procedures),Tcl 正是通過創(chuàng)建新的過程來增強(qiáng)其內(nèi)建命令的能力,提供更強(qiáng)的擴(kuò)展性。具體到 Vivado 的使用中,用戶經(jīng)常可以通過對(duì)一個(gè)個(gè)子程序/過程的創(chuàng)建來擴(kuò)展或個(gè)性化 Vivado 的使用流程。
一些特殊符號(hào)
注: 反斜杠出現(xiàn)在行尾以允許命令在下一行繼續(xù)時(shí),必須是這一行的最后一個(gè)字符,其后不能有空格。
Tcl 語言的基本語法相對(duì)簡(jiǎn)單,但要熟練掌握仍需日常不斷練習(xí)。Xilinx 網(wǎng)站上有很多相關(guān)資料,這里推薦 兩個(gè)跟 Tcl 相關(guān)的文檔 UG835 和 UG894 ,希望對(duì)大家學(xué)習(xí) Vivado 和 Tcl 有所幫助。
在Vivado 中使用 Tcl定位目標(biāo)
在 Vivado 中使用 Tcl 最基本的場(chǎng)景就是對(duì)網(wǎng)表上的目標(biāo)進(jìn)行遍歷、查找和定位,這也是對(duì)網(wǎng)表上的目標(biāo)進(jìn)行約束的基礎(chǔ)。要掌握這些則首先需要理解 Vivado 對(duì)目標(biāo)的分類。
目標(biāo)的定義和定位
如上圖所示,設(shè)計(jì)頂層的 I/O 稱作 ports,其余底層模塊或是門級(jí)網(wǎng)表上的元件端口都稱作 pins。而包括頂層在內(nèi)的各級(jí)模塊,blackbox 以及門級(jí)元件,都稱作 cells。連線稱作 nets,加上 XDC 中定義的 clocks,在 Vivado 中一共將網(wǎng)表文件中的目標(biāo)定義為五類。要選取這五類目標(biāo),則需用相應(yīng)的 get_*命令,例如 get_pins 等等。
get_ports
ports 僅指頂層端口,所以get_ports 的使用相對(duì)簡(jiǎn)單,可以配合通配符“* ”以及 Tcl 語言中處理 list 的命令一起使用。如下所示,
get_cells/get_nets
不同于 ports 僅指頂層端口,要定位 cells 和 nets 則相對(duì)復(fù)雜,首先需要面對(duì)層次的問題。這里有個(gè)大背景需要明確:Vivado 中 Tcl/XDC 對(duì)網(wǎng)表中目標(biāo)的搜索是層次化的,也就是一次僅搜索一個(gè)指定的層次 current_instance,缺省值為頂層。
以右圖所示設(shè)計(jì)來舉例,若要搜索 A(不含 a1,a2)層次內(nèi)的所有 cells 和名字中含有 nt 的 nets,有兩種方法:
若要將搜索層次改為 A+B+b1,則可以寫一個(gè)循環(huán),逐一用 current_instance 將搜索層次指向 A,B 和 b1,再將搜索到的 cells 或 nets 合成一個(gè) list 輸出即可。
若要將搜索層次改為當(dāng)前層次以及其下所有子層次,可以使用 -hierarchical (在 Tcl 中可以簡(jiǎn)寫為-hier)
在使用-hierarchical 時(shí)有一點(diǎn)需要特別留意,即后面所跟的搜索條件僅指目標(biāo)對(duì)象的名字,不能含有代表 層次的“/” 。下面列出的寫法便是一種常見的使用誤區(qū),并不能以此搜索到 A 及其下子層次內(nèi)所有的 cells。
get_pins
pins 在 Vivado 數(shù)據(jù)庫中有個(gè)獨(dú)特的存在形式,即 / 。這里的“ / ”不表示層次,而是其名字的一部分,表示這個(gè) pin 所屬的實(shí)體。也就是說,在使用 get_pins 配合-hier 來查找 pins 時(shí),“ / ”可以作為名字的一部分,出現(xiàn)在搜索條件內(nèi)(注意與上述 get_cells 和 get_nets 的使用區(qū)別)
目標(biāo)之間的關(guān)系
Tcl 在搜索網(wǎng)表中的目標(biāo)時(shí),除了上述根據(jù)名字條件直接搜索的方式,還可以利用目標(biāo)間的關(guān)系,使用 -of_objects(在 Tcl 中可以簡(jiǎn)寫為-of)來間接搜索特定目標(biāo)。Vivado 中定義的五類目標(biāo)間的關(guān)系如下頁左圖所示。
以上示右圖的設(shè)計(jì)來舉例,
下圖是一個(gè)更復(fù)雜的示例,涉及跨層次搜索。可以看到在 get_pins 時(shí),要加上-leaf 才能準(zhǔn)確定位到門級(jí) 元件(或 blackbox)的端口 q。另外,在實(shí)際操作中,使用get_nets 和 get_pins 時(shí),需要視情況而加上其它 條件(-filter)才能準(zhǔn)確找到下述例子中的 cells (i2) 。
高級(jí)查找功能
在使用 get_*命令查找網(wǎng)表中的目標(biāo)時(shí),除了名字這一直接條件,往往還需要輔以其它更復(fù)雜的條件判斷,這就需要用到高級(jí)查找功能:-filter 結(jié)合 Tcl 支持的各種關(guān)系和邏輯運(yùn)算符(==, !=, =~, !~, <=, >=, >,
在創(chuàng)建子程序時(shí)也常常用到-filter,例如下述 get_p 的子程序/過程就可以用來返回指定管腳的方向?qū)傩裕嬖V用戶這是一個(gè)輸入管腳還是一個(gè)輸出管腳。需要特別指出的是,通常在-filter 后會(huì)使用{ },但此時(shí)需要對(duì) $direction 做變量替換,必須如下所示改用" " 。
Tcl 在 Vivado 中的延伸應(yīng)用
Tcl 在 Vivado 中的應(yīng)用還遠(yuǎn)不止上述所列,其它常用的功能包括使用預(yù)先寫好的 Tcl 腳本來跑設(shè)計(jì)實(shí)現(xiàn)流程,創(chuàng)建高級(jí)約束(XDC 不支持循環(huán)等高級(jí) Tcl 語法)以及實(shí)現(xiàn)復(fù)雜的個(gè)性化設(shè)計(jì)流程等等。Tcl 所帶來的強(qiáng)大的可擴(kuò)展性決定了其在版本控制、設(shè)計(jì)自動(dòng)化流程等方面具有圖形化界面不能比擬的優(yōu)勢(shì)。
Vivado 在不斷發(fā)展更新的過程中,還有很多新的功能,包括 ECO、PR、HD Flow 等等都是從 Tcl 腳本方 式開始支持,然后再逐步放入圖形化界面中實(shí)現(xiàn)。這也解釋了為何高端 FPGA 用戶和熟練的 Vivado 用戶都更 偏愛 Tcl 腳本。
篇幅所限,不能一一展開。關(guān)于以上 Tcl 在 Vivado 中的延伸應(yīng)用,敬請(qǐng)關(guān)注 Xilinx 官方網(wǎng)站和中文論壇 上的更多技術(shù)文章。
-
FPGA
+關(guān)注
關(guān)注
1643文章
21945瀏覽量
613480 -
Xilinx
+關(guān)注
關(guān)注
73文章
2181瀏覽量
124214 -
eda
+關(guān)注
關(guān)注
71文章
2869瀏覽量
176273 -
腳本
+關(guān)注
關(guān)注
1文章
396瀏覽量
28327 -
Vivado
+關(guān)注
關(guān)注
19文章
828瀏覽量
68127
原文標(biāo)題:Tcl在Vivado中的應(yīng)用
文章出處:【微信號(hào):FPGA算法工程師,微信公眾號(hào):FPGA算法工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Tcl在Vivado中的基礎(chǔ)應(yīng)用
如何利用Tcl在Vivado中實(shí)現(xiàn)定制化的FPGA設(shè)計(jì)流程?

在Vivado圖形化界面IDE中運(yùn)行和調(diào)試Tcl命令
用 TCL 定制 Vivado 設(shè)計(jì)實(shí)現(xiàn)流程
Vivado設(shè)計(jì)之Tcl定制化的實(shí)現(xiàn)流程

在Vivado下利用Tcl腳本對(duì)綜合后的網(wǎng)表進(jìn)行編輯過程

Tcl在Vivado中的基礎(chǔ)應(yīng)用

Vivado使用誤區(qū)與進(jìn)階——在Vivado中實(shí)現(xiàn)ECO功能

如何使用Tcl命令語言讓Vivado HLS運(yùn)作
Tcl在Vivado中的基礎(chǔ)應(yīng)用及優(yōu)勢(shì)

FPGA設(shè)計(jì)中Tcl在Vivado中的基礎(chǔ)應(yīng)用
用TCL定制Vivado設(shè)計(jì)實(shí)現(xiàn)流程

Vivado設(shè)計(jì)套件Tcl命令參考指南

評(píng)論