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

news2024/11/24 12:51:19

目录

  • 前言
  • 工具安装
    • 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"); // 创建一个日志文件夹

	// 传递参数给verilator
	contextp->commandArgs(argc, argv);

//如果生成FST格式的wave
#if CONFIG_FST_WAVE_TRACE
	contextp->traceEverOn(true);		  // 启用跟踪
	top->trace(tfp, 99);				  // 采样深度为99
	tfp->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_TRACE
		tfp->dump(contextp->time()); // 按照时间采样
#endif
	}

/*****************仿真结束,一些善后工作***************/
#if CONFIG_FST_WAVE_TRACE
	tfp->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"
	@echo


gdb:
	@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.coloradmin.cn/o/2220430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

coze上构建必应搜索工作流

首先登入COZE网站&#xff0c;打开工作空间&#xff0c;进入后默认是个人空间&#xff0c;在其下方选择资源库&#xff0c;最后在右上角点击资源按钮&#xff0c;在弹出的列表中点击工作流。 构建必应搜索工作流 Coze官方介绍&#xff1a;必应搜索插件&#xff0c;其中插件输…

【网络】IP协议的地址管理

【网络】IP协议的地址管理 一. IP协议格式二. 地址管理1.动态分配IP地址2.NAT机制2.1 NAT机制下网络的请求/响应 3. 网段划分3.1 特殊的IP地址 4.路由选择5.DNS域名解析系统 一. IP协议格式 4位版本号(version): 指定IP协议的版本&#xff08;IPv4/IPv6&#xff09;, 对于IPv4来…

AI工具:最受欢迎与最佳体验的探索

在当今数字化的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的广泛应用正在彻底改变我们的生活方式、工作方式和社会交往。AI工具不仅在工业生产、医疗诊断、金融服务等领域发挥着关键作用&#xff0c;还深入日常生活&#xff0c;为人们带来便捷与高效。本文将探讨…

基于SpringBoot的旅店管理系统的设计与实现源码+Vue前端(酒店、民宿、功能较多)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

基于JSP实习管理系统【附源码】

基于SSM的学生管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统功能结构设计 4.3数据库设计 4.3.1数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1管理员功能介绍 5.1.1管理员登录 5.1.2…

RuoYi-Vue若依 环境搭建 速成

一、若依简介 RuoYi-Vue 是一个开源的后台管理系统&#xff0c;适用于快速开发企业级应用。该平台由两部分组成&#xff1a;前端和后端。 &#xff08;1&#xff09;技术框架 前端技术&#xff1a; Vue.js: 前端框架使用 Vue.js&#xff0c;这是一种流行的JavaScript框架&a…

鸿蒙网络编程系列28-服务端证书锁定防范中间人攻击示例

1. TLS通讯中间人攻击及防范简介 TLS安全通讯的基础是基于对操作系统或者浏览器根证书的信任&#xff0c;如果CA证书签发机构被入侵&#xff0c;或者设备内置证书被篡改&#xff0c;都会导致TLS握手环节面临中间人攻击的风险。其实&#xff0c;这种风险被善意利用的情况还是很…

数据结构与算法——Java实现 44.翻转二叉树

目录 226. 翻转二叉树 思路 代码 本地代码测试 不管前方的路有多苦 只要走的方向正确 不管多么崎岖不平 都比站在原地更接近幸福 —— 24.10.21 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输…

GEE引擎传奇UI界面修改教程

还记得小林之前给大家分享了gom引擎UI界面编辑教程&#xff0c;今天给大家分享一下gee引擎UI界面修改教程 首先打开登录器生成器-客户端界面设置 在客户端界面设置这里可以自定义UI素材&#xff0c;也可以直接在原素材上编辑主界面 传奇根目录指向的是你的传奇客户端根目录&am…

单神经元建模:基于电导的模型[神经元结构、静息电位和等效电路]

文章目录 神经元结构、静息电位和等效电路神经元结构静息电位能斯特方程1. **描述浓度比的非线性关系**&#xff1a;2. **化学势与电势的关系**&#xff1a;3. **对称性**&#xff1a;4. **热力学与平衡**&#xff1a;总结&#xff1a; GHK方程Nernst方程和GHK方程的对比 等效电…

深度学习:YOLO目标检测和YOLO-V1算法损失函数的计算

简介 YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;它的核心思想是将目标检测问题转化为一个回归问题&#xff0c;通过一个神经网络直接预测目标的类别和位置。 YOLO算法将输入图像分成SxS个网格&#xff0c;每个网格负责预测…

cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验

一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…

Kafka之原理解析

定义 Kafka 是一个分布式流媒体平台&#xff0c;kafka官网&#xff1a;http://kafka.apache.org/ Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统&#xff0c;最初由 LinkedIn 公司开发&#xff0c;使用Scala 语言编写&#xff0c;目前是Apache 的开源项目。 流媒体…

深入解析Golang GMP

文章目录 1. 引言2. GMP 模型概述与核心结构体2.1. G&#xff08;Goroutine&#xff09;2.2. M&#xff08;Machine/Thread&#xff09;2.3. P&#xff08;Processor&#xff09;2.4. 全局调度器schedt&#xff08;Scheduler&#xff09; 3. Goroutine 的生命周期与状态管理3.1…

子比主题美化-用户中心隐私功能

前言 子比主题用户中心的文章、评论、粉丝等默认全部人可见&#xff0c;但是有时不想让全部人可见就可以开启此功能 图片展示 教程开始 把以下代码添加到子比主题下&#xff0c;按顺序找到该文件/inc/functions/zib-author.php&#xff0c;在zib-author.php第374行把原代码删…

面试官:`interrupted()` 和 `isInterrupted()` 你真的用懂了吗?

感谢Java面试教程的 Java面试题&#xff1a;interrupted和isInterrupted方法的区别 在Java中&#xff0c;interrupted() 和 isInterrupted() 是用于检查线程中断状态的方法&#xff0c;但它们之间有一些关键的区别。 方法类型&#xff1a; interrupted() 是一个静态方法&…

每月洞察:App Store 和 Google Play 的主要更新

Google Play 和 App Store 的算法不断发展&#xff0c;定期更新和变化会显着影响其功能。对于开发人员和营销人员来说&#xff0c;跟上这些变化至关重要&#xff0c;因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新&#xff0c;解释它…

基于微信小程序二手物品调剂系统设计与实现

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个…

【Pycharm】显示内存不足the IDE is running low on memory解决方法

Pycharm提示显示内存不足the IDE is running low on memory解决方法 在右上角找到Help&#xff0c;点击&#xff0c;找到change memory settings 修改数值如1024&#xff0c;2048 等&#xff0c;增大容量即可。最后点击save and Restart

Newstar_week1_week2_wp

week1 wp crypto 一眼秒了 n费马分解再rsa flag&#xff1a; import libnum import gmpy2 from Crypto.Util.number import * p 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297…