仿實(shí)戰(zhàn):Efinity+ModelSim全流程指南)
1. 項(xiàng)目概述為什么易靈思用戶繞不開聯(lián)仿這件事玩過易靈思FPGA的朋友應(yīng)該都有體會(huì)這家公司在國(guó)內(nèi)雖然還算“新面孔”但它的Efinity工具鏈設(shè)計(jì)思路非常現(xiàn)代甚至有點(diǎn)“反傳統(tǒng)”。它不像Xilinx或者Intel那樣把仿真環(huán)境一股腦打包進(jìn)IDE而是默認(rèn)讓你用外部仿真器做驗(yàn)證尤其是ModelSim和Questa Sim這種行業(yè)通用工具。對(duì)我這種從Vivado轉(zhuǎn)過來(lái)的人來(lái)說(shuō)一開始確實(shí)有點(diǎn)懵——明明寫好了testbench卻不知道在Efinity里怎么把仿真跑起來(lái)點(diǎn)遍了菜單也找不到一鍵啟動(dòng)ModelSim的按鈕。后來(lái)踩了幾次坑才明白Efinity的定位就是“你負(fù)責(zé)代碼我負(fù)責(zé)布線”仿真這件事它鼓勵(lì)你交給更專業(yè)的工具去做。這里就引出了聯(lián)仿的概念所謂“聯(lián)仿”就是把FPGA設(shè)計(jì)工程和外部仿真工具連接起來(lái)由外部仿真器讀取你的RTL代碼和testbench執(zhí)行功能仿真或時(shí)序仿真再把結(jié)果送回來(lái)。相比Efinity自帶的輕量仿真功能ModelSim在波形調(diào)試、斷點(diǎn)設(shè)置、覆蓋率分析等方面成熟得多尤其當(dāng)設(shè)計(jì)復(fù)雜度上來(lái)之后兩者的差距就更明顯了。這篇內(nèi)容面向兩類人一是剛接觸易靈思FPGA、被Efinity工具鏈整得有點(diǎn)頭大的新手二是已有其它FPGA平臺(tái)經(jīng)驗(yàn)、想快速切換到易靈思生態(tài)的老手。我會(huì)把完整的聯(lián)仿思路、腳本和排查經(jīng)驗(yàn)全部攤開來(lái)講。2. 環(huán)境準(zhǔn)備版本匹配是聯(lián)仿的第一道門檻2.1 Efinity版本與計(jì)算機(jī)系統(tǒng)兼容性Efinity目前對(duì)Windows和Linux都有支持但不同版本的軟件對(duì)操作系統(tǒng)版本有隱性要求。以我常用的Efinity 2022.2和2023.1為例Windows版本建議Win10 1809以上Linux版本則建議Ubuntu 20.04 LTS或CentOS 7.9以上。這不是說(shuō)低版本系統(tǒng)完全不能用但我在Win10老版本上遇到過莫名其妙的Licensing問題折騰半天最后升級(jí)系統(tǒng)才解決。所以有條件的話盡量保持系統(tǒng)在較新版本能減少很多不必要的麻煩。另外需要注意Efinity安裝路徑不能出現(xiàn)中文或空格這一點(diǎn)和ModelSim的要求一致。我見過有人把Efinity裝到D:\軟件\易靈思 下面結(jié)果綜合階段報(bào)出一堆路徑相關(guān)的詭異錯(cuò)誤把路徑改成D:\eFinity之后一切正常。類似的坑在聯(lián)仿場(chǎng)景下會(huì)被放大因?yàn)榉抡婀ぞ咝枰x取工程里的絕對(duì)路徑如果有中文字符很容易在生成腳本或庫(kù)文件時(shí)出錯(cuò)。2.2 ModelSim版本怎么選才能跟Efinity和平共處ModelSim的版本號(hào)很多Intel版、Mentor版、標(biāo)準(zhǔn)版、DE版……不同的版本在使用體驗(yàn)上差別不小。結(jié)合我自己的測(cè)試和易靈思官方文檔的推薦建議選用ModelSim DE或SE版本盡量避開ModelSim Intel Starter Edition。Starter Edition對(duì)代碼規(guī)模有限制而且有些庫(kù)的支持不完整在仿真易靈思IP核如PLL、RAM時(shí)容易出幺蛾子。版本號(hào)方面我目前用的是ModelSim DE 2022.2配Efinity 2022.2穩(wěn)定運(yùn)行大半年沒出過兼容性問題。2023.1的Efinity我也試過配ModelSim 2023.3同樣沒問題。一個(gè)基本判斷標(biāo)準(zhǔn)是ModelSim版本號(hào)不要比Efinity舊太多比如用ModelSim 10.x去配Efinity 2023.1就不是個(gè)好主意因?yàn)樾掳娴腎P生成腳本可能調(diào)用了老工具不支持的Tcl命令或編譯選項(xiàng)。2.3 License與環(huán)境變量的配置心得ModelSim的License問題幾乎是每個(gè)新手繞不開的坎。如果你用的是正版授權(quán)直接設(shè)置環(huán)境變量MGLS_LICENSE_FILE指向license文件即可。如果是學(xué)習(xí)用途的評(píng)估版需要注意激活方式和版本限制不同版本差異較大建議以官方渠道為準(zhǔn)。我個(gè)人的建議是不論用什么方式獲取License都建議把License文件放在一個(gè)純英文、無(wú)空格的路徑下并且不要放在桌面或下載文件夾這種容易被清理的位置。環(huán)境變量方面除了MGLS_LICENSE_FILE還需要把ModelSim的bin目錄和Efinity的bin目錄分別加入PATH。這樣做的目的是讓你能在命令行里直接調(diào)用vsim、vlog和eFinity的相關(guān)命令方便后續(xù)腳本自動(dòng)化運(yùn)行。Windows用戶在“系統(tǒng)屬性→環(huán)境變量”里添加即可Linux用戶在~/.bashrc里export一下就行。配置好之后在命令行輸入vsim -version能看到版本信息就說(shuō)明環(huán)境沒問題。3. 核心細(xì)節(jié)解析聯(lián)仿腳本到底在做什么3.1 為什么需要腳本而不是手動(dòng)操作很多剛從Vivado轉(zhuǎn)過來(lái)的用戶習(xí)慣在GUI里點(diǎn)點(diǎn)點(diǎn)完成仿真添加文件、編譯庫(kù)、加載設(shè)計(jì)、跑仿真……這一套操作在ModelSim里當(dāng)然也可以做但每次都手動(dòng)操作效率太低而且無(wú)法保證一致性。今天我舉個(gè)例子當(dāng)你修改了RTL代碼需要重新編譯再仿真如果手動(dòng)操作至少要點(diǎn)五六次鼠標(biāo)但如果是腳本一條命令搞定。更重要的是腳本可以放在版本管理庫(kù)里團(tuán)隊(duì)成員拉下來(lái)之后一鍵復(fù)現(xiàn)仿真環(huán)境不會(huì)出現(xiàn)“你那邊跑出來(lái)的波形和我這邊不一樣”的扯皮問題。另外易靈思的Efinity工具鏈本身也是Tcl腳本驅(qū)動(dòng)架構(gòu)它的工程文件、約束文件本質(zhì)上都是腳本。既然工具鏈本身就是腳本化的那我們做仿真再用腳本整體思路保持一致出了問題也更容易追溯。3.2 腳本整體結(jié)構(gòu)與關(guān)鍵命令拆解下面這段是我在項(xiàng)目里實(shí)際使用的聯(lián)仿腳本每次新建仿真工程我都是在這個(gè)基礎(chǔ)上改改路徑就上。我把它拆開講解確保你拿到手就能明白每一行在干什么。# ------------------------------------------------------------- # 腳本名稱sim_run.tcl # 功能說(shuō)明使用ModelSim編譯并仿真易靈思FPGA工程 # 使用方法在ModelSim命令窗口執(zhí)行 source sim_run.tcl # ------------------------------------------------------------- # 1. 清空上一次的仿真工程 quit -sim rm -rf work file delete -force work vlib work # 2. 映射易靈思仿真庫(kù)關(guān)鍵步驟 vmap work work vmap altera_mf_ver C:/intelFPGA_lite/22.1/modelsim_ase/altera_libs/altera_mf_ver vmap lpm_ver C:/intelFPGA_lite/22.1/modelsim_ase/altera_libs/lpm_ver vmap cyclonev_ver C:/intelFPGA_lite/22.1/modelsim_ase/altera_libs/cyclonev_ver vmap twentynm_ver C:/intelFPGA_lite/22.1/modelsim_ase/altera_libs/twentynm_ver # 3. 編譯RTL源碼和Testbench vlog -sv defineSIMULATION -f ./filelist.f # 4. 加載仿真頂層 vsim -voptargsacc work.tb_matrix_top # 5. 添加需要觀察的波形信號(hào) add wave -position insertpoint sim:/tb_matrix_top/clk add wave -position insertpoint sim:/tb_matrix_top/rst_n add wave -position insertpoint sim:/tb_matrix_top/start add wave -position insertpoint sim:/tb_matrix_top/done add wave -position insertpoint sim:/tb_matrix_top/data_in add wave -position insertpoint sim:/tb_matrix_top/data_out # 6. 設(shè)置仿真運(yùn)行時(shí)間并啟動(dòng) run -all這段腳本標(biāo)注了幾個(gè)易靈思聯(lián)仿中特別容易踩的坑我逐個(gè)說(shuō)明。第一行的quit -sim是清理上一次仿真會(huì)話的。如果你上一次仿真進(jìn)程沒有正常退出這一行能保證新腳本在干凈環(huán)境下運(yùn)行。后面的rm -rf work和vlib work是用來(lái)重建工作庫(kù)的這樣每次編譯都是從零開始不會(huì)因?yàn)樵隽烤幾g導(dǎo)致一些莫名其妙的舊模塊殘留問題。第二步的vmap是很多人的認(rèn)知盲區(qū)。ModelSim在編譯帶有廠商IP核的設(shè)計(jì)時(shí)需要把IP核對(duì)應(yīng)的仿真庫(kù)映射到ModelSim中。易靈思的IP核比如PLL、RAM、FIFO在綜合后會(huì)產(chǎn)生仿真模型文件你需要把這些模型文件編譯進(jìn)ModelSim的庫(kù)然后再在仿真時(shí)引用。上面的腳本中我映射了altera的庫(kù)因?yàn)橛行┩ㄓ肐P核用的是Altera兼容方案如果你用的是易靈思原生IP你需要使用vlib和vlog把Efinity生成的仿真模型也編譯進(jìn)去。這個(gè)環(huán)節(jié)特別容易出錯(cuò)一點(diǎn)不夸張——我見過有同事在這個(gè)地方卡了兩天才搞定。第三步的vlog -sv defineSIMULATION -f ./filelist.f是編譯RTL文件和testbench。-sv表示支持SystemVerilog語(yǔ)法defineSIMULATION是定義一個(gè)宏方便代碼里做條件編譯-f ./filelist.f是告訴ModelSim從filelist文件讀取所有需要編譯的文件列表。這個(gè)filelist文件需要你自己維護(hù)把設(shè)計(jì)相關(guān)的.v文件和testbench文件路徑都寫進(jìn)去。我習(xí)慣用相對(duì)路徑這樣整個(gè)工程目錄拷貝到別的電腦上也能直接跑。第四步的vsim -voptargsacc work.tb_matrix_top是加載仿真頂層。注意這里的work.tb_matrix_top指的是testbench模塊不是RTL頂層模塊。-voptargsacc參數(shù)的意思是允許在仿真過程中訪問所有信號(hào)這樣你才能在波形窗口里看到內(nèi)部信號(hào)的變化。如果省掉這個(gè)參數(shù)ModelSim可能會(huì)在優(yōu)化時(shí)把某些信號(hào)優(yōu)化掉波形窗口里就找不到了。第五步的add wave是添加需要觀察的波形信號(hào)。如果你不確定要觀察哪些信號(hào)可以先只添加testbench頂層的時(shí)鐘和復(fù)位等仿真跑起來(lái)之后再到Object窗口拖動(dòng)信號(hào)到波形窗口。但腳本里預(yù)先添加的好處是每次重新仿真不需要再手動(dòng)加一遍信號(hào)省時(shí)省力。最后一步run -all就是讓仿真一直跑下去直到testbench里的$finish被執(zhí)行。有些testbench里沒有$finish仿真就會(huì)無(wú)限跑下去這時(shí)候你可以設(shè)置仿真時(shí)間上限比如run 10us之類的。3.3 filelist文件的組織方式與易靈思工程對(duì)接filelist.f的主要內(nèi)容就是行為仿真需要的所有RTL文件和testbench文件。我一般把它放在工程根目錄內(nèi)容如下## RTL source files ../rtl/tb_matrix_top.v ../rtl/matrix_mult.v ../rtl/multiplier.v ../rtl/ram_wrapper.v ## Testbench ../tb/tb_matrix_top.sv這里需要強(qiáng)調(diào)一個(gè)和Efinity聯(lián)動(dòng)的關(guān)鍵點(diǎn)如果你在Efinity里使用了IP核IP核的文件路徑往往是由工具自動(dòng)生成的位置一般在你工程目錄下的ipcore文件夾中。這些IP核仿真模型文件也要加入filelist。麻煩的地方在于Efinity在不同版本里生成的IP核目錄結(jié)構(gòu)不完全一樣有時(shí)候是.v文件有時(shí)候是.sv文件需要你根據(jù)實(shí)際生成結(jié)果手動(dòng)補(bǔ)充。我的經(jīng)驗(yàn)是第一次做某個(gè)IP核的仿真時(shí)先看看Efinity生成的仿真文件有哪些把路徑記錄下來(lái)之后每次新建工程直接把這些路徑復(fù)制到filelist里就行。這一步雖然繁瑣但一次配好之后就可以一勞永逸。4. 實(shí)操過程從Efinity工程到ModelSim仿真的完整流程4.1 在Efinity中創(chuàng)建或定位仿真文件要在Efinity和ModelSim之間建立聯(lián)仿首先你的設(shè)計(jì)得有一個(gè)完整的testbench。在Efinity里testbench文件和普通RTL文件一樣都是工程文件的一部分。你可以在“File→Add File”里將testbench文件加入工程也可以在文件管理器里直接放在工程目錄下。我推薦后一種方式原因是testbench只參與仿真不參與綜合如果作為工程文件加入Efinity會(huì)嘗試對(duì)它做綜合約束盡管最終會(huì)被忽略可能引發(fā)一些多余的告警信息。還有個(gè)細(xì)節(jié)是Efinity工程的頂層模塊和testbench頂層模塊不能重名否則在后續(xù)的自動(dòng)化腳本配置時(shí)會(huì)出現(xiàn)混亂。我在早期項(xiàng)目里就犯過這種低級(jí)錯(cuò)誤頂層叫matrix_toptestbench也叫matrix_top結(jié)果ModelSim加載仿真時(shí)加載錯(cuò)模塊跑了半天看到信號(hào)卻完全不對(duì)。4.2 用腳本一鍵完成ModelSim仿真的操作實(shí)錄假設(shè)你已經(jīng)有了一個(gè)完整的Efinity工程RTL代碼和testbench都有了下面是我實(shí)操中的步驟。第一步在工程目錄下新建一個(gè)名為sim的文件夾然后在里面創(chuàng)建filelist.f、sim_run.tcl兩個(gè)文件內(nèi)容參考上文。第二步在sim文件夾里打開ModelSim命令行Windows下是打開ModelSim后在Transcript窗口用cd命令切換路徑Linux下直接終端進(jìn)入目錄后輸入vsim打開ModelSim GUI再在命令行執(zhí)行source sim_run.tcl。第三步執(zhí)行source sim_run.tcl然后觀察ModelSim的Transcript窗口輸出。正常情況下你會(huì)看到vlib創(chuàng)建work庫(kù)、vlog編譯文件、vsim加載設(shè)計(jì)的信息最后波形窗口自動(dòng)彈出并開始運(yùn)行。整個(gè)過程不到10秒。如果你手動(dòng)操作可能需要5到10分鐘這還只是單次如果迭代修改代碼腳本的省時(shí)優(yōu)勢(shì)會(huì)成倍放大。4.3 易靈思IP核仿真的特殊處理如果你在設(shè)計(jì)中用到了易靈思的IP核比如PLL或Block RAM仿真處理上比Altera/Xilinx稍麻煩一點(diǎn)。Xilinx的Vivado在你生成IP核時(shí)會(huì)自動(dòng)產(chǎn)出仿真模型文件并加入工程易靈思的Efinity也會(huì)生成仿真模型但位置和格式經(jīng)常讓人覺得不直觀。以PLL為例Efinity生成的PLL IP中有一個(gè)pll_sim.v或類似命名的文件這就是ModelSim仿真時(shí)需要編譯的模型文件。你要做的就是在filelist.f中加上這一行../ipcore/pll/pll_sim.v除了模型文件本身IP核可能還依賴易靈思提供的通用庫(kù)文件比如efx_prim.v之類的。這些文件一般位于Efinity安裝目錄的lib或prim目錄下。你可以在filelist.f里用絕對(duì)路徑引用也可以拷貝到工程目錄下。我傾向拷貝到工程目錄下的sim_lib文件夾方便隨工程一起交給團(tuán)隊(duì)成員。編譯順序有講究先編譯底層庫(kù)文件和IP核模型再編譯RTL代碼最后編譯testbench。如果你把testbench排在最前面ModelSim編譯時(shí)會(huì)因?yàn)檎也坏絫estbench引用的模塊定義而報(bào)錯(cuò)。我的filelist.f默認(rèn)把IP核和底層庫(kù)放前面RTL放中間testbench放最后這個(gè)順序保持穩(wěn)定。5. 常見問題與排查技巧實(shí)錄聯(lián)仿路上我踩過的坑5.1 仿真波形顯示紅線或高阻態(tài)這個(gè)問題出現(xiàn)頻率最高幾乎每個(gè)新手都會(huì)遇到。仿真波形顯示紅線未知態(tài)通常有兩種原因一是testbench沒有正確產(chǎn)生復(fù)位和時(shí)鐘二是RTL代碼里有信號(hào)沒有初始化。排查方法很簡(jiǎn)單先看時(shí)鐘和復(fù)位信號(hào)。如果時(shí)鐘信號(hào)本身就是紅線說(shuō)明testbench產(chǎn)生了時(shí)鐘問題在編譯或加載環(huán)節(jié)如果時(shí)鐘是正常的方塊波但某個(gè)業(yè)務(wù)信號(hào)是紅線多半是RTL代碼里寄存器沒復(fù)位或者輸入信號(hào)沒有連對(duì)。我習(xí)慣在每個(gè)testbench的initial塊里先給所有輸入信號(hào)賦初值再拉高復(fù)位再拉低復(fù)位這樣能避免90%以上的紅線問題。initial begin clk 1b0; rst_n 1b0; start 1b0; data_in 32d0; repeat(5) begin #10 clk ~clk; end rst_n 1b1; end always #10 clk ~clk;注意testbench里時(shí)鐘用always永遠(yuǎn)不能寫在initial塊內(nèi)部這是新手經(jīng)常犯的語(yǔ)法錯(cuò)誤。5.2 vmap庫(kù)映射失敗怎么辦庫(kù)映射失敗是第二高發(fā)的錯(cuò)誤。常見表現(xiàn)是編譯時(shí)報(bào)錯(cuò)找不到某個(gè)庫(kù)或某個(gè)模塊或者加載仿真時(shí)報(bào)Cannot find module。這通常是因?yàn)镮P核的仿真庫(kù)沒有正確映射或編譯。解決辦法分兩步第一步檢查你的filelist.f是否包含了所有IP核仿真模型文件第二步檢查vmap的路徑是否正確。如果路徑不對(duì)ModelSim不會(huì)給出“路徑錯(cuò)誤”的提示而是報(bào)“無(wú)法打開庫(kù)”之類你需要結(jié)合自己的實(shí)際情況逐條核對(duì)。另外如果你在ModelSim中通過GUI執(zhí)行腳本注意工作目錄和你腳本所在目錄是否一致。ModelSim的vmap是相對(duì)于當(dāng)前工作目錄解析相對(duì)路徑的不一致會(huì)導(dǎo)致路徑錯(cuò)誤。一個(gè)穩(wěn)妥的做法是腳本開頭先用cd命令切換到腳本所在目錄cd [file dirname [info script]]這行Tcl命令的意思是“把當(dāng)前目錄切換到腳本自身所在的目錄”加入之后腳本的路徑問題基本就不會(huì)再出現(xiàn)了。5.3 編譯報(bào)錯(cuò)vlog cannot find systemverilog extension有些IP核模型文件是.sv格式的需要vlog開啟-sv選項(xiàng)才能編譯。如果你在filelist編譯時(shí)忘了加-svModelSim會(huì)報(bào)cannot find systemverilog extension但實(shí)際上并不是找不到文件而是文件后綴識(shí)別問題。加上-sv選項(xiàng)即可。我在腳本中默認(rèn)一直帶著-sv即使當(dāng)前工程沒有SystemVerilog文件也不影響。還有個(gè)細(xì)節(jié)如果filelist中既有.v又有.sv文件-sv是全局選項(xiàng)對(duì)混合格式的文件列表同樣適用。5.4 仿真運(yùn)行時(shí)間過長(zhǎng)或卡死有時(shí)候run -all執(zhí)行后仿真界面看起來(lái)像卡住了波形窗口沒有任何輸出進(jìn)度條也不動(dòng)。這種情況絕大多數(shù)是因?yàn)閠estbench的$finish沒觸發(fā)仿真一直在死循環(huán)中運(yùn)行。比如testbench里寫了forever #10 clk ~clk;但沒有設(shè)置結(jié)束條件仿真就會(huì)無(wú)限跑下去。解決方法有幾個(gè)一是testbench中加一個(gè)initial塊讓它作為仿真超時(shí)看門狗initial begin #10000; $display(Simulation timeout!); $finish; end這樣即使主邏輯卡住仿真也會(huì)在10000個(gè)時(shí)間單位后自動(dòng)退出并打印超時(shí)提示。第二種方法是手動(dòng)在ModelSim命令行里執(zhí)行run 100us限制只跑100微秒看結(jié)果。第三種是檢查testbench里有沒有死循環(huán)比如往FIFO里寫數(shù)據(jù)時(shí)FIFO滿但代碼沒有等待full信號(hào)讀數(shù)據(jù)時(shí)FIFO空但代碼沒有等待empty信號(hào)。這類問題把testbench的邏輯梳理一遍通常就能發(fā)現(xiàn)。5.5 快速排查清單我把上面這些總結(jié)成一張速查表方便你在遇到問題時(shí)對(duì)照處理異?,F(xiàn)象可能原因處理辦法時(shí)鐘和復(fù)位都是紅線testbench時(shí)鐘未生成或復(fù)位未拉高檢查always時(shí)鐘塊、initial中復(fù)位時(shí)序部分信號(hào)是紅線RTL中寄存器和狀態(tài)機(jī)未初始化復(fù)位邏輯補(bǔ)全信號(hào)初值設(shè)置編譯找不到IP核模塊IP核仿真模型未加入filelist檢查ipcore目錄把仿真模型加入filelistvmap庫(kù)路徑報(bào)錯(cuò)庫(kù)路徑和版本不匹配檢查vmap命令行確認(rèn)Work庫(kù)路徑正確run -all 后窗口無(wú)響應(yīng)testbench死循環(huán)或未設(shè)置$finish加看門狗initial塊或設(shè)置run時(shí)間上限add wave后波形窗口空信號(hào)被vopt優(yōu)化掉了使用-voptargsacc編譯選項(xiàng)編譯.sv報(bào)錯(cuò)缺少SystemVerilog支持vlog加-sv參數(shù)5.6 和Vivado/ISE聯(lián)仿思路的核心區(qū)別如果你之前用過Vivado和ModelSim聯(lián)仿你會(huì)發(fā)現(xiàn)易靈思的聯(lián)仿過程有幾點(diǎn)明顯不同。首先是IP核處理Vivado的仿真庫(kù)由工具自動(dòng)管理編譯好庫(kù)一次配置永久生效易靈思則需要手動(dòng)維護(hù)模型文件和庫(kù)映射自動(dòng)化程度稍低一點(diǎn)。其次是時(shí)序仿真的門檻Vivado里有完整的時(shí)間模型和SDF文件導(dǎo)出易靈思的Efinity也能生成SDF但流程上需要多幾步操作新手建議先從功能仿真入手等熟悉了再嘗試時(shí)序仿真。第三是工具鏈對(duì)Tcl腳本的支持差異Efinity的Tcl接口做得比較干凈熟悉之后會(huì)覺得很順手但前提是你需要花一點(diǎn)時(shí)間去讀它的命令參考手冊(cè)。6. 進(jìn)階擴(kuò)展腳本還能怎么玩6.1 模擬仿真與回歸測(cè)試自動(dòng)化當(dāng)你手里有了可用的聯(lián)仿腳本下一步可以做的事就是把它擴(kuò)展成回歸測(cè)試工具。最簡(jiǎn)單的做法是寫一個(gè)批處理或shell腳本循環(huán)運(yùn)行多個(gè)testbench的仿真#!/bin/bash for tb in tb_matrix_mult tb_fifo_ctrl tb_uart_rx tb_uart_tx; do echo Running testbench: $tb vsim -c -do source sim_run_${tb}.tcl; run -all; quit -f done這里用到了ModelSim的命令行模式-c參數(shù)配合-do參數(shù)直接執(zhí)行Tcl腳本不需要打開GUI界面。這個(gè)方式在服務(wù)器上跑回歸測(cè)試特別方便可以把每個(gè)testbench的仿真結(jié)果輸出到日志文件再統(tǒng)一檢查有沒有Error關(guān)鍵字。6.2 覆蓋率收集與報(bào)告生成ModelSim自帶覆蓋率收集功能可以在vsim時(shí)加上相關(guān)的命令vsim -coverage -cover enable -voptargsacc work.tb_matrix_top仿真結(jié)束后使用coverage report命令查看當(dāng)前仿真中代碼覆蓋率、行覆蓋率、條件覆蓋率等信息。項(xiàng)目后期做質(zhì)量驗(yàn)證的時(shí)候這組命令幾乎是標(biāo)配。不過要注意覆蓋率收集會(huì)讓仿真速度變慢30%到50%所以一般只在回歸版本或提交前做日常開發(fā)中我不會(huì)每次都開啟。6.3 斷言仿真與調(diào)試技巧SystemVerilog斷言SVA在ModelSim中可以直接支持。如果你在testbench里寫了assert property之類的斷言語(yǔ)句仿真運(yùn)行時(shí)如果斷言失敗ModelSim會(huì)在Transcript窗口打印錯(cuò)誤信息你可以通過腳本在遇到斷言失敗時(shí)自動(dòng)停止仿真vsim -assertdebug -voptargsacc work.tb_matrix_top加上-assertdebug參數(shù)后你可以在仿真過程中查看斷言的覆蓋情況也能在斷言失敗時(shí)快速定位到時(shí)間點(diǎn)和信號(hào)狀態(tài)。這個(gè)功能對(duì)于我這種經(jīng)常和復(fù)雜狀態(tài)機(jī)打交道的人來(lái)說(shuō)簡(jiǎn)直是救命稻草。如果你只是仿真簡(jiǎn)單的組合邏輯可能用不上但一旦設(shè)計(jì)復(fù)雜度上來(lái)早點(diǎn)掌握斷言仿真不會(huì)有壞處。7. 終極避坑心得三個(gè)讓我印象深刻的教訓(xùn)回到最初的話題為什么易靈思的聯(lián)仿會(huì)讓新手覺得不友好核心原因是它把仿真環(huán)境的選擇權(quán)交給了用戶而不是像Vivado那樣“全家桶”式地幫你搞定一切。這種設(shè)計(jì)思路本身沒問題但它對(duì)使用者的工程素養(yǎng)要求更高你需要理解編譯庫(kù)的概念、明白仿真模型的區(qū)別、懂得Tcl腳本的基本語(yǔ)法。這些東西在圖形化界面時(shí)代逐漸被淡化了所以第一次接觸易靈思工具鏈的人會(huì)有些不適應(yīng)。我個(gè)人在實(shí)際操作中最深的體會(huì)是聯(lián)仿腳本不是一蹴而就的而是一個(gè)持續(xù)迭代的過程。第一個(gè)版本可能很簡(jiǎn)陋只是簡(jiǎn)單的編譯和仿真隨著項(xiàng)目推進(jìn)你會(huì)不斷往里面加內(nèi)容——新的文件路徑、新的仿真參數(shù)、新的信號(hào)列表。這時(shí)候保持腳本的模塊化很重要。我會(huì)把filelist、信號(hào)列表、編譯選項(xiàng)拆分成獨(dú)立的文件或變量這樣每次修改時(shí)不會(huì)牽一發(fā)而動(dòng)全身。最后再分享一個(gè)小技巧在ModelSim的wave窗口里你可以給信號(hào)分組加顏色比如時(shí)鐘復(fù)位用白色、總線數(shù)據(jù)用黃色、狀態(tài)機(jī)狀態(tài)變量用綠色。配合腳本里的add wave -color命令可以在仿真一開始就自動(dòng)生成帶顏色的波形顯示調(diào)試狀態(tài)機(jī)時(shí)一眼就能看出當(dāng)前狀態(tài)的變化軌跡。這一步雖然簡(jiǎn)單但能明顯提升調(diào)試效率屬于那種“用過就回不去”的小功能。聯(lián)仿這件事說(shuō)難不難說(shuō)簡(jiǎn)單也不簡(jiǎn)單關(guān)鍵是把思路理順把腳本備好。按照上面這套流程走一遍我相信你也能把自己的仿真環(huán)境搭起來(lái)跑通第一個(gè)波形。如果你在操作中遇到本文沒有覆蓋到的問題歡迎帶著具體報(bào)錯(cuò)信息來(lái)交流很多坑確實(shí)需要在實(shí)戰(zhàn)中才能發(fā)現(xiàn)。