金臻++姜麗梅
摘要:在FPGA設(shè)計過程中,功能仿真(前仿真)使用EDA工具將硬件描述語言(設(shè)計源代碼)用仿真器解析并進(jìn)行功能驗證,而設(shè)計中則采用的芯片廠商的工具進(jìn)行綜合及布局布線,兩者對硬件描述語言的解析采用的工具不同,可能會導(dǎo)致對代碼的理解不一致,仿真結(jié)果與實際設(shè)計功能不一致。在使用VHDL進(jìn)行FPGA設(shè)計時,當(dāng)對時鐘信號進(jìn)行賦值后,在本文的情況下,目前主流EDA工具在信號賦值語句的解析實際設(shè)計均不一致,在FPGA設(shè)計過程中應(yīng)盡量避免使用該類語法,仿真驗證過程中應(yīng)對此予以關(guān)注。
關(guān)鍵詞:FPGA;VHDL;功能仿真;綜合;布局布線
中圖分類號:TM13 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2017)02-0111-03
1 引言
當(dāng)前的FPGA設(shè)計流程一般都是通過EDA[1]開發(fā)軟件和編程工具對FPGA芯片進(jìn)行開發(fā),開發(fā)流程通常包括電路設(shè)計與輸入、功能仿真、綜合優(yōu)化、綜合后仿真、實現(xiàn)與布局布線、時序仿真、板級仿真與驗證、調(diào)試與加載配置等主要步驟[2]。其中每個步驟所采用的EDA工具都不盡相同。
由于功能仿真的工具和綜合布局布線的工具不同,本文從一個功能仿真與綜合布局布線結(jié)果不一致的例子引出了對VHDL代碼中可能引起功能仿真結(jié)果不正確的原因的分析。
2 功能仿真、綜合、布局布線的基本目的和常用工具
功能仿真又叫邏輯仿真,是指在不考慮器件延時和布線延時的理想情況下對源代碼進(jìn)行邏輯功能的驗證[3]。功能仿真的主要目的是確定一個設(shè)計是否實現(xiàn)了預(yù)定的功能或設(shè)計意圖,分析電路的邏輯關(guān)系的正確性[4],由于仿真速度快,可以根據(jù)需要觀察電路輸入輸出端口和電路內(nèi)部任意信號和寄存器的波形,因此功能仿真是設(shè)計過程中不可缺少的步驟。目前功能仿真常用的EDA工具為Mentor公司Modelsim/QuestaSim、Sysnopsys公司的VCS和Cadence公司的NC等軟件。
綜合是將RTL級的行為描述轉(zhuǎn)化為使用門級單元的結(jié)構(gòu)描述[5]即網(wǎng)表。網(wǎng)表文件主要記錄的是所用工藝庫門級單元之間的互連關(guān)系(即門級結(jié)構(gòu))。而布局布線則是對網(wǎng)表中的每一個門級單元在器件中定位(布局) , 并使用器件內(nèi)的連線資源按照網(wǎng)表中的連接關(guān)系連接起來(布線)的操作[4]。因為綜合和布局布線將軟件設(shè)計與硬件的可實現(xiàn)性掛鉤,是將軟件轉(zhuǎn)化為硬件電路的關(guān)鍵步驟[6]。由于綜合和布局布線與FPGA底層資源關(guān)系緊密,根據(jù)采用的芯片不同,一般設(shè)計人員采用各個FPGA廠家自己推出的綜合開發(fā)工具。
3 功能仿真結(jié)果與實際功能不一致案例
在對某個采用VHDL編寫的FPGA設(shè)計進(jìn)行功能仿真和硬件調(diào)試中發(fā)現(xiàn)兩者結(jié)果不一致的情況。分析結(jié)果發(fā)現(xiàn)硬件功能與設(shè)計意圖一致,而功能仿真發(fā)生錯誤。設(shè)計代碼可簡化如圖1。
根據(jù)代碼分析設(shè)計意圖為:時鐘信號CLKA在該設(shè)計中進(jìn)行了被賦值給了sys_clk信號,即將信號CLKA重命名為sys_clk,用重命名后的時鐘信號sys_clk對Gate信號進(jìn)行延遲1個時鐘周期產(chǎn)生信號Gate_r。而使用VCS仿真結(jié)果如圖2所示。
用sys_clk信號對時鐘CLKA信號產(chǎn)生的Gate信號進(jìn)行延遲時,仿真器顯示Gate_r與Gate信號波形一致;同時將Gate信號進(jìn)行賦值,則Gate_wr信號為Gate_w延遲1個時鐘,與設(shè)計意圖不一致。
4 不一致原因分析
分析代碼發(fā)現(xiàn),由于在設(shè)計中對時鐘信號進(jìn)行了賦值(重命名),導(dǎo)致該時鐘產(chǎn)生的信號用賦值后的時鐘進(jìn)行延時處理時,第一個節(jié)拍的延遲未起作用,仿真的信號比實際信號在該處提前一個時鐘周期跳變,仿真功能與實際設(shè)計不一致。
我們試用Modelsim仿真發(fā)現(xiàn),仿真結(jié)果與VCS仿真結(jié)果一致(圖3)。根據(jù)VHDL信號語法特性結(jié)合仿真器工作原理分析如下:
(1)在VHDL中,在進(jìn)程(process)外的信號賦值有一定的延時[7],在仿真是對應(yīng)于在等式右邊的信號值跳變后的delta時間后;
(2)在進(jìn)程(process)內(nèi)信號的賦值在進(jìn)程結(jié)束時起作用[8];
(3)仿真中,時鐘上升沿判斷后也會產(chǎn)生一個delta時間;
(4)仿真中,進(jìn)程(process)內(nèi)信號的時鐘邊沿賦值是將時鐘信號跳變時刻等式右側(cè)的信號值在時鐘跳變后的delta時間賦值給左側(cè)的被賦值信號;
打開仿真器的List信號分析信號跳變過程(圖4),針對圖2的設(shè)計代碼分析如下,
(1)CLKA的跳變產(chǎn)生了第一個delta時間(420ns + 1);
(2)由于代碼中的賦值語句“sys_clk<=CLKA”仿真過程多了個delta時間(420ns +2),因此process外的信號sys_clk在420ns +2處由0跳變?yōu)?;
(3)而process 中的時鐘邊沿賦值Gate<=1 也在CLKA上升沿后的delta時刻(420ns +2)將CLKA上升沿跳變時刻(420ns + 1)的1賦值給Gate。
(4)對于process 中的時鐘邊沿賦值Gate_r<=Gate,賦值發(fā)生在時鐘信號sys_clk上升沿跳變時刻(420ns+2)后的delta時間(420ns+3),而在仿真器發(fā)現(xiàn)在sys_clk由0跳變?yōu)?的420ns +2時刻,Gate =1,所以在420ns +3時刻,Gate_r被賦值為1。
盡管Gate_r的跳變晚于Gate,但僅晚了一個delta時間,不占用仿真時間,所以導(dǎo)致了從波形仿真結(jié)果看Gate_r與Gate同時跳變的現(xiàn)象。
而對以上代碼使用芯片廠商開發(fā)工具進(jìn)行綜合和布局布線,很顯然,Gate_r在時鐘sys_clk的賦值將被綜合成觸發(fā)器(如圖5),sys_clk的賦值(重命名)將被綜合成線連接,sys_clk等同于CLKA。從硬件實現(xiàn)看,Gate_r實際布局布線后將晚于Gate一個時鐘周期而不是一個仿真用的delta時間。因此,功能仿真結(jié)果和布局布線后實際功能不一致。
5 糾正措施分析
根據(jù)上面的機(jī)理分析,對于本段代碼,以下兩個方法均可以使得功能仿真與設(shè)計一致:
方法一:將設(shè)計中的Gate_r的賦值條件由sys_clk改為CLKA時,仿真結(jié)果與預(yù)期結(jié)果一致,再次觀察Modelsim信號List,可見由于少了時鐘賦值語句,420ns處未出現(xiàn)420 +3時刻,Gate_r的賦值發(fā)生在時鐘信號CLK從0跳變?yōu)?且Gate=1(460ns + 1)時刻后的delta時間(460ns +2),功能與設(shè)計一致。
方法二:對Gate信號也同時進(jìn)行一次賦值產(chǎn)生Gate_w信號,在process中依然將該信號用sys_clk上升沿采樣賦值,則Gate_wr信號為Gate信號延遲一個時鐘周期。仿真波形如圖5所示,觀察仿真器的信號List,可以發(fā)現(xiàn),仿真過程和上一種改法是不一致的。仿真器依然產(chǎn)生了420ns +3時刻,但由于Gate_w信號的跳變在420 +3時刻發(fā)生,Gate_wr信號的跳變依然晚于Gate信號一個時鐘周期,在460 +3時跳變,因此仿真結(jié)果與設(shè)計實際要求一致。
6 結(jié)語
根據(jù)VHDL中對于信號賦值的延時特性,仿真器的原理嚴(yán)格按照VHDL語法進(jìn)行,而廠商的綜合布局布線工具卻更加考慮到底層電路的特性。因此在基于VHDL的FPGA設(shè)計中,對時鐘信號的賦值在因為VHDL語法種信號賦值特性的原因可能會造成仿真器的解析與期望不一致的情況。經(jīng)測試,這種解析方式為仿真器EDA廠商的一致做法,我們利用手上多個版本的VCS和Modelsim均無法避免這種現(xiàn)象的發(fā)生。同時,由于verilog語法中,進(jìn)程外的信號賦值僅相當(dāng)于重命名操作,不存在延時,故此類問題在verilog的仿真中不會出現(xiàn)。
對于FPGA設(shè)計人員,在VHDL設(shè)計中應(yīng)特別注意避免對時鐘信號的賦值操作,以免出現(xiàn)為了功能仿真的結(jié)果正確性改動代碼后導(dǎo)致實際功能錯誤的情況。
在FPGA的驗證工作中,由于沒有有效的自動檢測手段,在分析VHDL代碼時,驗證人員也應(yīng)重點(diǎn)注意設(shè)計代碼中有沒有對時鐘賦值操作,以及該操作會不會影響功能仿真結(jié)果,避免漏測問題或者誤測問題,必要時進(jìn)行綜合后仿真或布局布線后仿真對功能仿真結(jié)果進(jìn)行確認(rèn)。
參考文獻(xiàn)
[1]梁麗.EDA技術(shù)在現(xiàn)代電子設(shè)計中的應(yīng)用研[J].科技創(chuàng)新與應(yīng)用,2016(35),66-67.
[2]蔣昊,李哲英.基于多種EDA工具的FPGA設(shè)計流程[J].微計算機(jī)信息,2007,23(11-2):201-203.
[3]戚新宇.基于FPGA 設(shè)計的功能仿真和時序仿真[J].航空電子技術(shù),2005,36(03):51-54.
[4]程耀林.FPGA的系統(tǒng)設(shè)計方法解析[J].電子技術(shù),2005(19):91-93.
[5]楊之廉,申明.超大規(guī)模集成電路設(shè)計方法學(xué)導(dǎo)論[M].北京:清華大學(xué)出版社,2000.
[6]潘松.電子設(shè)計自動化(EDA)技術(shù)及其應(yīng)用(一)[J].電子與自動化,2000(1):52-55.
[7]侯伯亨,顧新.VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計[M].西安電子科技大學(xué)出版社,1999.
[8]楊丹.VHDL中的信號與變量[J].電子工程師,2006,32(11):53-55.