最近在学习Verilator背后的原理,本文对于Verilator的基本功能做了简要的叙述,并简要讲解了hello world的运行过程。也算是学习之中的一点笔记了!
更详细的内容,一定还是要看Verilator的官方User Guide啊!https://verilator.org/guide/latest/verilating.html

Verilator总体介绍

Verilator将Verilog等HDL设计转化为可执行的C++或SystemC的model。与传统的HDL仿真器不同,Verilator更像是一个编译器。

1、与GCC类似,Verilator需要用户指定编译时的各种配置参数。对于若干SV代码文件,Verilator对其进行静态检查,之后有选择地在代码中加入coverage收集或waveform tracing等instrument。最后将SV的DUT编译为一个C++或SystemC源代码级别的软件多线程模型。这个软件模型由若干.cpp .h文件组成。我们管这个编译的过程叫Verilating,管这个DUT的软件模型叫做 “A Verilated Model”

2、如果想对于DUT转化来的Verilated Model进行仿真,用户需要写少量的C++ wrapper files。在wrapper中,包含整体仿真程序的main函数入口。DUT的Verilated Model在仿真程序中是一个实例化的C++类。wrapper在这里的作用相当于为已经软件化的DUT提供一个实际的运行平台。
(如下面代码中,ibex_simple_system就是待测SoC系统经Verilating后得到的C++ 类)


3、最终,用户编写的C++ wrapper(几个手写的C++文件)、由DUT转化来的Verilated Model(一大堆自动生成的C++文件)、和由Verilator提供的若干库,一起经过编译链接,最终形成一个可执行文件。

4、运行这一可执行文件会启动实际的仿真。

5、可执行文件(仿真)结束后,会产生覆盖率分析,波形文件等数据,用户可以对此进行后续的分析。

Verilator Hello World

下面我们用Verilator提供的hello world例子来解释上面的过程。

下面就是我们的DUT。module中只有一个initial块,输出hello world之后结束仿真。

//our.v
module our;initial begin $display("Hello World"); $finish;endendmodule

下面是我们的wrapper.
Vour.h是由Verilator对我们的our module编译之后产生的文件。Vour也就是DUT对应的软件model。

// sim_main.cpp#include "Vour.h"#include "verilated.h"int main(int argc, char** argv, char** env) {VerilatedContext* contextp = new VerilatedContext;contextp->commandArgs(argc, argv);Vour* top = new Vour{contextp};while (!contextp->gotFinish()) { top->eval(); }delete top;delete contextp;return 0;}

运行如下命令,该命令执行了这些功能:对our.v执行verilating生成C++模型,将wrapper files、Vour的C++模型、以及Verilator提供的库,一起编译链接生成一个可执行文件Vour。

verilator --cc --exe --build -j 0 -Wall sim_main.cpp our.v

命令运行完会生成如下的文件。这里面的Vour是最终仿真程序的可执行文件。

运行这一可执行文件会得到如下结果。

这是因为module中只有一个initial块。在这个块中,display了一个hello word,之后就调用finish结束仿真了。(display和finish都是不可综合,但可以仿真的Verilog系统函数)。

对应到sim_main.cpp中的行为,主程序先启动一个context类,之后读取command args以配置相关环境(这里我们命令中没有更多的args)。在环境准备完成后, 实例化Vour类。
当eval()函数被调用时,Verilator会寻找时钟信号的变化,之后对相关的always块中的逻辑进行状态更新和计算。由于这里只有一个initial块,我们也没有设置时钟信号,第一次调用eval时只会执行到initial块中的内容,在display之后发出了finish信号。结束了这次eval之后,contextp->gotFinish()检测到finish信号的触发,于是终止循环。结束整个仿真程序。

EDA开源仿真工具Verilator:简介及Hello World相关推荐

  1. EDA开源仿真工具verilator入门1:安装和测试

    Verilator介绍 Verilator是一种开源的Verilog/SystemVerilog仿真器,可用于编译代码以及代码在线检查,Verilator能够读取Verilog或者SystemVeri ...

  2. EDA开源仿真工具verilator入门9:资料总结和最新版本安装

    前面的文章已经对verilator相关功能和流程进行了较详细的介绍,由于最近版本更新较多,并且很多粉丝希望有一个更完整的总结,特别是针对最新版本,本节将基于verilator最新版本,对资料和相关内容 ...

  3. EDA开源仿真工具verilator入门5:调试

    在源代码中调用UINFO表示一定debug等级下的打印,消息等级3以及低等级只需要标记 "--debug" 就可以,更高等级需要 "--debugi<level&g ...

  4. EDA开源仿真工具verilator入门8:verilator 5.0 最新版本仿真玄铁性能对比

    verilator最新已经升级到到了5.005,新版本的verilator在功能上更加完善,加入对Semantic Scheduling算法标准的支持,但因此效率肯定会有所损失,本节将接上一节测试最新 ...

  5. verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser

    前面提到用flex和bison开处理命令行参数,回顾一下:开源仿真工具Icarus Verilog中的命令行参数处理方法. 那么Verilog的parser又是怎么实现的呢?简单地说,与做命令行参数的 ...

  6. Java开源项目EZMorph简介

    http://hi.baidu.com/glfbin/blog/item/1302747e8722852e0cd7daaf.html Java开源项目EZMorph简介 2011-04-30 9:40 ...

  7. NodeJS开源系统Mili简介

    NodeJS开源系统Mili简介 mili是一个开源的社区系统,界面优雅,功能丰富. 已在米粒网 得到应用,你完全可以用它来搭建自己的社区.mili的前端使用vue.iview等技术来开发,后端使用t ...

  8. VEGA:诺亚AutoML高性能开源算法集简介

    摘要:VEGA是华为诺亚方舟实验室自研的全流程AutoML算法集合,提供架构搜索.超参优化.数据增强.模型压缩等全流程机器学习自动化基础能力. 本文分享自华为云社区<VEGA:诺亚AutoML高 ...

  9. 瑞芯微RK PX30中文详解(带开源资料)简介

    瑞芯微RK PX30中文详解(带开源资料)简介 非常感谢您选择九鼎创展PX30开发平台,本文档讲述PX30开发平台的硬件资源,电路原理以及支持的接口等. PX30开发板是基于瑞芯微PX30的一款高端开 ...

最新文章

  1. js 闭包 实战1
  2. Subject 在 SAP Spartacus Popover Component 中的应用
  3. 分享三个非常适合新手的网站
  4. 右边菜单_AI基础教程65:使用文字菜单编辑文字(七)查找字体
  5. fileoutputstream 文件不存在_总结Java中创建并写文件的5种方式
  6. 回溯法采用的搜索策略_强化学习基础篇(三十四)基于模拟的搜索算法
  7. redis 备份导出rdb_Redis学习——Redis持久化之RDB备份方式保存数据
  8. Java txt转xml中文乱码_JAVA dom4j实现String字符串转换成XML文件(解决中文乱码问题)...
  9. 翻译:算法常见的模数1000000007 模数10 ^ 9 + 7
  10. 一口气用Python写了13个小游戏(附源码)
  11. 空降过来的男领导如何管理女性团队?我的一些实操技巧
  12. SDOI2015寻宝游戏
  13. 计算机网络 --- 计算机和因特网2
  14. 插上移动硬盘计算机没反应,usb硬盘插上电脑没反应怎么办,手把手教你怎么解决...
  15. 枚举.........
  16. 腾讯华为签署《深圳市APP个人信息保护自律承诺书》举措新解读
  17. 优秀的免费高清图片素材网站推荐
  18. 计算机丢失系统文件如何找回,如何恢复电脑上丢失的文件
  19. 如何在jsp里面写java代码
  20. Nginx 对俄罗斯动手了。。。

热门文章

  1. 日语学习笔记(五十音图篇)
  2. Java Web 19 — SVN(VisualSVN、TortoiseSVN、IDEA下SVN的配置)
  3. 数据库导出的csv文件纯数字被转为科学计数法
  4. 数组专题讲义之简单排序算法
  5. 蓝牙耳机真的方便了我们的生活?
  6. 老泪纵横!咱07年炒股居然还巨亏
  7. 一建公共课推荐老师详解
  8. java获取本机mac物理地址
  9. 命令行启动 TeamViewer
  10. Swagger的安装以及SpringBoot整合Swagger2实现SwaggerAPI文档测试