verilator书写C++版模块testbench
默认顶层模型名称为top,环境名称为contextp
const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext};
const std::unique_ptr<Vxxx> top{new Vxxx{contextp.get(), "TOP"}};
// xxx为自定义待测模块名,由Makefile生成类在Vxxx.h中
仿真信号的操控
总共3种语句:
- 信号延时:
contextp->timeInc(1);,数字为设定的时间宽度,单位默认ps,表示先前状态的时延 - 信号赋值:
top->xxx = xxx;,xxx为信号名称,表示时延之后信号的新值 - 模型同步:
top->eval();,就是Evaluate Model
前两种负责改变仿真状态,最后的模型同步负责保存前两种的状态改变,同步到波形图中。若没有最后的模型同步,仿真信号不会更新到波形图中。
模型大致总结如下:

注意点1
前两种语句的顺序无所谓。
信号延时表示以之前top->eval()记录的状态保持多少时间;信号赋值表示在时延之后信号应该是什么值。两种语句任意调换顺序都不会影响波形变化。
注意点2
根据前述总结模型,仿真过程中时序逻辑上升沿的判断应在模型同步之后。
在时钟上升沿处手动调整信号,则上升沿处读入的是调整后的信号,举例如下
contextp->timeInc(1);
top->clk = !top->clk;
top->div_signed_i = 0;
top->Z_i = 0x00000010;
top->D_i = 0x00000004;
top->div_valid = 1; // 调高
top->res_ready = 1;
top->eval();
// specific test
std::cout << "[specific test]" << std::endl;
div_expRes(top->Z_i, top->D_i, top->div_signed_i, expRes);
contextp->timeInc(1);
top->clk = !top->clk;
top->div_valid = 0; // 调低,此处为时钟上升沿
top->eval();
若上升沿div_valid为高,完成握手则div_status变为1。此处没有,说明仿真时上升沿得到的div_valid为后赋的值0
注意点3
对于每次模型同步,信号延时语句的数值会相加;而信号赋值则会后语句覆盖前语句,举例如下
① top->eval()前单次信号赋值和时延:
// init signal
top->Z_i = 1;
top->rst_n = 0;
top->clk = 0;
top->eval(); // 别忘了这一个,初始的赋值
contextp->timeInc(1); // 保持当前信号情况,持续1ps时间
top->clk = !top->clk; // 信号改变
top->Z_i = 2;
top->eval(); // 模型同步
可见,同步了1ps
② top->eval()前多次信号赋值和时延:
// init signal
top->Z_i = 1;
top->rst_n = 0;
top->clk = 0;
top->eval(); // 别忘了这一个,初始的赋值
contextp->timeInc(1); // 保持当前信号情况,持续1ps时间
top->clk = !top->clk; // 信号改变
top->Z_i = 2;
contextp->timeInc(1);
top->Z_i = 1;
top->eval(); // 模型同步
看到clk为1(若再取反则变为0);Z_i为1
③ 用两个top->eval()分别记录两次状态变化:
// init signal
top->Z_i = 1;
top->rst_n = 0;
top->clk = 0;
top->eval();
contextp->timeInc(1); // 保持当前信号情况,持续1ps时间
top->clk = !top->clk; // 信号改变
top->Z_i = 2;
top->eval();
contextp->timeInc(1);
top->clk = !top->clk;
top->Z_i = 1;
top->eval(); // 模型同步

简写宏
据此理解书写,倒有种写固定管线OpenGL的感觉。
对于有时钟信号的tb,用宏包装一下更舒服(写法还是从os那儿学的)
#define step(statements) do { \
contextp->timeInc(1); \
top->clk = !top->clk; \
{statements} \
top->eval(); \
} while (0)
使用时仅需
step(); //无信号改变
step({
top->xxx = 0x12;
// ...
}); // 延时完改变信号
verilator书写C++版模块testbench的更多相关文章
- 一起买beta版模块单元测试
一起买beta版模块接口单元测试 测试目的 保证代码质量,对各个模块进行单元测试,不仅可以有效地保证代码的可靠性,让模块在与别的模块整合时出现更少的错误. 而且不用每次启动程序而等待浪费时间. 单元描 ...
- 一招解决OpenERP8.0安装旧版模块报错
有喜欢尝鲜的网友开始玩8.0了,可是版本还没发布,社区的很多特别好的模块还没有升级到8,所以经常碰到模块无法安装的问题. No module name osv 网友提出将模块的 from osv im ...
- IIC模块TestBench的书写方法
今天在看黑金AX309FPGA开发板自带教程中的EEPROM那一章,考虑如何写其中iic_com模块的TestBench,难点在于1. 该模块存在一个inout型的端口信号:2. 时序较为复杂,不可能 ...
- PC版模块滚动不显示滚动条效果
以前对某个模块增加无滚动条的滚动效果,还需要找个插件才能实现,现在发现个简单方法,用普通的CSS就可以实现. 此方法只适用于不显示滚动条的滚动效果,如果需要自定义滚动条样式,还是需要插件来实现. HT ...
- web框架推导 wsgiref模块 jinja2模板语法 django框架简介 django基本操作
目录 纯手撸web框架 web框架的本质 手写web框架 存在的问题 基于wsgiref模块 基本介绍 推导流程 代码封装优化 总结 动静态网页 jinja2模块 前端.后端.数据库三者联动 推导流程 ...
- Django框架——手写web框架、wsgiref模块、动静态网页、jinja2模块、主流web框架、Django简介、基本使用、app概念、目录结构、三板斧
web应用 '''通过浏览器访问的应用程序!!!''' 1.两种模式c/s b/s B/S:browser---------------->server 2.web应用程序的有点 2.1 只需要 ...
- (22)odoo 安装旧模块报错处理
一些老版本的模块没有得到升级,所以经常碰到模块无法安装的问题. No module name osv 将模块的 from osv import osv,fields 改为 from openerp.o ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增模块管理界面导出功能(可按条件导出)
导出功能在很多应用场景中都需要,RDIFramework.NET V3.2版本在模块管理界面新增了导出功能,方便管理员对所有配置的模块进行管理. 一.Web版模块管理导出功能 Web版本的模块导出功能 ...
- 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块
前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- python 模块使用
模块使用 定义:模块就像一个工具包一样,里面有很多工具(函数.类),使用时需要通过import导入. 分类: 标准库:random.sys.os.time 第三方:就是好人已经写好的特定功能的模块,你 ...
随机推荐
- Spring Boot整合Thrift RPC
[转载] https://coder4.com/homs_online/spring-boot/sb-thrift.html Spring Boot自动配置简介 在介绍RPC之前,我们先来学习下Spr ...
- Fastadmin框架,服务器搭建环境
FastAdmin 基于ThinkPHP和Bootstrap的极速后台开发框架 https://www.fastadmin.net 安装node.js 1.获取node.js资源 V8.x: curl ...
- JVM实战—11.OOM的原因和模拟以及案例
大纲 1.线上系统突然由于OOM内存溢出挂掉 2.什么是内存溢出及哪些区域会发生内存溢出 3.Metaspace如何因类太多而发生内存溢出 4.无限制调用方法如何让线程的栈内存溢出 5.对象太多导致堆 ...
- G1原理—4.G1垃圾回收的过程之Young GC
大纲 1.G1的YGC过程 2.YGC并行处理阶段的过程 3.YGC串行处理阶段的过程(一) 4.YGC串行处理阶段的过程(二) 5.整个YGC的执行流程总结 1.G1的YGC过程 (1)YGC相关的 ...
- NoSQL和SQL的区别、使用场景与选型比较
什么是NoSQL NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,它具有非关系型.分布式.不提供ACID的数 ...
- docker 使用centos镜像运行javaweb
Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种"轻量级"容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公 ...
- shell脚本中的逻辑判断
shell脚本中也可以实现逻辑判断. 案例4:shell脚本中的逻辑判断 如果你学过C或者其他语言,相信你不会对if 陌生,在shell脚本中我们同样可以使用if逻辑判断.在shell中if判断的基本 ...
- 找不到 MSVCP60D.dll
问题 VC++ 运行程序时,出现错误: 解决办法 参考:链接 1.下载MSVCP60D.dll,下载:链接 下载的文件为64位,故应将文件复制到:C:\Windows\SysWOW64目录 2.打开& ...
- 安全、高效!天翼云HPFS助企业一臂之力!
近年来,随着各行业数智转型逐步深入以及人工智能大模型的蓬勃发展,气象分析.大模型训练.自动驾驶.石油勘探.EDA仿真.基因分析等高性能计算(HPC)场景和智算场景(AI)不仅对算力需求激增,也产生了图 ...
- Keepalived基本原理
本文分享自天翼云开发者社区<Keepalived基本原理>,作者:Ujnrfc Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案.高可用:广义来讲, ...