Verilator——最简单、最细节上手教程

目录

  • 前言
  • 工具安装
    • Verilator 安装
    • GTKwave 安装
  • Verilator 基础用法
    • fst格式和vcd格式的wave文件
    • Verilator 的使用
  • Verilator 的进阶使用
    • 与GDB搭配
    • 与makefile搭配
  • Verilator 的高阶用法
    • 访问模块内部数据

前言

此教程会以ubuntu22.04为例
从如何安装,到如何使用
全程帮助你学习和使用verilator

狂肝3h,倾心之作

如有笔误、问题,欢迎指出、讨论~

点赞,收藏,长期翻看~

工具安装

Verilator 安装

利用git进行快速安装(安装方法摘自官网Verilator)

# 安装的前提:
sudo apt-get install git help2man perl python3 make autoconf g++ flex bison ccache
sudo apt-get install libgoogle-perftools-dev numactl perl-doc
sudo apt-get install libfl2  # 只有Ubuntu需要,如果报错就忽略
sudo apt-get install libfl-dev  # 只有Ubuntu需要,如果报错就忽略
sudo apt-get install zlibc zlib1g zlib1g-dev  # 只有Ubuntu需要,如果报错就忽略git clone https://github.com/verilator/verilator   #只需克隆一次# Every time you need to build:
unsetenv VERILATOR_ROOT  # 对csh操作,如果是使用bash就忽略
unset VERILATOR_ROOT  # 对bash操作
cd verilator
git pull         # 确保git的仓库是最新的
git tag          # 查看可选版本#选择以下的其中一个执行:
#git checkout master      # 使用开发分支(例如最近的bug修复版本)
#git checkout stable      # 使用最新的稳定版本
#git checkout v{version}  # 切换到指定版本autoconf         # 创建脚本
./configure      # 配置并创建makefile
make -j `nproc`  # 构建verilator (如果报错试试只输入“make”)
sudo make install

然后执行

verilator --version	#检查版本,检查是否安装成功

GTKwave 安装

用来查看verilator生成的波形文件

有两种安装方法:

  1. 直接从ubuntu自带的应用商城搜索gtkwave,即可安装在这里插入图片描述
  2. 使用apt-get命令来安装
sudo apt-get install gtkwave
gtkwave --version	//查看版本,检查是否安装成功

Verilator 基础用法

fst格式和vcd格式的wave文件

varilator可以生成两种格式的wave文件:

  1. fst格式
    • FST格式的波形文件大致是VCD格式的1/50
    • 该格式只能用gtkwave打开,其他波形查看软件不支持
  2. vcd格式
    • 文件大小较大
    • 可以用多种波形查看软件查看

鉴于fst格式的优点,以及网上很少关于生成fst格式的教程,因此我以生成fst为例,如若要生成vcd可以上网查阅资料

接下来我将介绍如何使用verilator

Verilator 的使用

cpp为例,并介绍如何生成fst wave文件的生成

可以看官方的例程 :官方c++例程
此处我挑出其中重点的部分来讲解

假设我们用verilog写一个双控开关:

//顶层文件名为top,因此等会include的头文件为Vtop
//若顶层文件名为example,则include的头文件名为Vexample
module top(input clk,input rst,input a,input b,output f
);assign f = a ^ b;
endmodule

仿真过程用c++来描述,文件如下:

//与verilator无关的一些头文件
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>//使用verilater必须include
#include "Vtop.h" //仿真模型的头文件,由top.v生成,如果顶层文件名更改则也需要更改
#include <verilated.h>#define CONFIG_FST_WAVE_TRACE 1// contextp用来保存仿真的时间
VerilatedContext *contextp = new VerilatedContext;// 构建一个名为top的仿真模型
Vtop *top = new Vtop{contextp};//如果生成FST格式的wave
#if CONFIG_FST_WAVE_TRACE
#include "verilated_fst_c.h"			//波形文件所需的头文件
VerilatedFstC *tfp = new VerilatedFstC; // 创建一个波形文件指针
#endif//仿真的过程
int main(int argc, char **argv)
{Verilated::mkdir("build/logs"); // 创建一个日志文件夹// 传递参数给verilatorcontextp->commandArgs(argc, argv);//如果生成FST格式的wave
#if CONFIG_FST_WAVE_TRACEcontextp->traceEverOn(true);		  // 启用跟踪top->trace(tfp, 99);				  // 采样深度为99tfp->open("build/logs/cpu_wave.fst"); // 打开波形文件,文件地址和文件名可以自定义
#endif/***************对top端口的初始化*******************/top->clk = 0;top->rst = 0;/**************verilator的仿真循环*****************/while (!contextp->gotFinish())	// ctrl+c 可以停止仿真{/************设置vtop仿真的输入信号************/int a = rand() & 1;int b = rand() & 1;top->a = a;top->b = b;top->clk = !top->clk; // 随着仿真时间倒转clk,产生时钟周期top->eval(); //更新电路状态printf("a = %d, b = %d, f = %d\n", a, b, top->f);	//按需打印想要的contextp->timeInc(1); //推动仿真时间#if CONFIG_FST_WAVE_TRACEtfp->dump(contextp->time()); // 按照时间采样
#endif}/*****************仿真结束,一些善后工作***************/
#if CONFIG_FST_WAVE_TRACEtfp->close(); // 关闭波形文件
#endif// 清理top仿真模型,并销毁相关指针,并将指针变为空指针top->final();delete top;top = nullptr;delete contextp;contextp = nullptr;return 0;
}

完成文件的编写后,我们要让verilator编译并运行
在命令行中输入

verilator -Wall top.v top_main.cpp --cc --trace-fst --exe --build
./obj_dir/Vtop   //必须执行这个,才运行仿真,生成波形
gtkwave build/logs/cpu_wave.fst	//用gtk打开波形文件

Verilator 的进阶使用

与GDB搭配

gdb可以很方便得对仿真的过程进行调试

如何使用请详见 “与makefile搭配”

与makefile搭配

如果每次使用verilator都要在命令行中输入以上命令,有点太麻烦了
因此可以利用makefile

########### 不要在变量后面加多余空格,否则会导致变量名出问题 ###########
########### 因此也不要在变量后面加注释,以避免上述情况发生 ############顶层文件的名字
TOPNAME = top#指定verilator
VERILATOR = verilator######################## 包含相关文件 ########################
#相关文件的地址
INCLUDE_PATH = ./build/chisel ./src/main/cpp/#对地址添加 -I的前缀
INCFLAGS = $(addprefix -I, $(INCLUDE_PATH))######################## cxx编译选项 ########################
CXXFLAGS += $(INCFLAGS) -DTOP_NAME="\"V$(TOPNAME)\""
#生成调试信息
CXXFLAGS += -g
#让错误信息带颜色,不知道有没有用
CXXFLAGS += -fdiagnostics-color=auto
CFLAGS_TRACE += -DITRACE_COND=$(if $(CONFIG_ITRACE_COND),$(call remove_quote,$(CONFIG_ITRACE_COND)),true)
CXXFLAGS  += $(CFLAGS_TRACE)######################## 链接器编译选项 ########################
#链接器的选项,包含readline库
LDFLAGS += -lreadline######################## 构建后的项目 ########################
#构建后的地址
BUILD_DIR = ./build/verilator#构建后文件存放的地址
OBJ_DIR = $(BUILD_DIR)/obj_dir#可执行文件的地址
BIN = $(OBJ_DIR)/$(TOPNAME)######################## verilator选项 ########################
#创建生成文件的目录,存放生成的文件
VERILATOR_CFLAGS += --Mdir $(OBJ_DIR)#优化分配 
VERILATOR_CFLAGS += -x-assign fast#将所有warning 变成error
VERILATOR_FLAGS += -Wall#Make waveforms,fst格式
VERILATOR_CFLAGS += --trace-fst#检查SystemVerilog断言
VERILATOR_CFLAGS += --assert#debug模式,生成更多调试信息
VERILATOR_FLAGS += --debug#Add this trace to get a backtrace in gdb
VERILATOR_FLAGS += --gdbbt# 可用gdb调试
VERILATOR_FLAGS += --gdb#加速编译
VERILATOR_CFLAGS += -j#包含verilog中include的文件地址
VERILATOR_CFLAGS += $(INCFLAGS)#使用DPI-C
VERILATOR_CFLAGS += --vpi#调用工具链来构建库,不加则由verilator自己构建
VERILATOR_CFLAGS += --build#指定顶层文件
VERILATOR_CFLAGS += --top-module $(TOPNAME)#将cxx参数传给gcc编译
VERILATOR_CFLAGS += $(addprefix -CFLAGS , $(CXXFLAGS))#将ld参数传给ld链接
VERILATOR_CFLAGS += $(addprefix -LDFLAGS , $(LDFLAGS))#生成C++可执行文件,并指定文件名字
VERILATOR_CFLAGS += --cc --exe -o $(abspath $(BIN))######################## 查找相关文件 ########################
VSRCS = $(shell find $(abspath ./build/chisel) -name "*.v" -or -name "*.sv")
CSRCS = $(shell find $(abspath ./src/main/cpp) -name "*.c" -or -name "*.cc" -or -name "*.cpp")run:@echo "-------- VERILATE --- AND --- BUILD --------"#清空再创建目的地目录@rm -rf $(OBJ_DIR)@mkdir -p $(OBJ_DIR)#执行命令@$(VERILATOR) $(VERILATOR_CFLAGS) $(VSRCS) $(CSRCS)@echo@echo "-------------------- RUN --------------------"#清空再创建波形文件夹并@rm -rf $(BUILD_DIR)/logs@mkdir -p $(BUILD_DIR)/logs#执行可执行文件,运行并仿真,生成波形@$(BIN) +trace@echo@echo "-------------------- DONE --------------------"@echo "To see waveforms, open $(BUILD_DIR)/logs/cpu_wave.fst in a waveform viewer"@echogdb:@echo "-------- VERILATE --- AND --- BUILD --------"#清空再创建目的地目录@rm -rf $(OBJ_DIR)@mkdir -p $(OBJ_DIR)#执行命令@$(VERILATOR) $(VERILATOR_CFLAGS) $(VSRCS) $(CSRCS)@echo@echo "-------------------- GDB --------------------"#清空再创建波形文件夹并@rm -rf $(BUILD_DIR)/logs@mkdir -p $(BUILD_DIR)/logs#gbd执行可执行文件,运行并仿真,生成波形gdb -s $(BIN) --args $(BIN)@echo@echo "-------------------- DONE --------------------"@echo "To see waveforms, open $(BUILD_DIR)/logs/cpu_wave.fst in a waveform viewer"@echo

然后在当前目录下执行

make run	//执行仿真
make gdb	//使用gdb

即可

Verilator 的高阶用法

访问模块内部数据

前面的介绍中,我们要访问模块的数据,只能访问到顶层模块top的输入输出端口,假如我要访问其中内部的wire和reg数据该怎么办呢?

verilator为在将verilog文件编译为cpp文件进行仿真的时候,我们可以在仿真文件中访问verilator将.v文件转化后的cpp文件来访问数据

只需在上面的仿真文件中增加以下内容

#include "../build/obj_dir/Vtop___024root.h"//然后就可以通过top来访问了
printf("data:%x",top->rootp->top__DOT__my_regfile__DOT__reg_f[1])
//my_regfile为实例化的模块名
//reg_f为模块中定义的reg型
//若你想输出你想要的数据可以在 ../build/obj_dir/Vtop___024root.h 头文件中寻找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/453090.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双十一购物节有哪些好物值得入手?2024双十一好物清单合集分享

一年一度的双十一购物狂欢节即将来临&#xff0c;各大平台纷纷开启预热活动&#xff0c;伴随着品牌的疯狂折扣和满减优惠&#xff0c;众多商品即将迎来超值的价格。现在正是大家“剁手”换新装备的大好时机。作为一名深耕智能产品多年的资深达人&#xff0c;今天这期我将从不同…

论文研读 | End-to-End Object Detection with Transformers

DETR&#xff1a;端到端目标检测的创新 —— 作者 Nicolas Carion 等人 一、背景与挑战 目标检测是计算机视觉领域的一个核心任务&#xff0c;要求模型精确识别图像中的物体类别和位置。传统方法如 Faster R-CNN&#xff0c;因其区域建议网络等复杂结构&#xff0c;使得模型调…

Java使用原生HttpURLConnection实现发送HTTP请求

Java 实现发送 HTTP 请求&#xff0c;系列文章&#xff1a; 《Java使用原生HttpURLConnection实现发送HTTP请求》 《Java使用HttpClient5实现发送HTTP请求》 《SpringBoot使用RestTemplate实现发送HTTP请求》 1、HttpURLConnection 类的介绍 HttpURLConnection 是 Java 提供的…

Siri哑口无言?苹果AI功能落后竞争对手整整2年

就在近期&#xff0c;苹果员工声称&#xff1a;苹果的AI技术可能落后于其主要竞争对手整整两年之久。这个消息犹如一颗重磅炸弹&#xff0c;在科技圈引发了广泛的讨论和猜测。究竟是什么原因导致了这个曾经的创新先锋在AI赛道上如此落后&#xff1f; 苹果AI落后近两年&#xff…

安装nginx实现多ip访问多网站

关闭防火墙并停selinux&#xff1a; 挂载&#xff1a; 安装nginx&#xff1a; 判断nginx是否成功启动&#xff1a; 打开nmtui并添加多个ip&#xff1a; 重启nmtui&#xff1a; 查看多ip是否配置成功: 配置文件&#xff1a; 创建文件&#xff1a; 根据配置在主机创建数据文件&a…

leetcode day1 910+16

910 最小差值 给你一个整数数组 nums&#xff0c;和一个整数 k 。 在一个操作中&#xff0c;您可以选择 0 < i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] x &#xff0c;其中 x 是一个范围为 [-k, k] 的任意整数。对于每个索引 i &#xff0c;最多 只能 …

实现vlan间的通信

方法一&#xff1a;单臂路由 概述 单臂路由是一种网络配置&#xff0c;它允许在路由器的一个物理接口上通过配置多个子接口来处理不同VLAN的流量&#xff0c;从而实现VLAN间的通信。 原理 路由器重新封装MAC地址&#xff0c;转换Vlan标签 基础模型 1、配置交换机的链…

oracle数据恢复—文件损坏导致Oracle数据库打开报错的数据恢复案例

oracle数据库故障&分析&#xff1a; 打开oracle数据库时报错&#xff0c;报错信息&#xff1a;“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有&#xff1a;控制文件损坏、数据文件损坏、数据文件…

【Linux】解析在【进程PCB】中是如何实现【信号的处理方式(抵达/未决/阻塞)】

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

Docker架构

什么是 Docker&#xff1f; Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础设施分离&#xff0c;从而更快速地交付软件。通过 Docker&#xff0c;您可以像管理应用程序一样管理基础设施。利用 Docker 在代码发布、测试和部署方面的方…

聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项

目录 一、IOC容器的刷新环节快速回顾 二、postProcessBeanFactory源码展示分析 &#xff08;一&#xff09;模版方法postProcessBeanFactory &#xff08;二&#xff09;AnnotationConfigServletWebServerApplicationContext 调用父类的 postProcessBeanFactory 包扫描 …

数字后端零基础入门系列 | Innovus零基础LAB学习Day2

今天开始更新数字IC后端设计实现中Innovus零基础Lab学习后续内容。 数字后端零基础入门系列 | Innovus零基础LAB学习Day1 ####LAB5-2 这个章节的目标也很明确——学习掌握工具的一些常用快捷键。 这里只需要掌握以下几个快捷键即可。其他小编我也不会&#xff0c;也用不着。…

MATLAB电车(宝马 i3)卸载电池再利用电气模型分析

&#x1f3af;要点 特性测试评估卸载电池性能以及不同温度下电池容量和电阻。使用两种电气模型评估和模拟卸载电池可利用性能。从宝马 i3模块中提取三星三元锂方形电池作为评估电池&#xff1a;容量测量、电阻测量&#xff0c;对比新电池性能。使用的等效电路模型以及用于校准…

文心一言 VS 讯飞星火 VS chatgpt (373)-- 算法导论24.4 5题

五、请稍微修改 Bellman-Ford 算法&#xff0c;使其能够在 〇(nm) 时间内解决由 n 个未知变量和 m 个约束条件所构成的差分约束系统问题。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; Bellman-Ford 算法本身就是一个用于解决差分约束系统问题的经典算法&…

【途牛旅游网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

工作日志:vue3各种警告

1、遇见报错&#xff0c;但也没啥影响&#xff0c;不知怎么回事。 可是我没写过这东西啊。 2、一个警告。 它表示在渲染过程中尝试访问组件实例上不存在的属性linkTags。 解决办法&#xff1a;在该属性前&#xff0c;加个v-if判断。 3、 意味着在模板渲染过程中尝试访问了…

LeetCode102. 二叉树的层序遍历(2024秋季每日一题 43)

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…

数据结构 - 队列

队列也是一种操作受限的线性数据结构&#xff0c;与栈很相似。 01定义 栈的操作受限表现为只允许在队列的一端进行元素插入操作&#xff0c;在队列的另一端只允许删除操作。这一特性可以总结为先进先出&#xff08;First In First Out&#xff0c;简称FIFO&#xff09;。这意味…

【资料集】项目全周期过程管理资料、各类软件建设方案、源码梳理清单(全原件)

该资源库深度覆盖开发、运维、实施等核心流程&#xff0c;全面囊括项目从立项至结项的各类必需文档&#xff0c;如验收辅助材料、资质审核流程及投标策略方案等&#xff0c;确保项目生命周期的每个阶段都能找到相应的支持与依据。此外&#xff0c;资源库精心整理了研发流程细节…

Docker 容器 数据卷 使用

目录 常用 命令 什么是数据卷以及特点 如何挂载数据卷 数据卷容器 数据覆盖问题 修改已经建立的数据卷关系 博主wx&#xff1a;yuanlai45_csdn 博主qq&#xff1a;2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信)&#xff0c;或者想要 cpp 方向修改简历&…