用智能的調(diào)試與綜合技術(shù)隔離FPGA設(shè)計(jì)中的錯(cuò)誤
如果您的FPGA設(shè)計(jì)無法綜合或者沒能按預(yù)期在開發(fā)板上正常工作,原因往往不明,要想在數(shù)以千計(jì)的RTL和約束源文件中找出故障根源相當(dāng)困難,而且很多這些文件還可能是其他設(shè)計(jì)人員編寫的??紤]到FPGA設(shè)計(jì)迭代和運(yùn)行時(shí)間的延長,設(shè)計(jì)人員應(yīng)該在設(shè)計(jì)流程的早期階段就找出可能存在的諸多錯(cuò)誤,并想方設(shè)法重點(diǎn)對設(shè)計(jì)在開發(fā)板上進(jìn)行驗(yàn)證。
在特定條件下采用更智能的技術(shù)來隔離特定錯(cuò)誤,找到問題電路的源頭并漸進(jìn)式修復(fù)錯(cuò)誤,這很重要。為了節(jié)省時(shí)間,您可以對時(shí)鐘、約束和模塊級接口進(jìn)行初步設(shè)置檢查以確保符合設(shè)計(jì)規(guī)范,這樣就不必在綜合與布局布線(PR)時(shí)浪費(fèi)大量時(shí)間。
Synopsys公司的Synplify Premier 和Synplify Pro FPGA設(shè)計(jì)工具以及Identify RTLDebugger 等產(chǎn)品能幫助設(shè)計(jì)人員完成上述工作。這些工具的特性使得設(shè)計(jì)人員能快速隔離錯(cuò)誤,有效縮短運(yùn)行時(shí)間,并減少開發(fā)板啟動(dòng)所需的迭代次數(shù)。
精確找到開發(fā)板上的問題
如果開發(fā)板出現(xiàn)明顯的功能性錯(cuò)誤,要縮小查找問題根源的范圍可能會(huì)相當(dāng)困難。為了進(jìn)行設(shè)計(jì)調(diào)試,我們應(yīng)當(dāng)創(chuàng)建附加電路并保留某些節(jié)點(diǎn),以便我們對設(shè)計(jì)運(yùn)行時(shí)得到的數(shù)據(jù)進(jìn)行探測、檢查和分析。下面我們就看看如何用板級調(diào)試軟件來查找錯(cuò)誤。
按下列四步法并利用RTL調(diào)試器,您能精確查找問題,并對信號和關(guān)注的條件采樣,然后將觀察結(jié)果關(guān)聯(lián)至原始RTL,從而將問題鎖定在RTL規(guī)范或約束設(shè)置范圍內(nèi)。
第一步:指定探測。在RTL中明確要監(jiān)控哪些信號和條件。在此要聲明您所感興趣的觀察點(diǎn)(要觀察的信號或節(jié)點(diǎn))和斷點(diǎn)(RTL控制流程聲明,如IF、THEN 和CASE 等)。
第二步:通過探測構(gòu)建設(shè)計(jì)。利用附加的監(jiān)控電路——即用于根據(jù)您的監(jiān)控要求捕捉并導(dǎo)出調(diào)試數(shù)據(jù)的智能內(nèi)部電路仿真器(IICE)——對FPGA設(shè)計(jì)進(jìn)行綜合。
第三步:分析和調(diào)試。設(shè)計(jì)綜合完成之后,運(yùn)行設(shè)計(jì)并用RTL調(diào)試器觀察數(shù)據(jù)。在開發(fā)板上運(yùn)行測試時(shí),觀察點(diǎn)和斷點(diǎn)共同觸發(fā)數(shù)據(jù)采樣,使您能在您所關(guān)注的非常明確的條件下觀察并調(diào)試特定節(jié)點(diǎn)的電路的行為。您可將觀察到的采
樣數(shù)據(jù)寫入VCD 文件并將其關(guān)聯(lián)到RTL。
第四步:漸進(jìn)性修復(fù)錯(cuò)誤(incrementaLfix)。一旦找到了錯(cuò)誤所在,就可以通過分級、漸進(jìn)式流程在RTL或約束中漸進(jìn)地進(jìn)行修復(fù)。
時(shí)序和功能性錯(cuò)誤的可視檢查
FPGA設(shè)計(jì)和調(diào)試工具還有一大優(yōu)點(diǎn),就是能顯示RTL和網(wǎng)表級原理圖。舉例來說,具有互動(dòng)調(diào)試功能的原理圖查看器能夠顯示設(shè)計(jì)的RTL和網(wǎng)表原理圖,便于您進(jìn)行觀察并將時(shí)序報(bào)告和VCD 數(shù)據(jù)(設(shè)計(jì)在開發(fā)板上運(yùn)行時(shí)產(chǎn)生)關(guān)聯(lián)至RTL源文件。查看器包含一個(gè)RTL視圖,用來以圖示的方式描述設(shè)計(jì)。該視圖在綜合RTL編譯階段后提供,由技術(shù)獨(dú)立的加法器、寄存器、大型多路選擇器和狀態(tài)機(jī)等組件構(gòu)成。通過RTL原理圖,您可以交叉探測原始RTL,對不符合預(yù)定規(guī)范的設(shè)計(jì)進(jìn)行調(diào)整,同時(shí)也可以探測到約束編輯器,從而更簡便地更新和指定約束(圖1)。
要將錯(cuò)誤操作的源頭追溯到RTL,您可以利用RTL調(diào)試器在RTL原理圖上方實(shí)時(shí)插入觀察到的操作數(shù)據(jù)。
原理圖查看器包括一個(gè)網(wǎng)表級技術(shù)視圖,用于顯示綜合后的實(shí)際設(shè)計(jì)實(shí)現(xiàn)情況。在HDLAnalyst 原理圖查看器中,該視圖基于查找表、寄存器和DSP slice 等基本的賽靈思器件原語。您可在原理圖中對路徑進(jìn)行交叉探測,追溯到原始的RTL以及綜合后和布局布線后的最終時(shí)序報(bào)告,以便分析和提高整體性能。
在FPGA中原型設(shè)計(jì)的ASIC 門控時(shí)鐘結(jié)構(gòu)并非FPGA實(shí)現(xiàn)中的必要環(huán)節(jié),這會(huì)導(dǎo)致FPGA資源使用效率低下。解決該問題的有效辦法就是用FPGA綜合軟件轉(zhuǎn)換時(shí)鐘。
大型設(shè)計(jì)的調(diào)試
在大型設(shè)計(jì)中探測所有信號是不可能,因?yàn)樯傻臄?shù)據(jù)量極為龐大,而且探測數(shù)據(jù)所需的額外調(diào)試邏輯也太大。片上調(diào)試方法的一個(gè)常見弊病是難以提前預(yù)測需要對哪些信號進(jìn)行探測和監(jiān)控。
一些調(diào)試軟件通過分治法能夠在一定程度上解決這個(gè)問題。利用多路復(fù)用的采樣組,設(shè)計(jì)人員可以有選擇性地進(jìn)行采樣并通過多路復(fù)用的路徑和共享的IICE 在信號組之間切換。這種方法增加了可觀察的信號和條件,而且不會(huì)增加數(shù)據(jù)存儲(chǔ)要求。您可以即時(shí)切換感興趣的信號組,不必花時(shí)間進(jìn)行重新調(diào)整或重新綜合新的設(shè)計(jì)。
不幸的是,在探測和采樣數(shù)據(jù)時(shí)用使的調(diào)試IICE 邏輯會(huì)占用包括存儲(chǔ)器BRAM 在內(nèi)的芯片資源。您可在SRAM 存儲(chǔ)卡中對IICE 采樣數(shù)據(jù)進(jìn)行片外存儲(chǔ),以減少片上BRAM 的使用。這種方法的另一個(gè)好處是能增加采樣數(shù)據(jù)的深度。
我的設(shè)計(jì)無法綜合
設(shè)計(jì)錯(cuò)誤的出現(xiàn)可能導(dǎo)致無法實(shí)現(xiàn)有效綜合或布局布線。由于存在成千上萬的RTL和約束源文件,因此可能需要幾個(gè)星期才能完成首次綜合與布局布線。進(jìn)行FPGA原型設(shè)計(jì)時(shí),應(yīng)讓ASIC 設(shè)計(jì)源文件處于“FPGA就緒”狀態(tài)。舉例來說,就是要進(jìn)行門時(shí)鐘轉(zhuǎn)換。
在FPGA中原型設(shè)計(jì)的ASIC門控時(shí)鐘結(jié)構(gòu)并非FPGA實(shí)現(xiàn)中的必要環(huán)節(jié),這會(huì)導(dǎo)致FPGA資源使用效率低下。解決該問題的有效辦法就是用FPGA綜合軟件轉(zhuǎn)換時(shí)鐘。例如,門控或生成時(shí)鐘轉(zhuǎn)換功能可將生成時(shí)鐘和門控時(shí)鐘邏輯從順序組件的時(shí)鐘引腳轉(zhuǎn)移到使能引腳,這樣您就能將順序組件直接綁定到源時(shí)鐘,消除偏移問題,并減少設(shè)計(jì)中所需的時(shí)鐘源數(shù)量,進(jìn)而節(jié)約資源。
在Synplify Premier 軟件中啟用門控時(shí)鐘選項(xiàng):
– 選擇Project->Implementation Options
– 在GCC Prototyping Tools 標(biāo)簽中點(diǎn)擊Clock Conversion checkbox
或在TCL中使用以下命令
set_option -fix_gated_and_generated_ clocks 1
在Synplify Pro/Premier 中執(zhí)行門控和生成時(shí)鐘轉(zhuǎn)換,而set_option -conv_mux_xor_gated_clocks 1則針對基于Synopsys HAPS 的設(shè)計(jì)在Synplify Premier 時(shí)鐘樹的多路選擇器或OR 門上執(zhí)行門控時(shí)鐘轉(zhuǎn)換。
“完整”的系列時(shí)鐘約束包括在所有正確位置定義時(shí)鐘并在生成的時(shí)鐘之間定義關(guān)系。有時(shí)候,時(shí)鐘會(huì)出于某種原因與真正的源斷開關(guān)聯(lián),例如時(shí)鐘源和時(shí)鐘目標(biāo)端間產(chǎn)生了黑盒,這樣會(huì)造成順序組件的時(shí)鐘缺失或時(shí)鐘約束放置錯(cuò)誤,導(dǎo)致首次時(shí)鐘轉(zhuǎn)換因?yàn)槿鄙贂r(shí)鐘約束而失敗。在許多情況下,轉(zhuǎn)換失敗是由約束不完整造成的。舉例來說,門控邏輯中可能存在一個(gè)組合回路,應(yīng)在時(shí)鐘轉(zhuǎn)換之前利用異常處理約束將其打破。綜合編譯階段之后會(huì)提供一個(gè)門控時(shí)鐘報(bào)告,告訴您有哪些門控和生成時(shí)鐘已被轉(zhuǎn)換以及被轉(zhuǎn)換時(shí)鐘的名稱、類型、分組和相關(guān)約束。另一個(gè)時(shí)鐘列表則顯示的是未轉(zhuǎn)換的時(shí)鐘,并包含故障信息,用于說明原因。圖2 給出了報(bào)告實(shí)例。
舉例來說,如果設(shè)計(jì)中有黑盒子,您可以在RTL中指定具體的軟件命令,用于為自動(dòng)化門控時(shí)鐘轉(zhuǎn)換提供輔助。比方說,采用syn_gatedclk_clock_en 指令在黑盒子中指定啟用引腳的名稱,用syn_gatedclk_clock_en_polarity 指令指出黑盒子上時(shí)鐘使能端口的極性。每個(gè)轉(zhuǎn)換實(shí)例和驅(qū)動(dòng)實(shí)例的時(shí)鐘引腳都被賦予一個(gè)可搜索的屬性,從而能在設(shè)計(jì)數(shù)據(jù)庫中識別,并提取到定制TLC/Find 腳本生成報(bào)告中。
端口不匹配
設(shè)計(jì)包含公司內(nèi)外部提供的文件。在設(shè)計(jì)中進(jìn)行IP 實(shí)例化或預(yù)驗(yàn)證分級模塊時(shí),經(jīng)常會(huì)出現(xiàn)“端口不匹配”錯(cuò)誤,而且難以檢測,特別是出現(xiàn)在混合語言設(shè)計(jì)中更是如此。舉例來說,如果頂層VHDL實(shí)體“Top”實(shí)例化Verilog 模塊“sub”,那么頂層VHDL聲明sub 有4 位端口,而實(shí)際Verilog 模塊只有3 位端口。就Synplify Premier 軟件而言,會(huì)立即將其標(biāo)記為不匹配,并在單獨(dú)的日志報(bào)告中通過超級鏈接引用該錯(cuò)誤。
視圖work.sub.syn_black_box 和視圖work.sub.verilog 之間的接口不匹配
細(xì)節(jié):
========
源視圖work.sub.syn_black_box 中的以下位端口在目標(biāo)視圖work.sub.verilog 中不存在。
=======================================
Bit Port in1[4]
Bit Port in2[4]
Bit Port dout[4]
多級層次中,如何將不匹配問題追蹤到問題模塊的RTL定義呢?工具應(yīng)以某種方式給所有模塊實(shí)例打標(biāo)簽,比方說采用orig_inst_of 屬性。屬性的值包括模塊的原始RTL名稱,可方便地檢索至RTL。例如,假設(shè)sub_3s 導(dǎo)致端口不匹配錯(cuò)誤,那么我們就能用以下TCL命令找回RTL模塊的原始名稱“sub”:get_prop -prop orig_inst_of {v:sub_3s} 返回值為“sub”。
約束的清除
指定充足且正確的約束將影響到結(jié)果質(zhì)量和功能。約束聲明通常應(yīng)包括三個(gè)元素:主時(shí)鐘和時(shí)鐘組定義、異步時(shí)鐘聲明、錯(cuò)誤和多循環(huán)路徑聲明。
進(jìn)行綜合之前檢查約束是一個(gè)很好的方法。提供約束查看器的工具能發(fā)現(xiàn)語法錯(cuò)誤并分析時(shí)序約束和實(shí)例名稱是否適用,警示問題所在。比方說,它會(huì)報(bào)告通配符擴(kuò)展后約束如何應(yīng)用以及在定義時(shí)鐘約束后產(chǎn)生的時(shí)鐘關(guān)系。它會(huì)標(biāo)出那些由于參數(shù)或?qū)ο箢愋蜔o效或不存在而未被應(yīng)用的時(shí)序約束。
進(jìn)行綜合之前,在Synplify Pro/Premier 軟件中生成名為projectName_cck.rpt 的約束檢查器報(bào)告:
Synplify Pro/Premier GUI: Run -> Constraint check
或采用TCL命令:project -run constraint_check
注意,要避免潛在的MetA不穩(wěn)定性,應(yīng)運(yùn)行“異步時(shí)鐘報(bào)告”,提醒您注意那些在一個(gè)時(shí)鐘域啟動(dòng)而在另一個(gè)時(shí)鐘域中結(jié)束的路徑。
在Synplify Pro/Premier 軟件中生成時(shí)鐘同步報(bào)告projectName_async_clk.rpt.csv:
Synplify Pro/Premier GUI:Analysis->Timing Analyst并選擇Generate Asynchronous Clock Report 選項(xiàng)。
采用TCL命令: set_option -reporting_async_clock
正確的方法是確保您充分且全面地對設(shè)計(jì)進(jìn)行約束,而且不會(huì)過度約束(過度會(huì)導(dǎo)致運(yùn)行時(shí)間延長,生成關(guān)鍵路徑錯(cuò)誤報(bào)告)。確保您已完全指定多周期和錯(cuò)誤路徑,并且已為得到的時(shí)鐘設(shè)置了約束(set_multicycle_path,set_false_path)。
縮短調(diào)試時(shí)間
實(shí)施潛在的RTL或約束故障解決方案可能需要好幾個(gè)小時(shí)才能看出結(jié)果。我們來看看如何利用分級“分治法”設(shè)計(jì)方法和“錯(cuò)誤繼續(xù)”功能在單次綜合迭代中發(fā)現(xiàn)多個(gè)錯(cuò)誤,從而減少迭代次數(shù)。
為縮短運(yùn)行時(shí)間,模塊化流程必不可少。這種流程支持設(shè)計(jì)保存,能鎖定已經(jīng)證明有效的設(shè)計(jì)部分。支持模塊化流程的工具能幫助您在進(jìn)行綜合前創(chuàng)建RTL分區(qū),也就是編譯點(diǎn)。一些軟件還能幫助設(shè)計(jì)人員將有故障的設(shè)計(jì)部分變成黑盒子,徹底將該部分導(dǎo)出并作為獨(dú)立的設(shè)計(jì)子項(xiàng)目進(jìn)行再加工。一旦解決問題,子項(xiàng)目還能夠以網(wǎng)表形式通過自下而上的流程或用作為RTL通過自上而下的流程整合回原設(shè)計(jì),甚至還能綜合利用自上而下和自下而上兩種流程。
要集成和調(diào)試大型設(shè)計(jì),應(yīng)盡早在設(shè)計(jì)進(jìn)程中發(fā)現(xiàn)錯(cuò)誤的說明。舉例來說,“錯(cuò)誤繼續(xù)”功能可提供涉及每個(gè)綜合通過信息的組合錯(cuò)誤報(bào)告。“錯(cuò)誤繼續(xù)”能容許非致命的非語法HDL編譯問題和某些映射錯(cuò)誤,因此設(shè)計(jì)人員可在每次綜合迭代中分析并完成盡可能多的設(shè)計(jì)內(nèi)容。為了在帶有SynplifyPro/Premier GUI 的Synplify Premier 軟件中調(diào)用“錯(cuò)誤繼續(xù)”功能,應(yīng)啟用項(xiàng)目視圖左側(cè)的Continue-on-Error 選項(xiàng)。
在TCL中:set_option –continue_on_error 1
用屬性is_error_blackbox=1 標(biāo)記故障模塊和帶接口錯(cuò)誤的實(shí)例父模塊,如圖3 所示。
用TCL找到所有“故障實(shí)例”:
c_list [find -hier -inst * -filter
@is_error_blackbox==1]
用TCL列出所有“故障模塊”:
get_prop -prop inst_of [find -hier -inst
* -filter @is_error_blackbox==1]
要查看將被關(guān)入黑盒子或?qū)С龅墓收夏K,請查找HDLAnalyst RTL視圖中的紅色塊(圖3)。
通過導(dǎo)出模塊隔離問題
您可將故障模塊作為完全獨(dú)立的綜合項(xiàng)目導(dǎo)出,以便專門對該模塊進(jìn)行調(diào)試。導(dǎo)出過程會(huì)產(chǎn)生隔離的綜合項(xiàng)目,其中包含所有該模塊的源文件、語言標(biāo)準(zhǔn)和編譯庫,以及所含文件的目錄路徑和路徑順序,以達(dá)到對該模塊進(jìn)行單獨(dú)綜合與調(diào)試的目的。如前一節(jié)所示,出現(xiàn)錯(cuò)誤的模塊會(huì)自動(dòng)在設(shè)計(jì)數(shù)據(jù)庫中標(biāo)出錯(cuò)誤屬性,并在設(shè)計(jì)原理圖中突出顯示,便于對該模塊進(jìn)行查找和提取。
為了導(dǎo)出模塊及其所有相關(guān)源文件進(jìn)行隔離調(diào)試,應(yīng)首先在Synplify Pro/Premier 軟件GUI 中(圖4)的設(shè)計(jì)分級視圖或RTL視圖中選擇設(shè)計(jì)模塊或?qū)嵗?,然后點(diǎn)擊右鍵并在彈出菜單中選擇“Generate Dependent File List”。
將每個(gè)分級模塊的錯(cuò)誤進(jìn)行修復(fù)后,您可將其再集成到設(shè)計(jì)中,既可作為RTL在整個(gè)設(shè)計(jì)環(huán)境中重新綜合(自上而下的綜合流程),也可作為網(wǎng)表(自下而上的流程)進(jìn)行綜合(見圖5)。
要滿足時(shí)序要求就不可避免地要用到設(shè)計(jì)分級,這可能會(huì)帶來挑戰(zhàn)。層級界限可能會(huì)限制性能,除非為設(shè)計(jì)的每個(gè)層級分區(qū)建立時(shí)序預(yù)算。使用RTL分區(qū)(也稱為手動(dòng)鎖定編譯點(diǎn))時(shí),一些工具能自動(dòng)設(shè)置時(shí)序預(yù)算。Synplify Pro/Premier 軟件還能提供自動(dòng)編譯點(diǎn),能創(chuàng)建自動(dòng)分區(qū),比方說通過多處理加速運(yùn)行速度。預(yù)算功能為每個(gè)RTL分區(qū)建立接口邏輯模型(ILM),這樣軟件就能知道如何滿足每個(gè)分區(qū)的時(shí)序目標(biāo)。這樣,您可為每個(gè)編譯點(diǎn)指定一個(gè)約束文件,從而覆蓋手動(dòng)鎖定編譯點(diǎn)自動(dòng)時(shí)序預(yù)算。
Synopsy 近期進(jìn)行的全球用戶調(diào)查發(fā)現(xiàn),59% 的設(shè)計(jì)人員認(rèn)為“設(shè)計(jì)規(guī)范的正確性”是最重要的設(shè)計(jì)挑戰(zhàn)之一。這個(gè)挑戰(zhàn)會(huì)造成設(shè)計(jì)延期,最壞情況下可能導(dǎo)致設(shè)計(jì)失敗。設(shè)計(jì)工具必須能盡早捕捉到錯(cuò)誤,并就設(shè)計(jì)工作提供更高的可視化,確保設(shè)計(jì)規(guī)范得到有效驗(yàn)證和修復(fù)。這些工具還必須就提出的設(shè)計(jì)修復(fù)方案提供反饋途徑。
評論