李 卿,惠 鋒,董志丹
(無錫中微億芯有限公司,江蘇無錫 214072)
隨著 FPGA(Field-Programmable Gate Array)的發(fā)展,對其工作頻率和處理速度的要求越來越高。器件處理速度的提高意味著邏輯設(shè)計時對時鐘信號方面的要求和處理也變得更嚴(yán)格,需要通過附加約束來控制邏輯的綜合、映射、布局和布線,以減少邏輯和布線的傳輸延時,從而提高工作頻率。因此,用戶約束在電子設(shè)計自動化(Electronic Design Automation,EDA)工具使用中不可或缺,是自主研發(fā)EDA工具的重要組成部分。由于用戶約束規(guī)則復(fù)雜繁多、靈活多變,如何簡單、有效地實現(xiàn)約束文件的解析至關(guān)重要,本文提出一種采用TCL(Tool Command Language)語言來實現(xiàn)用戶約束文件的解析方法。
TCL是一種基于字符串的解釋型命令語言,是一種簡明、高效、可移植性好的編程語言,具有可擴展、支持重用、簡單易學(xué)等特點。TCL語言作為應(yīng)用的粘合劑,能夠無縫地將很多應(yīng)用集成在一起,并且每一條TCL語句都可以理解成命令參數(shù)形式[1]。它適合與C集成,C程序調(diào)用TCL的解釋器來運行腳本;C函數(shù)也可作為TCL過程。由于其功能強大且簡單易學(xué),故TCL常被用于快速原型開發(fā)、腳本編程、GUI(圖形用戶界面)、測試等[2]。
TCL是一種解釋執(zhí)行的腳本語言,支持變量、循環(huán)、過程等使用的編程元素。其功能強大,基礎(chǔ)結(jié)構(gòu)和語法非常簡單,與其他開發(fā)語言相比,TCL語言需要學(xué)習(xí)的知識少,編寫的代碼量也少,易于學(xué)習(xí)和掌握。TCL還是一種跨平臺語言,適用于多個開發(fā)平臺之間的代碼移植,在Windows平臺下開發(fā)的程序代碼在多數(shù)情況下可以直接移植到Linux平臺下。另外,TCL和它的大多數(shù)擴展都是免費開源軟件,在互聯(lián)網(wǎng)上很容易下載到,極大地方便了開發(fā)者的使用[3]。
TCL主要包含兩部分:腳本語言和為之而設(shè)計的解釋器。TCL語言命令的基本語法如式(1)所示,其中Command代表內(nèi)置的命令名稱或TCL進(jìn)程,arg1、arg2、arg3等代表命令的參數(shù),參數(shù)與命令或參數(shù)之間用空格符分開,參數(shù)都是字符串,通過回車換行或者分號來結(jié)束一條命令[4]。
TCL解釋器是一個C語言函數(shù)庫,它提供了豐富的C語言調(diào)用接口,可以很容易地嵌入至C語言的程序中,從而實現(xiàn)在C應(yīng)用程序中執(zhí)行TCL的命令或腳本,具體流程如圖1所示[5]。此外,TCL提供了豐富的功能擴展函數(shù),允許用戶編寫新的命令解釋程序,加入TCL的解釋器中。
圖1 TCL執(zhí)行流程
由于用戶約束規(guī)則復(fù)雜、多變,為達(dá)到設(shè)計的簡潔性、靈活性、可擴展性,采用C與TCL交互的方式實現(xiàn)。在TCL文件中,首先根據(jù)用戶約束規(guī)則聲明所有的約束規(guī)則,然后定義該約束的解析規(guī)則,最后讀取用戶約束文件并根據(jù)解析規(guī)則進(jìn)行逐行解析。TCL解析結(jié)果通過調(diào)用命令處理過程反饋給C應(yīng)用程序,進(jìn)而應(yīng)用至布局、布線等流程,按照用戶約束設(shè)計實現(xiàn)FPGA的整個設(shè)計流程,如圖2所示。
圖2 設(shè)計流程
在TCL代碼中實現(xiàn)約束文件的解析主要分為聲明約束規(guī)則、定義解析規(guī)則、解析用戶約束,下面分模塊進(jìn)行闡述。
用戶約束規(guī)則復(fù)雜繁多,為了便于后續(xù)的擴展和移植,首先根據(jù)約束規(guī)則聲明該規(guī)則,當(dāng)約束規(guī)則更改或添加新的約束規(guī)則時只需要修改或添加聲明即可,非常簡潔方便。聲明約束規(guī)則的格式如式(2)所示:
其中declare為關(guān)鍵字,是自定義的TCL處理過程,在該過程中獲取聲明的約束名、約束參數(shù)、約束條件,并定義該約束應(yīng)執(zhí)行的解析處理過程,執(zhí)行流程如圖3所示。
圖3 declare處理流程
以創(chuàng)建時鐘為例,其用戶約束語句一般如下所示:
create_clock-period 100-name clk[get_ports PCLK]
根據(jù)其規(guī)則,聲明的約束規(guī)則如下所示:
declarecreate_clock{
{-period Float{$par>=0} }
{-name String }
{-waveform List{type_Float{length($length>=2&&($length%2)==0)}}}
{port_pin_listList }
{-add Flag }
}{param(-period)&& (param(-name)||param(port_pin_list))}
各字段的解釋如表1所示。
表1 約束規(guī)則說明
根據(jù)已聲明的約束規(guī)則,定義相應(yīng)的解析規(guī)則,當(dāng)解析用戶約束文件時,根據(jù)該規(guī)則逐條進(jìn)行解析。首先獲取用戶約束語句中的約束名稱與參數(shù),并根據(jù)該約束名稱查找已聲明的約束規(guī)則;然后逐個遍歷參數(shù),獲取其參數(shù)名與參數(shù)值,并根據(jù)值類型、值約束條件校驗該參數(shù)值是否合法,若合法則保存該參數(shù)名與參數(shù)值鍵值對;當(dāng)遍歷完所有參數(shù),根據(jù)聲明的約束條件校驗整條語句是否合法,若合法則調(diào)用回調(diào)函數(shù)將結(jié)果返回至C程序。整個處理流程如圖4所示。
采用TCL打開用戶約束文件并逐行讀取約束語句,根據(jù)定義的解析規(guī)則解析該約束語句,并將解析結(jié)果通過調(diào)用命令處理過程返回至C程序中,進(jìn)而應(yīng)用至布局、布線等流程。其流程如圖5所示。
圖4 定義解析規(guī)則
圖5 解析用戶約束
本文所述的用戶約束文件解析方法已應(yīng)用至自主研發(fā)的EDA工具中。例如:圖6為用戶約束文件,圖7、圖8為解析結(jié)果在GUI中的顯示,通過對比發(fā)現(xiàn),解析結(jié)果全部正確。
圖6 用戶約束文件
圖7 GUI顯示解析結(jié)果(創(chuàng)建時鐘)
圖8 GUI顯示解析結(jié)果(位置約束)
利用TCL實現(xiàn)用戶約束文件的解析,首先聲明約束規(guī)則,然后定義解析規(guī)則,非常適用于規(guī)則繁多、復(fù)雜多變的文件解析,當(dāng)約束規(guī)則更改或者添加新的約束規(guī)則時只需要修改或添加相應(yīng)的聲明、解析規(guī)則即可,非常靈活方便,具有很強的可擴展性與可移植性,便于后期的維護工作。
參考文獻(xiàn):
[1]趙麗.基于TCL腳本的自動化測試工具的研究與實現(xiàn)[J].信息化研究,2009,35(11).
[2]陸天宇,孔嘯.基于TCL語言的CAE流程自動化系統(tǒng)設(shè)計[J].制造業(yè)自動化,2012,01(上):3-7.
[3]馬飛,劉琦,尹娜,包斌.Tcl/Tk語言FPGA邏輯IP庫實現(xiàn)方法研究[J].電子測量技術(shù),2014,37(1).
[4]John K,Ousterhout Ken Jones.Tcl/Tk入門經(jīng)典[M].第2版.北京:清華大學(xué)出版社,2010.
[5]楊怡玲,王換招,管旭東.利用Tcl/Tk實現(xiàn)X Windows下的GUI[J].微電子學(xué)與計算機,1999,1.
[6]李杰.IP核驗收平臺搭建與圖形用戶界面開發(fā)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2015.