EDA开源仿真工具Verilator:简介及Hello World
最近在学习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相关推荐
- EDA开源仿真工具verilator入门1:安装和测试
Verilator介绍 Verilator是一种开源的Verilog/SystemVerilog仿真器,可用于编译代码以及代码在线检查,Verilator能够读取Verilog或者SystemVeri ...
- EDA开源仿真工具verilator入门9:资料总结和最新版本安装
前面的文章已经对verilator相关功能和流程进行了较详细的介绍,由于最近版本更新较多,并且很多粉丝希望有一个更完整的总结,特别是针对最新版本,本节将基于verilator最新版本,对资料和相关内容 ...
- EDA开源仿真工具verilator入门5:调试
在源代码中调用UINFO表示一定debug等级下的打印,消息等级3以及低等级只需要标记 "--debug" 就可以,更高等级需要 "--debugi<level&g ...
- EDA开源仿真工具verilator入门8:verilator 5.0 最新版本仿真玄铁性能对比
verilator最新已经升级到到了5.005,新版本的verilator在功能上更加完善,加入对Semantic Scheduling算法标准的支持,但因此效率肯定会有所损失,本节将接上一节测试最新 ...
- verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser
前面提到用flex和bison开处理命令行参数,回顾一下:开源仿真工具Icarus Verilog中的命令行参数处理方法. 那么Verilog的parser又是怎么实现的呢?简单地说,与做命令行参数的 ...
- Java开源项目EZMorph简介
http://hi.baidu.com/glfbin/blog/item/1302747e8722852e0cd7daaf.html Java开源项目EZMorph简介 2011-04-30 9:40 ...
- NodeJS开源系统Mili简介
NodeJS开源系统Mili简介 mili是一个开源的社区系统,界面优雅,功能丰富. 已在米粒网 得到应用,你完全可以用它来搭建自己的社区.mili的前端使用vue.iview等技术来开发,后端使用t ...
- VEGA:诺亚AutoML高性能开源算法集简介
摘要:VEGA是华为诺亚方舟实验室自研的全流程AutoML算法集合,提供架构搜索.超参优化.数据增强.模型压缩等全流程机器学习自动化基础能力. 本文分享自华为云社区<VEGA:诺亚AutoML高 ...
- 瑞芯微RK PX30中文详解(带开源资料)简介
瑞芯微RK PX30中文详解(带开源资料)简介 非常感谢您选择九鼎创展PX30开发平台,本文档讲述PX30开发平台的硬件资源,电路原理以及支持的接口等. PX30开发板是基于瑞芯微PX30的一款高端开 ...
最新文章
- js 闭包 实战1
- Subject 在 SAP Spartacus Popover Component 中的应用
- 分享三个非常适合新手的网站
- 右边菜单_AI基础教程65:使用文字菜单编辑文字(七)查找字体
- fileoutputstream 文件不存在_总结Java中创建并写文件的5种方式
- 回溯法采用的搜索策略_强化学习基础篇(三十四)基于模拟的搜索算法
- redis 备份导出rdb_Redis学习——Redis持久化之RDB备份方式保存数据
- Java txt转xml中文乱码_JAVA dom4j实现String字符串转换成XML文件(解决中文乱码问题)...
- 翻译:算法常见的模数1000000007 模数10 ^ 9 + 7
- 一口气用Python写了13个小游戏(附源码)
- 空降过来的男领导如何管理女性团队?我的一些实操技巧
- SDOI2015寻宝游戏
- 计算机网络 --- 计算机和因特网2
- 插上移动硬盘计算机没反应,usb硬盘插上电脑没反应怎么办,手把手教你怎么解决...
- 枚举.........
- 腾讯华为签署《深圳市APP个人信息保护自律承诺书》举措新解读
- 优秀的免费高清图片素材网站推荐
- 计算机丢失系统文件如何找回,如何恢复电脑上丢失的文件
- 如何在jsp里面写java代码
- Nginx 对俄罗斯动手了。。。