楊怡雯 曾梓萱 趙巖 李長(zhǎng)庚
摘? 要:Verilog HDL作為描述數(shù)字電路的通用語言,在大規(guī)模設(shè)計(jì)中一般采用層次化和結(jié)構(gòu)化的設(shè)計(jì)方法。為了在獲得較優(yōu)的電路面積結(jié)果的同時(shí)提高綜合后輸出網(wǎng)表的可讀性,使用Python和正則表達(dá)式對(duì)Verilog代碼進(jìn)行層次化展平處理,用模塊內(nèi)的設(shè)計(jì)代碼替換實(shí)例化語句。打平層次結(jié)構(gòu)后,設(shè)計(jì)代碼變?yōu)闆]有層次的、不帶參數(shù)、不帶可選擇配置的扁平鏈?zhǔn)浇Y(jié)構(gòu),提高了代碼的可維護(hù)性。此實(shí)踐項(xiàng)目難度適中,有助于學(xué)生深入理解Verilog HDL的語法結(jié)構(gòu)和EDA軟件的工作原理,提高了學(xué)生的設(shè)計(jì)實(shí)踐能力。
關(guān)鍵詞:正則表達(dá)式;Python;代碼扁平化;課程教學(xué)
中圖分類號(hào):TP39;G434? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):2096-4706(2023)02-0171-04
Integrated Circuit Design and EDA Technology Course Professional Ability Training Practice
—RTL Design Hierarchical Flattening Processing
YANG Yiwen, ZENG Zixuan, ZHAO Yan, LI Changgeng
(School of Physics and Electronics, Central South University, Changsha? 410083, China)
Abstract: As a general language for describing digital circuits, Verilog HDL generally adopts hierarchical and structured design methods in large-scale designs. In order to obtain better circuit area results while improving the readability of the synthesized output netlist, Python and regular expressions are used to hierarchically flatten the Verilog code, replacing instantiated statements with in-module design code. After flattening the hierarchical structure, the design code became a flat chain structure without hierarchy, parameters, optional configuration, which improves the maintainability of the code. The difficulty of this practice project is moderate, which helps students to deep understand the grammatical structure of Verilog HDL and the working principle of EDA software, and improves students' design practice ability.
Keywords: regular expression; Python; code flattening; course teaching
0? 引? 言
電子設(shè)計(jì)自動(dòng)化(Electronic Design Automation, EDA)是現(xiàn)代電子系統(tǒng)設(shè)計(jì)有效的工具[1]。隨著設(shè)計(jì)規(guī)模越來越大,集成電路尤其是大規(guī)模數(shù)字集成電路的設(shè)計(jì)過程不僅包含邏輯和電路設(shè)計(jì),其所采用的半定制電路設(shè)計(jì)方法也高度依賴EDA設(shè)計(jì)工具和設(shè)計(jì)流程來保證設(shè)計(jì)的正確性。EDA技術(shù)與集成電路相輔相成,先進(jìn)的EDA技術(shù)可以設(shè)計(jì)大規(guī)模的集成電路,而大規(guī)模的集成電路則又支持更先進(jìn)的EDA技術(shù)開發(fā),兩者在數(shù)字化和智能化的現(xiàn)代電子系統(tǒng)開發(fā)中起著支撐作用[2]。EDA技術(shù)應(yīng)用充分體現(xiàn)了數(shù)字電子設(shè)計(jì)中自頂向下的演繹過程[3],充分理解軟件工具的行為,有助于提高學(xué)生的設(shè)計(jì)實(shí)踐能力。在專用集成電路設(shè)計(jì)課程的教學(xué)中,作者組織學(xué)有余力的同學(xué)參與科研項(xiàng)目,使用Python完成了EDA工具中讀入RTL代碼時(shí)的一個(gè)預(yù)處理功能——層次化設(shè)計(jì)的展平處理。
對(duì)于較大規(guī)模的設(shè)計(jì),一般采用層次化和結(jié)構(gòu)化的設(shè)計(jì)方法。這種設(shè)計(jì)方法可以很好地維持設(shè)計(jì)邊界和層次,符合人的思維方式并利于復(fù)用代碼。但是EDA邏輯綜合工具在把RTL描述轉(zhuǎn)換為門級(jí)網(wǎng)表的時(shí)候,會(huì)以每一個(gè)模塊的邊界作為默認(rèn)的邏輯優(yōu)化邊界,模塊劃分過小或者層次過多的時(shí)候,不能獲得最優(yōu)的電路面積結(jié)果。若在綜合命令中加入“-flat”選項(xiàng),綜合工具會(huì)將所選擇的層次結(jié)構(gòu)打平后再進(jìn)行優(yōu)化,在獲得較優(yōu)的面積結(jié)果的同時(shí),輸出網(wǎng)表的可讀性較差,會(huì)給調(diào)試工作帶來不便。
硬件描述語言(HDL)是一種用形式化方法來描述數(shù)字電路和設(shè)計(jì)數(shù)字邏輯系統(tǒng)的語言[4]。由于絕大多數(shù)的數(shù)字集成電路設(shè)計(jì)以及FPGA設(shè)計(jì)都以VerilogHDL的代碼為載體,本文針對(duì)Verilog HDL語法,在層次化結(jié)構(gòu)的展平處理中,主要完成以下內(nèi)容:用模塊內(nèi)的設(shè)計(jì)代碼替換實(shí)例化語句,主要是模塊內(nèi)代碼信號(hào)的唯一化和輸入輸出的替換操作;對(duì)于帶有parameter的參數(shù)化設(shè)計(jì),將實(shí)例化時(shí)的參數(shù)變成沒有參數(shù)的設(shè)計(jì);對(duì)于帶有g(shù)enerate的可配置化設(shè)計(jì),實(shí)例化時(shí)從可配置的代碼中選擇代碼進(jìn)行提??;對(duì)于帶有define和ifdef的宏定義參數(shù),判斷決定代碼保留。經(jīng)層次結(jié)構(gòu)打平后,代碼使用扁平的鏈?zhǔn)浇Y(jié)構(gòu)。
1? 處理對(duì)象及工具
“模塊”是Verilog的基本設(shè)計(jì)單元,在一個(gè)模塊中引用另一個(gè)模塊,對(duì)其端口進(jìn)行關(guān)聯(lián),叫作模塊的例化。在一個(gè)頂層設(shè)計(jì)中實(shí)例化子模塊電路,類似于編程中在主函數(shù)調(diào)用子函數(shù)。模塊的例化建立了描述的層次,一個(gè)復(fù)雜的電路往往通過模塊嵌套形成了復(fù)雜的層次結(jié)構(gòu)。而去層次化則類似于編程中將用調(diào)用函數(shù)實(shí)現(xiàn)的代碼轉(zhuǎn)換為不用函數(shù),而是直接在主程序中實(shí)現(xiàn)各個(gè)函數(shù)的內(nèi)部代碼。經(jīng)過去層次化后,設(shè)計(jì)代碼變?yōu)榇蚱降摹]有層次的、不帶參數(shù)、不帶可選擇配置的代碼。在Python中,re模塊就是一個(gè)用于處理正則表達(dá)式的模塊[5]。鑒于Python強(qiáng)大的文本處理能力,本文采用Python和正則表達(dá)式對(duì)Verilog HDL代碼的文本進(jìn)行處理。
正則表達(dá)式被提出時(shí),主要用于描述正則集代數(shù)。它是提供計(jì)算機(jī)操作和檢驗(yàn)所要抽取的字符串?dāng)?shù)據(jù)的一種強(qiáng)大的工具,是一串由特定意義的字符組成的字符串,提供了一種從字符集合中搜尋特定字符串的規(guī)則。正則表達(dá)式可以運(yùn)用于多種操作系統(tǒng)中,目前很多計(jì)算機(jī)語言都支持正則表達(dá)式匹配,如C++、PHP、Java等。
正則表達(dá)式最基本的3種功能包括匹配、替換和提取。匹配功能用于判斷文本里面是否有符合要求的字符,將不同的字符按照匹配內(nèi)容的不同進(jìn)行分組,如在此項(xiàng)目實(shí)踐中將宏定義的標(biāo)識(shí)符和內(nèi)容根據(jù)“`”符號(hào)區(qū)分。替換功能用于在文檔中使用匹配模式來標(biāo)識(shí)特定文字,然后進(jìn)行刪除或進(jìn)行替換,如刪除注釋、端口名和參數(shù)聲明名稱的替換、generate語句中帶有$符號(hào)的標(biāo)識(shí)符和begin/end語句的替換。提取功能用于從字符串中提取子字符串,如獲取需要的變量名稱、模塊名稱、判斷語句、模塊內(nèi)容等。Verilog繼承了C語言的多種操作符和結(jié)構(gòu),其本身就是一系列字符串組成的文本,在信息抽取的過程中完全適應(yīng)正則表達(dá)式的特點(diǎn)。
正則表達(dá)式由普通字符和特殊字符組成,在正則表達(dá)式中,可以用方括號(hào)括起若干個(gè)字符來表示一個(gè)元字符(特殊字符)。同時(shí)正則表達(dá)式支持限定符的概念。限定符指定輸入中必須存在字符、組或字符類的多少實(shí)例才能找到匹配項(xiàng),這些限定符可以指定正則表達(dá)式的一個(gè)給定組間需要出現(xiàn)多少詞才能滿足匹配,因而可以適應(yīng)一些不確定情況[6]。正則表達(dá)式常見的元字符和限定符如表1所示。
2? 處理和實(shí)現(xiàn)過程
2.1? 方法總述
首先讀入頂層模塊文件和子模塊文件。如有宏定義文件,則對(duì)宏定義文件先進(jìn)行處理,提取宏定義的名字和參數(shù),在子模塊中進(jìn)行名字和參數(shù)的替換。對(duì)于每一個(gè)讀入的子模塊文件,若該子模塊在頂層模塊中被例化,則對(duì)子模塊文件進(jìn)行處理,提取所需內(nèi)容,并在頂層模塊找到例化該模塊的部分,提取對(duì)應(yīng)內(nèi)容進(jìn)行替換。整體流程如圖1所示。
2.2? 處理宏定義文件
對(duì)于需要方便改動(dòng)的常量和參數(shù),可以使用宏定義的方式來引用。使用宏可以在不修改源代碼的情況下修改設(shè)計(jì),在IP核生成和流程測(cè)試中很有用,不僅可以保證代碼具有良好的可配置性,還能提高代碼的規(guī)范性和可讀性。由于Verilog中宏定義往往采用一個(gè)單獨(dú)的文件,提取文件中宏定義的名字和參數(shù),替換掉文本內(nèi)容中的宏定義的變量,進(jìn)行宏展開。例如,宏定義文件中通過語句“`define `RST_NR 0”來定義參數(shù)“RST_NR”的值為0,依次提取參數(shù)名稱為“RST_NR”,參數(shù)的值為0。再將子模塊中的參數(shù)名稱替換成參數(shù)的值,例如將語句“parameter? nr=`RST_NR”替換成“parameter? nr=0”。
2.3? 處理子模塊文件
對(duì)子模塊的文本進(jìn)行處理。為了便于處理,去掉文本中的單行注釋和多行注釋。此外,要對(duì)文本進(jìn)行內(nèi)容的提取,如圖2所示,具體步驟為:將要處理的①模塊名稱單獨(dú)提取出來,方便再頂層模塊中找到對(duì)應(yīng)的內(nèi)容;對(duì)帶參數(shù)的模塊進(jìn)行例化時(shí),為方便進(jìn)行參數(shù)的修改,應(yīng)提?、趨?shù)名稱和③參數(shù)的值;信號(hào)端口通常采用的是名稱關(guān)聯(lián)的關(guān)聯(lián)方式,④端口名稱是需要提取出來的;模塊內(nèi)會(huì)聲明一些新的變量,為了防止重復(fù)調(diào)用相同模塊導(dǎo)致變量名稱重復(fù)的問題,也要提?、葑兞棵Q進(jìn)行后續(xù)處理;整個(gè)模塊內(nèi)容去除參數(shù)聲明、端口列表和端口聲明,只保留⑥數(shù)據(jù)流語句和行為語句。每一個(gè)標(biāo)號(hào)內(nèi)容都對(duì)應(yīng)圖2標(biāo)號(hào)的示例。
當(dāng)例化多個(gè)相同的模塊時(shí),一個(gè)個(gè)模塊的手動(dòng)例化會(huì)比較煩瑣。用generate語句進(jìn)行多個(gè)模塊的重復(fù)例化,可大大簡(jiǎn)化程序的編寫過程。generate語句也可允許在細(xì)化期間對(duì)語句進(jìn)行條件選擇,根據(jù)傳遞參數(shù)的不同值對(duì)執(zhí)行的代碼進(jìn)行選擇。處理該部分內(nèi)容需要先將整個(gè)generate語句部分提取出來,即以“generate”開始至以“endgenerate”結(jié)束的部分。該部分的處理難點(diǎn)在于存在多個(gè)條件語句和過程結(jié)構(gòu)語句嵌套和并列的情況,造成處理時(shí)難以將每個(gè)語句begin標(biāo)志和end標(biāo)志對(duì)應(yīng)的問題。該問題會(huì)讓提取對(duì)應(yīng)參數(shù)所選擇的正確語句變得困難。因此,本文引入利用棧的數(shù)據(jù)結(jié)構(gòu)和計(jì)數(shù)器的處理方法,具體流程圖如圖3所示。
為了更加直觀的描述該方法,舉例如表2所示。
該方法將對(duì)應(yīng)的begin和end一一配對(duì),解決了難以選取正確的文本內(nèi)容的問題。依次提取判斷語句的情況,因Python與Verilog中表示“且或非”的方法不同,因此需將判斷語句轉(zhuǎn)換為Python語法中的語句,如表3所示。
通過以上代碼進(jìn)行替換后將再進(jìn)行判斷,提取為真語句后的標(biāo)識(shí)符,截取該標(biāo)識(shí)符之間的內(nèi)容,即為所需,對(duì)于表2中的示例,若“st==1”為假,則截取“q_r<={bw{1'b0}};”。最后需將標(biāo)識(shí)符還原成begin和end語句。對(duì)于嵌套和并列的generate語句,也可采用上述標(biāo)識(shí)符的方法來區(qū)分不同的“generate”和“endgenerate”。
2.4? 處理頂層模塊文件
對(duì)頂層模塊進(jìn)行文本處理。出于同樣理由的考慮,去掉文本中的單行注釋和多行注釋。每讀入一遍子模塊,就對(duì)頂層模塊處理一遍,如圖4所示,具體步驟為:根據(jù)讀入的子模塊的①模塊名稱,對(duì)頂層文件中該模塊的內(nèi)容進(jìn)行截取,即⑦模塊內(nèi)容,所有的替換處理都是針對(duì)該子模塊中⑥數(shù)據(jù)流語句和行為語句的內(nèi)容;對(duì)于帶參數(shù)例化的模塊,考慮到參數(shù)例化存在只重置部分參數(shù)的情況,將需要新寫入的⑧新參數(shù)名稱和⑨新參數(shù)值提取出來,根據(jù)⑧新參數(shù)名稱進(jìn)行對(duì)照,用⑨新參數(shù)值替換掉②參數(shù)名稱,未作替換的參數(shù)采用原來③參數(shù)的值替換掉②參數(shù)名稱;模塊例化通常使用按名字進(jìn)行例化的方式,因?yàn)檫@種方式不考慮順序,不容易出錯(cuò),提取出例化模塊的端口名稱,即⑩例化端口名稱,對(duì)應(yīng)④端口名稱將其一一替換成⑩例化端口名稱,而在實(shí)際的項(xiàng)目中,往往會(huì)看到未連接的端口,這些未連接到例化模塊中的端口按高阻態(tài)處理,防止在替換過程中報(bào)錯(cuò),對(duì)應(yīng)的實(shí)例名按照空字符存進(jìn)對(duì)應(yīng)的位置,如④端口名稱“rst_n”所對(duì)應(yīng)的⑩例化端口名稱空字符“”;對(duì)于模塊內(nèi)變量的聲明,為防止多次調(diào)用同一子模塊而出現(xiàn)的聲明名稱重復(fù)的問題,在每次調(diào)用子模塊時(shí)都為該名稱添加包含調(diào)用次數(shù)字符的后綴,以對(duì)模塊內(nèi)的變量進(jìn)行唯一化處理,例如當(dāng)頂層模塊第一次調(diào)用子模塊時(shí),子模塊中的⑤變量名稱需要被替換成加了后綴的?新變量名稱;在所有的名稱和值替換完成之后,處理完畢的⑥數(shù)據(jù)流語句和行為語句替換掉頂層模塊中的⑦模塊內(nèi)容,完成該子模塊的去層次化處理。每一個(gè)標(biāo)號(hào)內(nèi)容都對(duì)應(yīng)圖4標(biāo)號(hào)的示例。
圖4? 頂層模塊處理步驟
3? 結(jié)? 論
EDA軟件屬于當(dāng)下的“卡脖子”技術(shù)之一,如何在本科階段培養(yǎng)學(xué)生對(duì)集成電路設(shè)計(jì)以及EDA軟件設(shè)計(jì)的興趣,也是當(dāng)前教育教學(xué)改革的熱點(diǎn)話題。本文通過RTL設(shè)計(jì)的層次化展平處理,在難度適中的項(xiàng)目中涉及數(shù)字集成電路的結(jié)構(gòu)化設(shè)計(jì)方法、HDL語法、數(shù)據(jù)結(jié)構(gòu)、正則表達(dá)式、Python語言等內(nèi)容,讓學(xué)生在實(shí)踐中深入掌握并靈活運(yùn)用課堂上所學(xué)到的知識(shí),并對(duì)EDA軟件的工作原理建立了初步的理解和認(rèn)識(shí),從而提高學(xué)生的設(shè)計(jì)能力,增加學(xué)生的自主學(xué)習(xí)空間與學(xué)習(xí)自由度,培養(yǎng)學(xué)生的探究能力、創(chuàng)新能力,為日后的工作和科研打下良好的基礎(chǔ);是對(duì)提高集成電路設(shè)計(jì)以及EDA技術(shù)課程教學(xué)效果、提高學(xué)生專業(yè)實(shí)踐能力的有益探索。
參考文獻(xiàn):
[1] 孫進(jìn)輝.EDA技術(shù)在數(shù)字電子實(shí)驗(yàn)設(shè)計(jì)中的合理應(yīng)用分析 [J].實(shí)驗(yàn)室研究與探索,2018,37(2):199-202.
[2] 丁家峰,李新梅,尹林子,等.EDA技術(shù)中自頂向下方法的教學(xué)與實(shí)踐 [J].電氣電子教學(xué)學(xué)報(bào),2020,42(6):91-95.
[3] 丁家峰,李新梅,孫克輝,等.“EDA技術(shù)與應(yīng)用”課程教學(xué)改革與創(chuàng)新 [J].電氣電子教學(xué)學(xué)報(bào),2017,39(6):47-49+59.
[4] 羅杰,康華光.兩種硬件描述語言VHDL/Verilog的發(fā)展及其應(yīng)用 [J].電氣電子教學(xué)學(xué)報(bào),2002(4):1-5.
[5] 馬彤鑫.基于Python的正則表達(dá)式獲取字符串信息 [C]//第三十四屆中國(天津)2020'IT、網(wǎng)絡(luò)、信息技術(shù)、電子、儀器儀表創(chuàng)新學(xué)術(shù)會(huì)議論文集.中國天津:天津市電子學(xué)會(huì)、天津市儀器儀表學(xué)會(huì),2020:299-300.
[6] 張靜,張妍.正則表達(dá)式及其在信息抽取中的應(yīng)用 [J].電腦知識(shí)與技術(shù),2009,5(15):3867-3868.
作者簡(jiǎn)介:楊怡雯(2001—),女,漢族,陜西西安人,本科在讀,研究方向:電子信息。
收稿日期:2022-09-06
基金項(xiàng)目:湖南省教學(xué)改革省級(jí)課題(HNJG-2021-0302);中南大學(xué)教學(xué)改革校級(jí)課題(2021jy063)