Icarus Verilog是由Stephen Williams開發的Verilog仿真工具,官網http://iverilog.icarus.com,代碼開源在https://github.com/steveicarus/iverilog。
在github倉庫裡,有一份developer quick start文檔,我們就從這個文檔來看看Icarus Verilog是如何工作的。
工作流程商業仿真器相同,也是分成三個步驟——編譯、elaboration、仿真。
編譯編譯就是從接收命令行參數開始,到預處理(verilog宏展開,文件include,條件編譯),Verilog語法解析(關鍵字識別、語法解析),最後轉換成內部的數據結構(就是用各種class、結構體,如module、net、scope、generate、statement、expression等)的過程。
簡單的講,就是實別Verilog文件,轉成內部的資料庫。經過編譯後,各個Verilog文件在庫裡是獨立的。
Elaboration而elaboration就是把庫裡的數據,有機的組織成一個樹型結構,樹的頂端是root,往下是tb或者設計頂層,然後是例化的子模塊。如下圖:
laboration的過程中還需要處理parameter的傳播、defparam的覆蓋,根據generate語句來產生實際的電路等。
另外Verilog的系統函數(如$finish、$display、$dumpfile等)也是在這一步進行識別,然後與仿真器預實現的函數庫(.so或.a)進行關聯。
經過處理後,這個樹型結構就可以準確的表達整個設計(包括testbench)。
elaboration還會根據優化選項進行一定的優化,簡化樹型結構。比如,去除設計層次,用信號命名來表示原層次關係。還可以進行邊界優化,合併組合邏輯。合理的優化會很大程度上加速仿真。
elaboration最終會輸出一個類似彙編的vvp文件。
仿真仿真時讀入vvp文件,送進vvp虛擬機執行。我們可以簡單地理解成類java虛擬機的一種東西。可以像模擬電路一樣,按照仿真時間1ns、1ns的執行,也可以用事件驅動的方式來往前推進。我們知道verilog裡,時序邏輯是以時鐘沿來執行的,組合邏輯是按敏感列表變化來執行。在需要時才做計算,可以節省90%以上的計算量。
Icarus Verilog的難點從Icarus Verilog源碼來看,主要有兩個方面難度較大。
一是,Verilog語言的parser。 二是,vvp虛擬機的執行機制。
能否用於商業用途能否用於商業用途,一個是看License許可。另一個是看功能和性能。雖然Icarus Verilog能完成Verilog 2005寫的設計和Testbench的仿真,但目前企業的主流驗證方法是SystemVerilog+UVM。從這個角度看不能滿足需求。
儘管如此,Icarus Verilog對我們還是很有啟發意義,很多優秀的商業EDA軟體也是從改進開源軟體起家的。
專業圖書推薦:
今天推薦IC驗證工程師的必備書《UVM實戰》,行業內稱作「白皮書」,是第一本中文UVM書籍,從源碼角度深入淺出的講解UVM的實用技巧。作者張強,資深驗證專家。
歡迎關注ExASIC
分享數字集成電路設計中的經驗和方法
分享讓工作更輕鬆