【Verilog】Verilator的TestBench該用C++還是SystemC

Verilator的Testbench(測試平臺)主要使用 C++SystemC 來編寫。這是由Verilator的工作原理決定的:它將你的Verilog/SystemVerilog設計轉換成一個C++類,因此你需要一個C++環境來實例化和驅動這個類。

下面詳細說明這兩種方式以及如何選擇。


1. 使用 C++ 編寫 Testbench (最常見)

這是最直接、最靈活的方式。你的C++代碼將扮演“主宰者”(Master)的角色,負責生成時鐘、復位信號,驅動設計的輸入端口,并檢查輸出端口的正確性。

為什么用 C++?
  • 高性能:直接編譯成本機代碼,運行速度快。
  • 極致靈活:你可以利用整個C++生態系統,包括標準庫(STL)、文件I/O、網絡套接字、Boost庫等,來創建極其復雜的測試激勵(Stimulus)和檢查器(Checker)。例如,你可以:
    • 從文件中讀取測試向量。
    • 將設計輸出與一個軟件參考模型(Reference Model)的輸出進行實時比對。
    • 構建復雜的、算法生成的測試場景。
  • 易于上手:對于有軟件編程背景的工程師來說,學習成本相對較低。
一個簡單的C++ Testbench示例

假設你有一個名為 my_design.v 的Verilog文件,其頂層模塊是 my_design

Verilog代碼 (my_design.v):

module my_design (input             clk,input             reset,input       [7:0] data_in,output logic [7:0] data_out
);always_ff @(posedge clk) beginif (reset) begindata_out <= 8'b0;end else begindata_out <= data_in + 8'd1; // 簡單的加1操作endendendmodule

C++ Testbench (tb_my_design.cpp):

#include "Vmy_design.h"      // 包含Verilator生成的頭文件
#include "verilated.h"       // 包含Verilator的核心頭文件
#include "verilated_vcd_c.h" // 包含波形生成頭文件int main(int argc, char** argv) {// 初始化VerilatorVerilated::commandArgs(argc, argv);// 實例化設計Vmy_design* top = new Vmy_design;// 初始化波形追蹤VerilatedVcdC* tfp = new VerilatedVcdC;top->trace(tfp, 99); // 99是追蹤深度tfp->open("waveform.vcd"); // 打開VCD文件// 仿真主循環int sim_time = 0;while (sim_time < 20) {// 驅動時鐘翻轉top->clk = !top->clk;// 在時鐘上升沿進行操作if (top->clk == 1) {if (sim_time < 4) {top->reset = 1; // 施加復位} else {top->reset = 0;top->data_in = sim_time; // 施加測試激勵// 檢查輸出 (預期的輸出是上一個周期的輸入+1)printf("Time=%d, clk=%d, reset=%d, data_in=%d, data_out=%d\n",sim_time, top->clk, top->reset, top->data_in, top->data_out);// 注意:檢查應該基于上一個周期的輸入}}// 評估電路狀態top->eval();// 將當前狀態寫入波形文件tfp->dump(sim_time);sim_time++;}// 清理tfp->close();delete top;delete tfp;return 0;
}

2. 使用 SystemC 編寫 Testbench

SystemC 是一個基于C++的庫和標準(IEEE 1666),專門用于系統級的建模、仿真和驗證。它提供了硬件設計中常見的概念,如模塊(module)、端口(port)、時鐘(clock)和信號(signal),使得測試平臺的結構更接近于HDL(如Verilog/VHDL)。

為什么用 SystemC?
  • 結構化:代碼結構更像硬件描述語言,對習慣了HDL的工程師更友好。
  • 抽象層次高:非常適合進行事務級建模(Transaction-Level Modeling, TLM),用于SoC(片上系統)級別的驗證。
  • 互操作性:作為一個行業標準,便于與其它遵循SystemC/TLM標準的模型進行集成。
一個簡單的SystemC Testbench示例

使用與上面相同的 my_design.v

SystemC Testbench (tb_my_design_sc.cpp):

#include "Vmy_design.h"
#include <systemc.h>SC_MODULE(Testbench) {sc_in<bool> clk; // SystemC時鐘輸入// Testbench內部的信號sc_signal<bool>   reset;sc_signal<uint8_t> data_in;sc_signal<uint8_t> data_out;// 實例化Verilated模塊Vmy_design* dut;// 測試激勵進程void stimulus_process() {// 復位reset = 1;wait(4, SC_NS);reset = 0;wait(1, SC_NS);// 施加激勵for (int i = 0; i < 10; ++i) {data_in = i;printf("@%s, Applied data_in = %d\n", sc_time_stamp().to_string().c_str(), i);wait(1, SC_NS);printf("@%s, Observed data_out = %d\n", sc_time_stamp().to_string().c_str(), (int)data_out.read());}sc_stop(); // 停止仿真}SC_CTOR(Testbench) {// 創建DUT實例dut = new Vmy_design("dut");// 端口綁定dut->clk(clk);dut->reset(reset);dut->data_in(data_in);dut->data_out(data_out);// 注冊進程SC_THREAD(stimulus_process);sensitive << clk.pos(); // 進程對時鐘上升沿敏感}// 析構函數,釋放內存~Testbench() {delete dut;}
};int sc_main(int argc, char* argv[]) {// 時鐘定義sc_clock clk("clk", 1, SC_NS, 0.5); // 周期1ns, 占空比50%// 實例化TestbenchTestbench tb("tb");tb.clk(clk); // 將時鐘連接到Testbench// 開始仿真sc_start();return 0;
}

總結與建議

特性純C++ TestbenchSystemC Testbench
控制粒度。直接手動控制每個信號和時鐘周期。。通過SystemC調度器和事件驅動。
代碼結構過程式(像一個普通的C++程序)。結構化(模塊、端口、進程),更像HDL。
學習曲線較低(對于C++程序員)。較高(需要學習SystemC庫和概念)。
適用場景單元/模塊級驗證,需要高速和靈活性的場景,與軟件模型集成。SoC系統級驗證,事務級建模(TLM),需要與其它SystemC模型互聯的場景。

給你的建議:

  1. 如果你是初學者,或者正在進行模塊級別的驗證
    從純C++開始。它最直接,能讓你更好地理解Verilator的底層工作方式,并且足以滿足絕大多數驗證需求。

  2. 如果你正在構建一個復雜的SoC,或者需要與現有的TLM模型集成
    考慮使用SystemC。它能提供更規范、更結構化的驗證環境,特別是在多團隊協作的大型項目中,其標準化特性非常有優勢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84854.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84854.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84854.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

71-Oracle Undo與Flashback管理(Guarantee設置)深度解析

小伙伴們有沒有在操作undo表空間、Flashback管理&#xff0c;時間保留設置&#xff0c;總有些配置需要提前預置好&#xff0c;否則閃回查詢和表的時候出現報錯。 需短期恢復&#xff08;秒級~小時&#xff09;直接上UNDO_RETENTION同時啟用RETENTION GUARANTEE&#xff0c;Und…

單片機——浮點數轉換4位數碼管顯示

浮點數轉換4位數碼管顯示 static char buffer[5]; int DecimalPlace 0; #define HideChar h void DisplayFloatOn4LED(float value) {long integer roundf(value );if (integer > 9999) //4位{integer 9999;snprintf(buffer, sizeof(buffer), "%4ld", integer…

金融行業B端系統布局實戰:風險管控與數據可視化的定制方案

摘要 在金融行業&#xff0c;一次小小的數據泄露可能引發千萬級資金損失&#xff0c;一次錯誤的風險評估或許讓企業陷入危機。傳統 B 端系統布局在應對復雜多變的金融業務時&#xff0c;常出現風險預警滯后、數據雜亂無章的情況&#xff0c;讓從業者如履薄冰。如何才能在瞬息萬…

融合LSTM與自注意力機制的多步光伏功率預測新模型解析

這篇論文《Improved multistep ahead photovoltaic power prediction model based on LSTM and self-attention with weather forecast data》&#xff08;2024, Applied Energy&#xff09;聚焦在 多步光伏功率預測 中&#xff0c;如何結合 LSTM 與自注意力機制&#xff08;se…

Blazor-內置輸入組件

封裝的輸入組件 InputCheckbox&#xff1a;表示復選框。InputDate&#xff1a;表示類型為 date 的日期選擇框。InputFile&#xff1a;表示文件上傳。InputNumber&#xff1a;表示數字框。InputRadio&#xff1a;表示單選按鈕。InputRadioGroup&#xff1a;表示單選按鈕組。Inpu…

Qt源碼分析: QChildEvent

本文記錄QChildEvent事件相關代碼分析。 注1&#xff1a;限于筆者研究水平&#xff0c;難免有表述不當&#xff0c;歡迎批評指正。 注2&#xff1a;博文會不定期更新&#xff0c;敬請關注。 一、QChildEvent的發送 分析QObject::setParent代碼&#xff0c;當修改父對象時&…

《Whisper :說明書 》

[論文] [模型卡] [Colab 示例] Whisper 是一種通用的語音識別模型。它基于各種音頻的大型數據集進行訓練&#xff0c;也是一種多任務模型&#xff0c;可以執行多語言語音識別、語音翻譯和語言識別。 方法 Transformer 序列到序列模型針對各種語音處理任務進行訓練&#xff0c;…

回溯----8.N皇后

題目鏈接 /** 將n個棋子放在n*n的棋盤上,不同列,不同行,不同斜線 大致執行流程: 首先選取第一行第一格放置第一個棋子,再從第二行第一個位置開始選取合法的位置(不同行不同列不同斜線)放置棋子,重復上述流程迭代行數, 直到放置n個棋子。 若放置途中出現無合法位置的情況,回溯將…

微機電子拉伸試驗機

對于不同材料的試樣&#xff0c;由于其化學成分及組織的不同&#xff0c;在拉伸過程中會體現 出不同的物理現象及力學性質。西安力創&#xff08;LETRY&#xff09;公司專業制造WDL/WDW系列微機控制電子萬能試驗機&#xff0c;主要適用于金屬板材、棒材、管材、金屬絲、金屬箔、…

【數據結構與算法】數據結構核心概念系統梳理

第一章 緒論:基礎概念體系 ??算法:問題求解步驟的描述。 ??非遞歸的算法效率更高。 1.1 邏輯結構 vs 存儲結構 維度邏輯結構存儲結構(物理結構)定義數據元素之間的邏輯關系數據結構在計算機中的實現方式分類線性/樹形/圖/集合順序/鏈式/索引/散列獨立性獨立于存儲結構…

73頁PPT | 大數據平臺規劃與數據價值挖掘應用咨詢項目解決方案

推薦摘要&#xff1a;在數字化浪潮中&#xff0c;企業數據量呈幾何級增長&#xff0c;卻常因缺乏科學規劃的大數據平臺&#xff0c;陷入數據孤島、處理效率低下的困境&#xff0c;難以充分挖掘數據價值。特推出大數據平臺規劃與數據價值挖掘應用咨詢項目解決方案&#xff0c;正…

gRPC 與 Protobuf 的深度集成 —— 從服務定義到多語言交互(Go + Java 示例)

在前幾篇文章中&#xff0c;我們已經掌握了 Protobuf 的基礎語法、高級特性和序列化反序列化操作。本篇文章將深入講解 gRPC 與 Protobuf 的集成&#xff0c;重點介紹如何通過 .proto 文件定義服務接口&#xff0c;并在 Go 和 Java 中實現 gRPC 服務與客戶端的完整交互流程。我…

可信計算的基石:TPM技術深度解析與應用實踐

可信計算的基石&#xff1a;TPM技術深度解析與應用實踐 引言&#xff1a;數字世界的"信任之錨" 在數據泄露事件頻發的時代&#xff0c;傳統軟件級安全防護已力不從心。TPM&#xff08;可信平臺模塊&#xff09;作為硬件級安全解決方案&#xff0c;正成為現代計算設…

「ECG信號處理——(18)基于時空特征的心率變異性分析」2025年6月23日

一、HRV概述 心率變異性&#xff08;Heart rate variability ,HRV&#xff09;分析是通過測量分析連續正常R-R間期的時間變化來反映心率的變化程度的&#xff0c;根據計算RR 序列的統計指標&#xff0c;或者是畫出RR間期的直方圖和散點圖來反映HRV的大小情況。下面我們從男性與…

【學習筆記】深入理解Java虛擬機學習筆記——第10章 前端編譯與優化

第10章 前端編譯與優化 10.1 概述 1>前端編譯器&#xff1a;Javac命令。 【.java文件->.class文件】 2>即時編譯器&#xff1a;Hotspot.C1.C2 【.class文件->機器碼】 3>提前編譯器&#xff1a;JDK的Jaotc等【.java->機器碼】 10.2 Javac 編譯器 10.2.1 …

Python 區塊鏈與Web3開發指南

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 區塊鏈基礎概念 區塊鏈核心特性 python 復制 下載 class Block:def __init__(self, index, timestamp, data, previous_hash):self.index indexself.timestamp timestampself.data datas…

工業智能體調參閉環:從物料感知到智慧工藝的落地路徑

用戶定義目標&#xff1a;智能工藝的起點不是機器&#xff0c;而是人 在智能制造系統中&#xff0c;工藝調優的第一步并非直接依賴AI或自動化設備&#xff0c;而是始于用戶的明確輸入。用戶需要在系統中定義產品的工藝要求&#xff0c;包括目標尺寸與規格&#xff08;如長寬高…

【Linux學習筆記】進程間通信之共享內存

【Linux學習筆記】進程間通信之共享內存 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 文章目錄 【Linux學習筆記】進程間通信之共享內存前言一. system V共享內存1.1 共享內存數據結構1.2 共享內存函數1.3 共享內存實現通信…

郭碧婷闖入女團賽道 與劉忻張予曦蔡詩蕓組成ROLLING SISTERS

近日&#xff0c;郭碧婷與劉忻、張予曦、蔡詩蕓組成的女團ROLLING SISTERS正式官宣&#xff0c;并發布《Rolling Life》《Alpha》兩首單曲&#xff01; 此次幾位姐姐的組合讓大家眼前一亮&#xff0c;尤其是郭碧婷造型顛覆以往。銀灰色挑染短發搭配棱角分明的黑色煙熏妝&#x…

2025再升級:醫療數智立體化體系V2.0架構簡介

在醫療數智立體化體系第一版基礎上,融入量子物理的第一性原理計算、人工智能(AI)、高性能云計算(HPC)和標準化機器人自動化整合成“醫療數智立體化體系2.0”,代表了醫療研發未來的重要發展方向。這個體系的核心在于深度融合物理世界規律、智能計算與自動化執行,為醫療AI…