金臻++姜麗梅



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