默认顶层模型名称为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的更多相关文章

  1. 一起买beta版模块单元测试

    一起买beta版模块接口单元测试 测试目的 保证代码质量,对各个模块进行单元测试,不仅可以有效地保证代码的可靠性,让模块在与别的模块整合时出现更少的错误. 而且不用每次启动程序而等待浪费时间. 单元描 ...

  2. 一招解决OpenERP8.0安装旧版模块报错

    有喜欢尝鲜的网友开始玩8.0了,可是版本还没发布,社区的很多特别好的模块还没有升级到8,所以经常碰到模块无法安装的问题. No module name osv 网友提出将模块的 from osv im ...

  3. IIC模块TestBench的书写方法

    今天在看黑金AX309FPGA开发板自带教程中的EEPROM那一章,考虑如何写其中iic_com模块的TestBench,难点在于1. 该模块存在一个inout型的端口信号:2. 时序较为复杂,不可能 ...

  4. PC版模块滚动不显示滚动条效果

    以前对某个模块增加无滚动条的滚动效果,还需要找个插件才能实现,现在发现个简单方法,用普通的CSS就可以实现. 此方法只适用于不显示滚动条的滚动效果,如果需要自定义滚动条样式,还是需要插件来实现. HT ...

  5. web框架推导 wsgiref模块 jinja2模板语法 django框架简介 django基本操作

    目录 纯手撸web框架 web框架的本质 手写web框架 存在的问题 基于wsgiref模块 基本介绍 推导流程 代码封装优化 总结 动静态网页 jinja2模块 前端.后端.数据库三者联动 推导流程 ...

  6. Django框架——手写web框架、wsgiref模块、动静态网页、jinja2模块、主流web框架、Django简介、基本使用、app概念、目录结构、三板斧

    web应用 '''通过浏览器访问的应用程序!!!''' 1.两种模式c/s b/s B/S:browser---------------->server 2.web应用程序的有点 2.1 只需要 ...

  7. (22)odoo 安装旧模块报错处理

    一些老版本的模块没有得到升级,所以经常碰到模块无法安装的问题. No module name osv 将模块的 from osv import osv,fields 改为 from openerp.o ...

  8. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增模块管理界面导出功能(可按条件导出)

    导出功能在很多应用场景中都需要,RDIFramework.NET V3.2版本在模块管理界面新增了导出功能,方便管理员对所有配置的模块进行管理. 一.Web版模块管理导出功能 Web版本的模块导出功能 ...

  9. 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块

    前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  10. python 模块使用

    模块使用 定义:模块就像一个工具包一样,里面有很多工具(函数.类),使用时需要通过import导入. 分类: 标准库:random.sys.os.time 第三方:就是好人已经写好的特定功能的模块,你 ...

随机推荐

  1. IDEA自动导包(全局设置)

    选择[File]-->[other settings]-->[settings for new projects](全局设置),然后搜索[Auto Import],勾选以下两个选项即可: ...

  2. CentOS7 安装git 配置秘钥公钥克隆代码

    建议购买阿里云香港服务器可以免备案,系统镜像选择CentOS7测试 第一步:安装git客户端,默认安装在/usr/libexec/git-core目录 yum -y install git #查看版本 ...

  3. Qt编写安防视频监控系统51-功能激活

    一.前言 随着视频监控系统本身功能的增多,以及用户定制功能的增多(比如视频监控系统摇身一变成了机器人监控.无人机监控.挖掘机监控等),除了提供工作模式这个切换开关,还需要对不同的工作模式启用禁用不同的 ...

  4. 查询 maven 依赖 的最新版本号

    如何通过maven官网查询相关依赖的具体代码和版本? 通过官网:http://mvnrepository.com/,或者:https://search.maven.org/ 在搜索栏中输入想要引入的依 ...

  5. Optional的使用与解析

    引言 今天在项目中看到了大量Optional的使用,之前我也了解过Optional,是Java8中的新特性,并且便利地为空指针问题提供了处理方法,可以避免繁琐的if/else. 但是并没有真正在项目中 ...

  6. .NET 开发的分流抢票软件,不做广告、不收集隐私

    前言 每年春节大家必备的抢票工具Bypass-分流抢票.分流抢票是一款免费无广适用于PC端的自动分流抢票软件. 分流抢票,是以用户为中心.人性化的抢票软件.不做广告.不做推广.不携带病毒.不收集隐私信 ...

  7. c# 微软小冰-虚拟女友聊天

    using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System ...

  8. nginx平台初探-3

    过滤模块简介 (90%) 执行时间和内容 (90%) 过滤(filter)模块是过滤响应头和内容的模块,可以对回复的头和内容进行处理.它的处理时间在获取回复内容之后,向用户发送响应之前.它的处理过程分 ...

  9. ElasticSearch(1)---Logstash同步Mysql数据到ElasticSearch

    1. 单机部署-场景描述 elasticsearch只用过,没有部署或者维护过,从头完整走一遍,记录下,原创实战,有需要的朋友参考下. 2 . 解决方案 特别说下,以前win7下安装的3台虚拟机,没有 ...

  10. RocketMQ -- offset管理

    正文首先来明确一下 Offset 的含义, RocketMQ 中, 一 种类型的消息会放到 一 个 Topic 里,为了能够并行, 一般一个 Topic 会有多个 Message Queue (也可以 ...