Vivado使用技巧(18):模擬功能概述
模擬功能概述
模擬FPGA開發中常用的功能,通過給設計注入激勵和觀察輸出結果,驗證設計的功能性。Vivado設計套件支援如下模擬工具:Vivado Simulator、Questa、ModelSim、IES、VCS、Rivera-PRO和Active-HDl。
Vivado的模擬流程如下圖所示:
模擬可以在設計階段的不同時間點進行,主要包括如下三個階段:
- RTL級行為模擬:在綜合和實現前便可驗證設計,用來檢查程式碼語法和驗證程式碼像設計者想要的功能一樣工作,早期的行為級模擬可以儘早發現問題;
- 綜合後模擬:使用綜合網表模擬,驗證綜合後設計滿足功能需求。該階段模擬不太常用,可以用時序模擬(timing simulation)來估計時間;功能模擬(functional sumulation)由層次化的網表組成,最底層由Xilinx原語構成;
- 實現後模擬:可以進行功能模擬和時序模擬,且與FPGA硬體上的工作情況最為接近,確保實現後設計滿足功能和時序要求。
時序模擬相比功能模擬要耗費大量的時間,但是可以檢測到功能模擬無法檢測的問題,比如:
- 由於屬性設定(綜合屬性、UNISIM庫屬性等),或不同模擬器對語法的不同解釋,導致綜合後或實現後功能發生改變;
- 雙口RAM讀寫衝突;
- 錯誤的、不合適的時序約束;
- 非同步路徑操作問題;
- 由於優化技術引起的功能問題
Vivado Simulator支援VHDL(IEEE-STD-1076-1993)、Verilog(IEEE-STD-1364-2001)、SystemVerilog中的可綜合子集(IEEE-STD-1800-2009)三種硬體描述語言,此外還支援IEEE P1735加密標準。
使用TestBench和激勵檔案
TestBench也是由HDL語言程式碼編寫,其例項化了需要模擬的設計,生成設計所需要的激勵訊號,監測設計輸出結果並檢查功能的正確性。一個簡單的TestBench可以僅僅將激勵順序地載入到設計的輸入管腳上;一個複雜的TestBench可能會包含子程式呼叫、從外部檔案讀取激勵訊號、條件化激勵和其它更多複雜的結構。
下面是編寫TestBench時極度推薦的一些注意事項:
- 在Verilog TestBench中總是使用timescale規定時間,如`timescale 1ns/1ps;
- 在模擬時間的0時刻,將所有的設計輸入初始化位為一個確定的值;
- 在綜合後和實現後的時序模擬中,會自動觸發全域性置位/復位脈衝(GSR),這會讓所有的暫存器在模擬的前100ns內鎖定其值。因此在100ns之後再賦值激勵資料;
- 在全域性置位、復位脈衝釋放之前就確保時鐘源已經開始工作。
指定模擬器位置
點選Tools->Settings->Tool Settings->3rd Party Simulators:
Install Paths中定位模擬器的安裝路徑,Default Compiled Library Paths中指定與模擬器相關的編譯庫路徑。只有第三方模擬器需要在此設定,Vivado Simulator不需要設定。
編譯模擬庫
使用Vivado Simulator時,不需要編譯模擬庫。但是使用第三方模擬工具時,必須先編譯模擬庫,才能在第三方模擬工具中正確執行。模擬庫中包含了模擬模型,比如FPGA和IP的行為模型和時序模型。編譯之後的庫可以在多個設計工程中使用。
在編譯過程中,Vivado會建立一個模擬器用來參考編譯庫檔案的初始化檔案,該檔案包含了一些控制變數,包括規定參考庫路徑、優化、編譯和模擬設定。如果沒有正確的初始化檔案,就不能執行包含Xilinx原語的模擬。不同模擬器的初始化檔名稱如下:
- Questa/ModelSim:modelsim.ini;
- IES:cds.lib;
- VCS:synopsys_sim.setup
如果使用的模擬器版本不變,只需要編譯一次庫檔案即可;如果更換了Vivado或模擬器的版本,就必須重新編譯一次庫檔案。編譯庫檔案有Vivado IDE和Tcl命令兩種方法,本文介紹第一種。點選Tools->Compile Simulation Libraries(即使不開啟工程也有此命令)開啟如下視窗:
- Simulator:選擇第三方模擬器;
- Language:編譯庫到規定的語言,如果為All,則會根據選擇的模擬器自動選擇語言,如果模擬器支援混合語言模擬,則Verilog庫和VHDL庫都會編譯;
- Library:選擇需要編譯的模擬庫(Unisim或Simprim),預設會編譯所有 的庫;
- Family:編譯庫到規定的FPGA系列,預設會生成所有的器件系列;
- Compiled library location:設定儲存編譯庫結果的目錄路徑。預設情況下會儲存在當前工程目錄的.cache/compile_simlib目錄下;
- Simulator executable path:設定模擬器可執行檔案所在的路徑;
- Miscellaneous Options:使用Tcl命令設定一些其它選項;
- Compile Xilinx IP:選擇是否編譯Xilinx IP的模擬庫;
- Overwrite current pre-compiled libraries:選擇是否重寫當前預編譯庫;
- Compile 32-bit libraries:預設為64bit模式,選中此項,模擬器編譯會在32bit模式下進行;
- Verbose:Messages視窗預設有訊息顯示數量限制,選中此選項後,相關命令會忽視此限制,所有訊息都會顯示在Messages視窗中;
- Command:展示了上述設定所等效的Tcl命令。
Xilinx模擬庫
設計者可以將Xilinx模擬庫用於任何支援VHDL-93和Verilog-2001語言標準的模擬器。庫中包含延遲與模型資訊,可以正確地模擬Xilinx硬體器件。
模擬時,如果資料和時鐘同時發生變化,模擬器在判斷當前時鐘邊緣時會取樣上一個狀態的輸入,同時變換時刻的輸入會安排在下一個始終邊緣才有效。最好的做法當然是不要使資料訊號和時鐘訊號同時變換,以避免出現意料之外的模擬結果。
當設計者在設計中例項化了一個元件後,模擬器必須在庫中找到描述該元件功能的內容,以確保正確的模擬。下面列出Xilinx提供的模擬庫:
- UNISIM:Xilinx原語的功能模擬,Verilog庫名為UNISIMS_VER。包含了器件原語和最低等級構建模組的描述。
- UNIMACRO:Xilinx巨集的功能模擬,Verilog庫名為UNIMACRO_VER。當使用器件巨集時,必須設定此庫。
- UNIFAST:快速模擬庫,Verilog庫名為UNIFAST_VER。推薦在RTL行為級模擬中使用此庫,可以節省模擬執行時間。
- SIMPRIMS_VER:Xilinx原語的時序模擬,僅支援Verilog,因此時序模擬僅支援Verilog語言。
- SECUREIP:Xilinx複雜器件元件(如PCIE、高速收發器)的功能模擬和時序模擬庫,在Vivado安裝目錄的data/secureip目錄下可以檢視完整IP列表。
- XPM:Xilinx原語的功能模擬。
除了SECUREIP外,其它庫都位於Vivado安裝目錄data/Verilog或VHDL/src目錄內。設計者必須根據執行的模擬來設定不同的模擬庫。下表中給出了與不同模擬階段相關的模擬庫檔案:
模擬設定
在模擬設定中規定目標模擬器、模擬集、模擬頂層模組名稱等選項。開啟Settings切換到Simulation標籤中,或在Flow Navigator中的Simulation上右鍵->Simulation Settings,開啟設定視窗:
其中Clean up simulation files表示重新執行模擬時會將現存的整個模擬目錄全部移除,其餘設定選項很熟悉了,不多作介紹。下面著重介紹Simulator language,理解背後的處理機制,其值可選擇VHDL、Verilog或Mixed。
大多數的Xilinx IP只會生成單語言的行為模擬模型;某些第三方模擬工具也僅支援單語言模擬。通常應該將Simulator language設定為模擬工具支援的語言,以確保工具正常執行。如果IP核同時也可以生成該語言的行為模型再好不過,但是如果IP核不支援該設定,Vivado會自動從IP核的DCP檔案中生成一個結構化模擬模型用於模擬,確保模擬可以正常執行。
模擬解析度需要在TestBench中使用timescale設定,某些人認為設定一個粗略的模擬解析度(如1s)可以提升模擬效能,這是錯誤的。在 Xilinx模擬模型中,大多數模擬時間是基於一個固定間隔,與模擬解析度並無聯絡。設定模擬解析度主要是為了觀察更方便。但是某些Xilinx原語元件(如MMCM)需要1ps的解析度才能在模擬中正常工作,最常用的解析度設定是`timescale 1ns/1ps。
模擬集功能
Vivado提供了模擬集(Simulation Sets)功能,該機制可以讓使用者將不同設計階段所用到的不同原始檔新增到各自的模擬集中。比如一個模擬集可以新增用於RTL行為級模擬的原始檔,另一個模擬集新增用於實現後時序模擬的原始檔。或者不同的模擬集提供對一個設計的不同測試方法,等等。
在建立或新增模擬原始檔時,可以選擇將檔案加入到哪個模擬集,或者建立新的模擬集:
當設計中存在多個模擬集時,當前執行使用的模擬集會顯示為Active狀態:
相關文章
- Vivado使用技巧(29):約束功能概述
- Vivado使用技巧(21):模擬中的Debug特性
- Vivado使用技巧(7):使用IP核自帶Testbench進行模擬
- Vivado使用技巧(20):Waveform功能詳解ORM
- Vivado使用技巧(19):使用Vivado Simulator
- Vivado使用技巧(4):查詢功能詳解
- Vivado使用技巧(3):Force Up-to-Date功能
- vivado新增模擬原始檔
- Vivado使用技巧(27):RAM編寫技巧
- Vivado使用技巧(26):HDL編寫技巧
- Vivado使用技巧(17):建立IBIS模型模型
- modelsim 獨立模擬vivado的IP核及模擬指令碼指令碼
- Vivado使用技巧(6):Messages視窗管理
- Vivado使用技巧(33):時序異常
- Vivado使用技巧(25):Block Synthesis技術BloC
- Vivado使用技巧(9):COE檔案使用方法
- Vivado使用技巧(11):設定FPGA配置模式FPGA模式
- Vivado使用技巧(8):Core Container打包IP核AI
- Vivado使用技巧(34):路徑分割現象
- Vivado使用技巧(28):支援的Verilog語法
- Vivado使用技巧(5):屬性編輯器的使用
- Vivado使用技巧(30):使用時序約束嚮導
- Vivado DDS IP核使用和模擬(一、單通道訊號發生器)
- Vivado使用技巧(16):SSN轉換噪聲分析
- Vivado使用技巧(14):IO規劃方法詳解
- Vivado使用技巧(31):時鐘的約束方法
- Vivado使用技巧(23):綜合執行與OOC
- Vivado使用技巧(15):DRC設計規則檢查
- Vivado使用技巧(13):CSV檔案定義IO Ports
- Vivado使用技巧(32):IO延遲的約束方法
- 模擬Promise的功能Promise
- 暑假集訓CSP提高模擬18
- Android模擬器繪製實現概述Android
- Ubuntu18 上使用 docker 的 nginx 容器模擬負載均衡UbuntuDockerNginx負載
- Vivado使用技巧(10):編輯與改寫IP核原始檔
- Vivado使用技巧(24):HDL/XDC中設定綜合屬性
- Vivado使用技巧(22):綜合策略與設定的選擇
- [DMY]2024 CSP-S 模擬賽 Day 18