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 第三方:就是好人已经写好的特定功能的模块,你 ...
随机推荐
- 用EwoMail开源版搭建邮箱服务器
介绍: EwoMail是基于Linux的开源邮件服务器,支持一键搭建,集成了众多优秀稳定的组件,是一个快速部署.简单高效.安全稳定的邮件解决方案,支持电脑和手机的客户端,适合个人或邮箱功能需求少的企业 ...
- Qt编写安防视频监控系统19-日志查询
一.前言 日志查询功能是基础功能,主要分两块,一个是本地日志查询,包括运行日志.报警日志.操作日志:一个是设备日志查询,就是通过SDK去拉去NVR设备的日志信息,包括系统操作.配置操作.报警操作.录像 ...
- hhhhhhomework 验证码界面(非全部自己完成)
import javax.swing.*;//import 代表"引入" //javax.swing 代表"路径" (在javax文件夹下的swing文件夹) ...
- Solution Set - IQ ↓↓
Q: 为什么说雨兔是个傻子? A: 因为一路上全是星号标记. 呃, 本来的好像是 constructive || greedy, 但感觉最近整体题量不高, 就换成 2700-2900 了. 然后惊 ...
- .net core2.2版本下载地址
下载地址: https://download.visualstudio.microsoft.com/download/pr/279de74e-f7e3-426b-94d8-7f31d32a129c/e ...
- 反射:获取Class 类的实例(四种方法)
Class 类 对象照镜子后可以得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象.一个 Class 对象包含了 ...
- java中的文件流File
数据 + 流(转)操作 IO I表示的是:输入Input O表示的是:Output Stream表示流转 java中的管道不止一个.并且管道有可能不是一样的. 有的管道粗有的管道细 File的常用方法 ...
- Nim 从入门到实战
Nim Nim 是一个与其 1.0 版本相似的新颖且令人兴奋的命令式编程语言.我使用 Nim 是为了它的性能与优雅,这无疑让我感到了莫大的乐趣.在这篇文章中我将向您展示一个我写的 Nim 项目的全部流 ...
- shell脚本获取本机ip地址
IP=`ifconfig|grep -v '127.0.0.1'|grep -v 'inet6'|grep 'inet'|awk '{print $2}'|awk 'NR==1'|egrep -o ' ...
- Flink窗口
一.窗口介绍 1.1 Window:时间窗口 滚动窗口(Tumbling Window)将事件拆分成固定长度,窗口之间不重叠,窗口长度固定 例:每10s统计过去10s订单数据 滑动窗口(Sliding ...