戰(zhàn):從源碼重跑仿真到燒錄全流程解析)
簡(jiǎn)介面向廣工EDA與數(shù)字邏輯課程的Libero實(shí)驗(yàn)資源包涵蓋門電路、組合邏輯和時(shí)序邏輯芯片的仿真驗(yàn)證并包含編碼器擴(kuò)展、譯碼器擴(kuò)展、有符號(hào)比較器、二-十進(jìn)制碼轉(zhuǎn)換、狀態(tài)機(jī)自動(dòng)售貨機(jī)、跑馬燈等綜合實(shí)驗(yàn)從基礎(chǔ)門電路到狀態(tài)機(jī)設(shè)計(jì)由淺入深適合本科數(shù)字邏輯課程學(xué)生對(duì)照完成報(bào)告或復(fù)習(xí)。壓縮包內(nèi)共2000個(gè)文件約26MB以log仿真日志、txt說明、xml工程配置、srs/svf及v源代碼等為主還包含docx實(shí)驗(yàn)報(bào)告和運(yùn)行截圖目錄按實(shí)驗(yàn)歸類便于按模塊檢索。全部芯片均提供完整代碼與測(cè)試平臺(tái)代碼運(yùn)行截圖和報(bào)告結(jié)構(gòu)完整能幫助讀者快速核對(duì)仿真結(jié)果、理解Libero從建工程到仿真的完整設(shè)計(jì)流程。其中還覆蓋考核部分可作考前強(qiáng)化與課程設(shè)計(jì)參考。目前已有3000余人瀏覽學(xué)習(xí)組織清晰適合需要系統(tǒng)完成EDA實(shí)驗(yàn)或進(jìn)行數(shù)字電路仿真的學(xué)習(xí)者直接復(fù)用。 開學(xué)季一到身邊總有人在問EDA實(shí)驗(yàn)作業(yè)怎么交。前兩天還有人發(fā)我一份壓縮包名字就叫“廣工-EDA實(shí)驗(yàn)報(bào)告-總Libero源代碼.zip”。這種資源包我見得多了里面一般是一堆報(bào)告文檔加一個(gè)Libero工程看起來(lái)交作業(yè)綽綽有余。但如果你直接把報(bào)告改個(gè)名就交上去那真是浪費(fèi)了這個(gè)包最大的價(jià)值——那份能跑通全流程的Libero源代碼工程才是你把這門課學(xué)到手的鑰匙。這篇我把這類“EDA實(shí)驗(yàn)報(bào)告Libero源碼”項(xiàng)目的完整玩法拆開講一遍從壓縮包里有什么、工程文件怎么組織到如何重跑一遍仿真和綜合再到報(bào)告里的截圖和分析該怎么讀、怎么寫。用的是以Libero為核心的FPGA設(shè)計(jì)流程適合正在做EDA課程設(shè)計(jì)、手里捏著類似源碼包但不知道從哪下手的同學(xué)。1. 拿到“總報(bào)告源碼”壓縮包先搞清你要交的是什么1.1 一份EDA實(shí)驗(yàn)作業(yè)的完整交付物先說結(jié)論這類實(shí)驗(yàn)要交的從來(lái)不是單一文件而是一整套能證明“我做了、我做對(duì)了、我理解了”的材料。解壓那種“總源碼”的包你通常能看到這幾樣?xùn)|西實(shí)驗(yàn)報(bào)告文檔Word或PDF里面包含實(shí)驗(yàn)?zāi)康摹⒃砜驁D、仿真波形截圖、資源利用率表、實(shí)驗(yàn)總結(jié)。Libero工程文件夾包含HDL源文件、約束文件、仿真testbench以及綜合布線后的工程數(shù)據(jù)庫(kù)。可能有工程導(dǎo)出包或燒寫文件.stp、.job、.pro等方便老師復(fù)現(xiàn)或燒錄驗(yàn)證。這三部分缺一不可。報(bào)告負(fù)責(zé)講清楚思路源碼負(fù)責(zé)證明項(xiàng)目真實(shí)可跑燒寫文件負(fù)責(zé)讓結(jié)果可復(fù)現(xiàn)。老師查作業(yè)時(shí)最頭疼的就是“報(bào)告寫得漂亮但源碼打不開”所以你交作業(yè)前一定要自己把工程重新打開跑一遍別真當(dāng)壓縮包是免檢產(chǎn)品。1.2 為什么課程作業(yè)要求“報(bào)告源碼”一起交很多同學(xué)不理解覺得“我代碼能仿真不就行了報(bào)告抄一抄嘛”。真實(shí)情況是EDA課程的核心考核點(diǎn)是兩個(gè)一是設(shè)計(jì)能力和工具鏈?zhǔn)炀毝榷潜磉_(dá)和歸納能力。源碼交給工具一跑行不行一目了然報(bào)告則是看你對(duì)設(shè)計(jì)思路、關(guān)鍵技術(shù)、異常處理的理解深度。所以看那種寫得好的實(shí)驗(yàn)報(bào)告你會(huì)發(fā)現(xiàn)它不是把波形圖貼一堆而是圍繞設(shè)計(jì)思路講清楚“我用了幾個(gè)模塊、每個(gè)模塊負(fù)責(zé)什么、時(shí)序怎么對(duì)齊、為什么選這個(gè)方案”。源碼是骨架報(bào)告才是血肉兩者必須對(duì)應(yīng)得上。1.3 動(dòng)手前先確認(rèn)工具環(huán)境拿到源碼包先別急著打開先確認(rèn)兩件事Libero的版本和License。Microchip的Libero IDE版本之間有差異高版本打開低版本工程一般沒問題反過來(lái)就容易報(bào)“Project created with newer version”之類的問題。建議先看壓縮包里的工程文件后綴如果是較老的.pri工程最好裝一個(gè)兼容版本如果是新版的.prjx建議用與工程創(chuàng)建時(shí)接近的版本。License這塊更實(shí)際。Libero的License分Node-Locked和Floating兩種學(xué)校機(jī)房一般用的是浮動(dòng)License在家里自己跑要記得配置License路徑否則綜合、布線這些環(huán)節(jié)會(huì)卡住。別問我怎么知道的我第一次在家打開虛擬機(jī)里的Libero整整研究了一個(gè)小時(shí)License最后發(fā)現(xiàn)是環(huán)境變量沒配好。2. Libero工程的文件結(jié)構(gòu)源碼到底藏在哪些目錄里2.1 標(biāo)準(zhǔn)目錄結(jié)構(gòu)與每個(gè)文件的作用很多人拿到工程文件夾就蒙了一行行點(diǎn)進(jìn)去發(fā)現(xiàn)全是看不懂的配置。我直接給你畫個(gè)重點(diǎn)。一個(gè)典型的Libero工程目錄是這樣的project_name.prjx # 工程主文件 components/ # SmartDesign組件或核生成文件 hdl/ # 用戶編寫的Verilog/VHDL源碼 stimulus/ # testbench仿真激勵(lì)文件 constraints/ # 管腳約束(.pdc)和時(shí)序約束(.sdc) synthesis/ # 綜合后的網(wǎng)表和報(bào)告 designer/ # 布局布線后的結(jié)果最值得你翻的其實(shí)就三個(gè)地方hdl目錄放的是你自己寫的邏輯代碼stimulus目錄放的是仿真測(cè)試文件constraints目錄決定信號(hào)接到FPGA哪個(gè)管腳、時(shí)鐘跑多快。交作業(yè)時(shí)要保證這三個(gè)目錄齊全缺了任何一個(gè)負(fù)責(zé)檢查的人都沒法復(fù)現(xiàn)你的結(jié)果。2.2 從頂層模塊看整個(gè)設(shè)計(jì)思路打開hdl目錄里的Verilog文件你會(huì)發(fā)現(xiàn)源代碼并不是一坨平鋪的代碼而是按模塊劃分的通常有一個(gè)頂層模塊top level下面例化了各功能子模塊??炊创a最快的方式就是“自頂向下”先找頂層模塊看它例化了哪幾個(gè)子模塊、信號(hào)怎么互聯(lián)然后逐個(gè)進(jìn)入子模塊讀邏輯。給大家舉個(gè)例子如果是典型的數(shù)字頻率計(jì)實(shí)驗(yàn)頂層模塊下面一般會(huì)有分頻模塊、計(jì)數(shù)器模塊、鎖存顯示模塊如果是數(shù)字鐘就會(huì)有秒脈沖模塊、時(shí)/分/秒計(jì)數(shù)器、數(shù)碼管譯碼驅(qū)動(dòng)。模塊劃分清晰是實(shí)驗(yàn)加分項(xiàng)也是老師判斷“這是不是自己寫的”的重要依據(jù)。讀源碼時(shí)建議在Libero里打開“Design Hierarchy”視圖能直接看到模塊樹和端口連接關(guān)系比單純翻文本高效得多。2.3 testbench里的大學(xué)問stimulus目錄下的testbench是整個(gè)工程里最容易被忽略但也是最有價(jià)值的部分。它不給綜合器用只給仿真器用作用就是在沒有FPGA板子的時(shí)候模擬輸入信號(hào)。很多同學(xué)看testbench就看個(gè)時(shí)鐘產(chǎn)生和復(fù)位釋放其實(shí)里面的信號(hào)命名、仿真時(shí)間段設(shè)置、斷言寫法直接體現(xiàn)設(shè)計(jì)者對(duì)模塊行為的理解程度。實(shí)驗(yàn)報(bào)告里貼的那些波形圖全都是testbench跑出來(lái)的。學(xué)會(huì)分析和改寫testbench就等于掌握了“自己驗(yàn)證設(shè)計(jì)”的核心能力。3. 把源代碼工程重跑一遍從仿真到燒錄的全流程3.1 導(dǎo)入源碼并修正工程環(huán)境拿到別人的Libero工程第一步不是F5仿真而是先“認(rèn)親”——確認(rèn)工程能完整加載。雙擊.prjx文件打開Libero后如果彈出的信息提示庫(kù)文件缺失或器件型號(hào)不符先記下來(lái)再去Project Settings里檢查目標(biāo)器件。Libero里器件型號(hào)對(duì)不上是常事。比如實(shí)驗(yàn)開發(fā)板用的是Microchip的IGLOO2或者SmartFusion系列但工程默認(rèn)器件可能選錯(cuò)這時(shí)需要重新選擇正確的FPGA型號(hào)然后重新綜合。記住換器件后約束文件里的管腳分配也要重新核對(duì)這是最容易出錯(cuò)的一步。3.2 行為仿真先跑通功能再說其他一切正常后進(jìn)入仿真環(huán)節(jié)。Libero自帶仿真集成環(huán)境默認(rèn)調(diào)用ModelSim或QuestaSim。在Stimulus Hierarchy里選中testbench文件點(diǎn)擊Simulation按鈕即可啟動(dòng)行為仿真。仿真跑起來(lái)之后你會(huì)看到波形窗口里輸出的信號(hào)變化。這里有個(gè)實(shí)用習(xí)慣別只看頂層信號(hào)把子模塊的輸出信號(hào)也拖進(jìn)波形窗口觀察。比如你做計(jì)數(shù)器就同時(shí)把計(jì)數(shù)器的進(jìn)位信號(hào)、鎖存信號(hào)一起看這樣發(fā)現(xiàn)問題后在子模塊層級(jí)定位會(huì)更準(zhǔn)。第一次跑仿真如果波形一團(tuán)亂先檢查復(fù)位信號(hào)是否釋放、時(shí)鐘是否正常翻轉(zhuǎn)——這兩個(gè)是90%問題的根源。3.3 綜合從代碼到網(wǎng)表的關(guān)鍵一步仿真通過后進(jìn)入綜合階段。綜合Synthesize就是把Verilog/VHDL代碼變成由LUT、觸發(fā)器、布線資源組成的網(wǎng)表。在Libero里點(diǎn)擊Synthesize按鈕工具會(huì)自動(dòng)調(diào)用Synplify或Libero SoC自帶的綜合器。綜合完成后重點(diǎn)看兩個(gè)輸出Resource Utilization資源利用率和Compiler Report。資源利用率表會(huì)告訴你用了多少寄存器、多少查找表時(shí)序報(bào)告會(huì)告訴你最高能跑多快。如果資源爆了或時(shí)序不收斂就得回到代碼層面優(yōu)化。這一步是EDA實(shí)驗(yàn)報(bào)告里“硬件資源分析”部分的直接素材。3.4 布局布線、生成燒寫文件、下載到開發(fā)板綜合完的網(wǎng)表還要經(jīng)過布局布線Place Route才能真正落到FPGA的物理資源上。Libero的Designer視圖里點(diǎn)擊Place Route工具會(huì)自動(dòng)完成管腳分配、布線優(yōu)化并生成時(shí)序收斂報(bào)告。最后在Program Design階段生成燒寫文件通常是用FlashPro把編程文件下載到開發(fā)板上。需要注意下載前要確認(rèn)開發(fā)板JTAG連線正確、FlashPro驅(qū)動(dòng)安裝好、電源供電正常。板上跑通后實(shí)驗(yàn)報(bào)告里通常還會(huì)補(bǔ)上實(shí)物運(yùn)行照片或示波器截圖這屬于加分項(xiàng)有條件的同學(xué)一定別省。4. 實(shí)驗(yàn)報(bào)告里那些波形截圖和資源利用率到底應(yīng)該怎么讀數(shù)4.1 仿真波形不只是截圖要截圖“有意義的部分”實(shí)驗(yàn)報(bào)告里最不值錢的是整屏倒計(jì)時(shí)波形最值錢的是能說明關(guān)鍵功能的局部波形。貼波形前先問自己這段波形證明了什么舉例來(lái)說如果是設(shè)計(jì)要求“每秒鐘加一”的計(jì)數(shù)器那你在報(bào)告里就應(yīng)該截出一段完整的秒脈沖信號(hào)和對(duì)應(yīng)的計(jì)數(shù)器輸出變化并用文字標(biāo)注出“當(dāng)秒脈沖上升沿到來(lái)時(shí)計(jì)數(shù)值從59翻轉(zhuǎn)為00”讓讀報(bào)告的人一眼看出進(jìn)位邏輯正確。具體操作上使用ModelSim/QuestaSim時(shí)可以點(diǎn)擊波形窗口的縮放工具把感興趣的時(shí)間段放大到能看清楚每個(gè)時(shí)鐘沿的程度。截圖前把信號(hào)名改成有意義的標(biāo)識(shí)可以給信號(hào)重命名再用光標(biāo)測(cè)量功能標(biāo)記關(guān)鍵事件位置。這樣貼出來(lái)的圖才叫證據(jù)否則就是噪音。4.2 資源利用率和時(shí)序報(bào)告從數(shù)字里看出問題綜合報(bào)告里的資源利用率一般長(zhǎng)這樣資源類型已使用可用利用率LUT415638404.1%DFF22138405.8%I/O32若干視封裝而定讀這個(gè)表的重點(diǎn)是看“有沒有突破預(yù)期”。比如你只寫了個(gè)8位計(jì)數(shù)器結(jié)果占用了上千個(gè)LUT那大概率是綜合器把你習(xí)慣性寫的always塊推斷成了復(fù)雜邏輯回去優(yōu)化才是正道。時(shí)序報(bào)告看的是“最高時(shí)鐘頻率”和“建立/保持時(shí)間裕量”。如果設(shè)計(jì)工作在50MHz時(shí)序報(bào)告說最大頻率是58MHz那比較穩(wěn)如果報(bào)告算出來(lái)最大頻率是49MHz說明設(shè)計(jì)接近臨界實(shí)驗(yàn)結(jié)果可能時(shí)好時(shí)壞建議回頭檢查組合邏輯路徑是否過長(zhǎng)。4.3 RTL視圖與Technology Map視圖兩張圖的價(jià)值Libero綜合工具能生成RTL Viewer和Technology Map Viewer。RTL視圖顯示的是綜合優(yōu)化前的邏輯結(jié)構(gòu)比如狀態(tài)機(jī)長(zhǎng)什么樣、哪兩個(gè)模塊之間有一長(zhǎng)串加法器Technology視圖顯示的是映射到FPGA基本單元后的結(jié)構(gòu)。報(bào)告里貼RTL視圖的好處是能直觀展示你的設(shè)計(jì)架構(gòu)。但要記住截圖后一定要在圖片下方寫一句圖例說明比如“圖3 數(shù)字鐘模塊級(jí)RTL結(jié)構(gòu)圖”并在正文中引用它。沒有引用的圖、沒有圖號(hào)標(biāo)注的圖在評(píng)審時(shí)的說服力會(huì)大打折扣。5. 踩坑記錄路徑、版本、License和報(bào)告協(xié)作的那些坑5.1 工程路徑和文件命名的詭異坑使用Libero有一個(gè)約定工程路徑不要有中文、不要有空格、不要放在桌面。這不是玄學(xué)而是FPGA工具鏈中很多子程序編譯、仿真、燒錄都是老牌命令行工具對(duì)非ASCII字符支持很差。路徑帶中文時(shí)經(jīng)常出現(xiàn)ModelSim能啟動(dòng)但編譯報(bào)錯(cuò)、FlashPro找不到下載文件的情況。文件命名也盡量用字母和下劃線開頭別用數(shù)字開頭??吹焦こ汤锏哪K名是top_module沒問題模塊名是2_counter這類綜合時(shí)大概率報(bào)語(yǔ)法錯(cuò)誤。這類問題遇到一次就長(zhǎng)記性我見過太多人折騰半天結(jié)果只是因?yàn)槲募麕Я酥形摹?.2 版本兼容性與工程移植Libero的工程格式在不同大版本之間不是完全兼容的。老版本工程用新版打開大多能自動(dòng)升級(jí)但升級(jí)后部分IP核需要重新生成反過來(lái)新版工程用舊版Libero直接打不開。如果壓縮包里同時(shí)給了.v源文件和testbench最穩(wěn)妥的方式是新建一個(gè)工程手工添加源文件繞開工程升級(jí)的兼容問題。這個(gè)方法我推薦給所有“想真正掌握流程”的同學(xué)新建工程、添加HDL文件、添加約束文件、寫testbench、跑仿真全套流程走一遍。經(jīng)驗(yàn)值比直接打開別人工程高十倍后面面試或做項(xiàng)目時(shí)你才能不怵。5.3 License連接問題的排查順序如果你在Libero里點(diǎn)綜合或布線時(shí)彈窗提示License不可用按順序排查L(zhǎng)icense環(huán)境變量是否指向正確路徑License server是否可達(dá)如果是浮動(dòng)License檢查服務(wù)器IP和端口系統(tǒng)時(shí)間是否準(zhǔn)確時(shí)間偏差過大會(huì)導(dǎo)致License驗(yàn)證失敗是否在防火墻里放行Libero相關(guān)進(jìn)程。其中系統(tǒng)時(shí)間偏差這個(gè)坑最隱蔽VirtualBox虛擬機(jī)里做完快照恢復(fù)后經(jīng)常出現(xiàn)。遇到License問題先對(duì)表再對(duì)服務(wù)器再檢查環(huán)境變量這個(gè)順序能省很多時(shí)間。5.4 報(bào)告協(xié)作時(shí)盡量統(tǒng)一工具版本如果是組隊(duì)作業(yè)最好統(tǒng)一Libero版本和使用同一個(gè)工程路徑。否則你改完的工程發(fā)過去隊(duì)友打不開還要來(lái)回倒文件最后可能悄悄退回到你發(fā)給他的舊版本整套修改瞬間全部丟失。建議用Git管理源碼和報(bào)告哪怕只是本地倉(cāng)庫(kù)commit記錄能救命。最后說點(diǎn)實(shí)在話我剛開始學(xué)EDA時(shí)也踩過同樣的坑以為拿到一個(gè)現(xiàn)成的Libero源碼包就能高枕無(wú)憂結(jié)果交作業(yè)前三天才發(fā)現(xiàn)工程版本對(duì)不上、仿真庫(kù)沒編譯白白熬了兩個(gè)晚上。后來(lái)學(xué)會(huì)了一招不管拿到誰(shuí)的工程都當(dāng)成“陌生代碼庫(kù)”去讀一遍從頂層模塊開始順著例化關(guān)系把每個(gè)子模塊的邏輯吃透再親手重建一個(gè)空工程把源碼加進(jìn)去、仿真、綜合、布線、生成燒寫文件整套流程走完才算真正把這個(gè)實(shí)驗(yàn)裝進(jìn)腦子里。對(duì)你來(lái)說也是一樣。壓縮包里的報(bào)告和源代碼只是起點(diǎn)重跑流程、理解和外推才是你在這門課里最值得投入的時(shí)間。以后無(wú)論是做畢業(yè)設(shè)計(jì)還是參加電賽Libero這套流程的底子都會(huì)一直在你手邊。本文還有配套的精品資源點(diǎn)擊獲取