Hello Verilator—高品質&開源的 SystemVerilog(Verilog) 模擬器介紹&教學(一)

Share on:

本文內容採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.

台灣的 CIC 免費提供學界許多昂貴的 EDA tool,在這個影響下,講到 SystemVerilog(Verilog) 模擬器(太長了,下面簡稱模擬器),多數人第一個想到的都是經典的 Cadence 的 ncsim,或是 Synopsys 的 vcs。說到免費的模擬器,有些人可能聽過 iverilog 這個知名的替代品,然而受到實做上的限制,iverilog 的效能基本上無法作為 production 使用。於是我打算用幾篇文章來介紹近年來興起的 verilator,他是一個優秀的模擬器替代品,我自己的使用經驗中,效能甚至可以超越商用昂貴的模擬器。

推廣時間!

Verilator 官網宣稱他是 “the fastest Verilog/SystemVerilog simulator”,其高效能、開源的特性也讓 WD, RISC-V, Intel, AMD 近年來開始採用 verilator。Google 舉辦過幾次 RISC-V 實做大賽,也是使用 verilator 作為官方的評比標準。可見 verilator 在穩定度上是讓傳統晶片設計大廠得到相當的信賴。尤其是近年傳統軟體大廠 Google, Apple 開始作自己的晶片,可以期待 verilator 未來的功能會更加強大。

另外,作者本人也在 v4.000 前後推過一兩個 patch,讓 verilator 支援 dump compressed waveform 的功能,雖然沒那麼重要但是我就是想提一下。

Verilator 跟其他方案的比較

使用方法上

Verilator 官網另外一個說明 “Accepts synthesizable Verilog or SystemVerilog and compiles into multithreaded C++, or SystemC”。也就是 Verilator 把可合成的 Verilog 轉成 C++ 來執行,也就是說 verilator 並沒有設計來轉換 testbench 的功能。那麼 testbench 要怎麼寫呢?答案是用只能 C++ 寫,這點跟其他模擬器很不一樣,因為一般 testbench 也是用 Verilog 寫的。然而,你要說這個是缺點嗎,我覺得並不是。老實說就作者自己的經驗來說,由於 Verilog 語法功能的限制實在太多,即使 SystemVerilog 之後加入了非常多用於 testbench 的功能,習慣之後用 C++ 寫 testbench 的體驗是遠好於用 Verilog 寫的。其實這不難理解啦,不管作什麼事情,同一件事情用 C++ 跟 Verilog 能作得一樣好的時候,當然是用 C++ 啊。

上述的差異,也讓使用 verilator 模擬的步驟相對複雜。例如使用 ncsim 之類的時候,模擬的步驟如下:

使用 ncsim 等工具模擬:
  1. 撰寫 testbench testbench.v
  2. 準備可合成之待測模組 design_under_test.v
  3. 執行模擬 ncverilog testbench.v design_under_test.v

其中步驟 3. 隱含了把 testbench.v design_under_test.v 轉成 C++ 或是直接轉成 binary 的功能,例如 ncverilog 會在同一個資料夾下面生成 INCA_libs 資料夾,或是 vcs 會生成一個 vsim 的 binary,執行 ./vsim 就是在執行 Verilog 的模擬。

相比之下,verilator 的步驟為(註:僅為大約步驟,詳細正確的步驟請看後續文章):

使用 verilator 模擬:
  1. 撰寫 testbench testbench.cpp
  2. 準備可合成之待測模組 design_under_test.v
  3. 把待測試模組轉換成 C++(或是 SystemC),並指名要使用的 testbench verilator design_under_test.v --exe testbench.cpp --cc
  4. Verilator 產生的檔案都在 obj_dir 資料夾(這個是預設名稱)。
  5. 在該資料夾下面編譯產生 binary make -C obj_dir -f Vdesign_under_test.mk
  6. 執行模擬 ./obj_dir/Vdesign_under_test

上面的步驟跟 vcs 的手動模式的複雜程度差不多,但是 verilator 沒有一鍵完成步驟 3 之後的自動化指令,所以用起來相對麻煩。

vs iverilog

Verilator 有著跟標準幾乎相容的 SystemVerilog,不亞於商用工具,相較之下 iverilog 的 SystemVerilog 支援度並不好。此外,iverilog 的實做方式並不像 verilator 或是其他商用方案先把 SystemVerilog 編譯成 binary,所以速度比其他這些慢了兩個數量級,因此難以用在 production 使用。

vs 商用方案

Verilator 可以 “accepts synthesizable Verilog or SystemVerilog and compiles into multithreaded C++"。也就是說 verilator 無法跑類比模擬,也無法作 gate-level 模擬。可是作者本是作數位電路的,對我而言沒差。至於無法作 gate-level 模擬的問題……再說吧,反正那之前要買到合成工具。

速度上,舉我自己的使用經驗中為例,跟商用方案相比,在第一個編譯步驟中,verilator 用 gcc 編譯的速度慢了 100 倍(4s 變成 400s)。~~但是那個是我用自己的 Intel Core i5-2500 的時候的事情了,自從公司工作站換了 AMD Epyc 7702*2 之後,編譯速度好像也不是那麼大的問題了。~~然而,在第二個執行步驟中,在都不 dump waveform 的情形下 verilator 執行速度快了 20-50%。在模擬動輒以天為單位的情形下,100 倍慢的編譯速度根本不是問題,加上 CPU 近年核心數量大幅成長,可以不受 license 限制平行跑多個模擬,我覺得 “the fastest Verilog/SystemVerilog simulator” 是絕對沒有問題的說法。

Hello Verilator 程式碼範例

因為作者最近買了文明帝國,所以有點懶得打了,實際使用 verilator 的例子跟程式就留在下一篇吧!