Verilog開源仿真工具Icarus Verilog的工作原理

2021-12-28 ExASIC

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


分享數字集成電路設計中的經驗和方法

分享讓工作更輕鬆

相關焦點

  • 開源仿真工具Icarus Verilog中的verilog parser
    前面提到用flex和bison開處理命令行參數,回顧一下:開源仿真工具Icarus Verilog中的命令行參數處理方法。
  • Verilog代碼轉VHDL代碼經驗總結
    你已經習慣某種語言,也發現語言不是學習FPGA時需要考慮的問題,它僅僅是硬體描述語言工具而已。可是,當你發現一份和你使用語言不同的代碼作為參考時,你又開始想:我以後的工作是不是要二種語言都會,這樣工作才會得心應手?事實上,兩種語言之間是可以相互轉換的。
  • verilog常用語法二讓您的FPGA設計更輕鬆
    verilog常用語法一讓您的FPGA設計更輕鬆   一般情況下
  • 關於學習verilog
    在功能仿真做完後,由於我們做在是FPGA的設計,在設計時已經基本保證RTL級代碼在綜合結果和功能仿真結果的一致性,只要綜合布局布線後的靜態時序報告沒有違反時序約束的警告,就可以下到板子上去調試了。事實上,在華為中興,他們做FPGA的設計時也是不做時序仿真的,因為做時序仿真很花時間,且效果也不見得比看靜態時序分析報告好。
  • 談談Verilog/System Verilog 和C的幾種交互方式
    PLI全稱 Program Language Interface,程式設計師可以通過PLI在verilog中調用C函數,這種訪問是雙向的。這些用戶定義的系統任務和函數的名稱必須以美元符號"$" 開頭。大家用得比較多的PLI函數有$display,\$finish等。
  • Verilog 裡面,always,assign和always@(*)區別
    在新的verilog2001中「,」和「or」都可以用來分割敏感事件了,可以用「*」代表所有輸入信號,這可以防止遺漏。 2:assign 組合邏輯和always@(*)組合邏輯verilog描述組合邏輯一般常用的有兩種:assign賦值語句和always@(*)語句。兩者之間的差別有:    1.
  • Cordic算法(sinx,cosx)的Verilog實現
    在某些特殊情況,比如asic開發,現有的編譯軟體自帶的IP核是不能使用的,比如我最近需要做的東西,需要的信號發生器(正弦波發生器)就只能自己使用verilog進行實現。仿真結果及傅立葉分析:由於有一段時間了,所以只好找一下渣圖(modelsim仿真):將數據導出並使用MATLAB進行處理分析:第一個是正弦函數的誤差函數,第二個是餘弦函數的誤差函數。
  • Verilog 最全經驗總結(建議收藏)
    在VERILOG中他僅僅可以使用在測試模塊中,不能被綜合10.遵守register-in register-out規則11.像synopsys的DC的綜合工具是非常穩定的,任何bugs都不會從綜合工具中產生12.確保FPGA版本與ASIC的版本儘可能的相似,特別是SRAM類型,若版本一致是最理想的,但是在工作中FPGA版本一般用FPGA自帶的SRAM,ASIC版本一般用廠商提供的
  • verilog之generate生成塊
    我們一定要學會區別電路本身的verilog代碼和這些輔助代碼!生成塊的關鍵詞是「generate」,一個生成塊的結構框架如下:generate   operationsendgenerate其中,「operations」是生成塊的功能部分,用來描述實際有用的邏輯。
  • FPGA 入門到精通系列2:verilog基礎3-verilog代碼復用(generate、function)
    一直以來寫verilog代碼,特別是寫算法,比如圖像處理,總感覺寫的是軟體C語言的按照周期展開的計算邏輯,雖然很多都是ctrl+c和ctrl
  • ​verilog相關基礎知識
    對於verilog基礎知識,這裡做簡單的介紹,對於已經熟悉verilog語言的讀者可以省略不看此部分。
  • Verilog常見必備面試題
    使用verilog hdl實現具有同步RESET和SET的觸發器,具有異步RESET和SET的觸發器。異步reset和setalways@(posedge clk or negedge reset or posedge set)begin  if(set)  Q<=1;    else if(!
  • Verilog基礎(上)
    input [RAM_WIDTH-1:0] din,input [RAM_ADDR-1:0禁忌:不能濫用。在晶片設計中代碼規模一般比較龐大,每人負責一部分模塊,如果不加約束話,宏名定義很容易撞到,又由於其作用整個工程的,就會造成定義混亂.特別注意`define 定義常值變量時,使用時必須也要點`(`NUM).
  • SystemVerilog Callback必知必會
    而「非阻塞」都是指的互不幹涉互不阻礙的意思,非阻塞回調通常用在I/O操作、異常處理或者多線程中編程中,將回調函數放到單獨的線程中執行;非阻塞賦值在仿真中是將計算等號右表達式和賦值給左變量分成了兩個事件,並分別放在仿真時間槽(time slot)的Active region和NBA region中執行。
  • Systemverilog驗證學習經歷分享
    起初是為了學習verilog,但因為發現了更好的學習資料(看上篇)所以之後就沒有再碰這個網站。直到後來接觸SV的時候看「綠皮書」這本書實在是難以下咽(似曾相識的一幕)。相信學習驗證的朋友們在剛開始都被推薦過這本「綠皮書」吧。
  • log2在verilog裡面到底有什麼用?
    確實很多時候用不著,verilog本身不夠靈活,所以很多時候我們也就沒想把她寫的多簡介靈活,而且受限於編譯器的支持,很多靈活的語法不能被編譯成電路,所以有這種想法情理之中,畢竟花大把時間去玩一個函數發現他局限性很大那確實收益太少。   那麼他到底有什麼用?   如果大家要設計一個深度1024的fifo,那麼地址位寬取多大合適?
  • HDLBits:在線學習Verilog(七 · Problem 30-34)
    解答與分析// synthesis verilog_input_version verilog_2001module top_module( input a, input b, input sel_b1, input sel_b2, output wire out_assign,
  • 可編程邏輯培訓——Verilog 語言基礎
    不使用初始化語句;2、不使用延時語句;3、不使用循環次數不確定的語句,如:forever,while等;4、儘量採用同步方式設計電路;5、儘量採用行為語句完成設計;6、always過程塊描述組合邏輯,應在敏感信號表中列出所有的輸入信號;7、所有的內部寄存器都應該可以被復位;8、用戶自定義原件(UDP元件)是不能被綜合的。一:
  • 細談FPGA之Verilog HDL語法(一)
    如果按照一定的規矩編寫,功能行為模塊可以通過工具自動地轉換為門級互連模塊。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下五種:系統級(system): 用高級語言結構設計實現模塊的外部功能。算法級(algorithm): 用高級語言結構設計實現算法。
  • 零基礎教你學FPGA之Verilog語法基礎(下)
    (2)$monitor  系統任務$monitor提供了監控和輸出參數列表中的表達式或變量值的功能,其參數列表中輸出控制格式字符串和輸出列表的規則 和$display一樣,當啟動一個帶有一個或者多個的$monitor任務時,仿真器則創立一個仿真機制