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…