从零开始的RISC-V模拟器开发(一)环境搭建

前言

博主这系列文章是跟随中科院吴伟老师的b站公开课:[完结]从零开始的RISC-V模拟器开发·第一季·2021春季_哔哩哔哩_bilibili 记录的笔记。仅供学习使用,侵删!

苦逼的博主现在自己毕设也是要设计类似的东西。哎。我需要做的是给一个现成的 RISC-V 模拟器作 RVF 扩展。还是挺没有体系的,决定还是来看看课学习一下。

介绍

模拟器:在计算机上模拟真实环境或者假想的运行场景来学习系统工作的方式。比如虚拟开发板。

Spike, Qemu 是 RISC-V 比较成熟的模拟器。本次课程也是围绕这两种主流方式进行模拟。

课程需要的环境是 RISCV GNU toolchain 和 Nuclei RISC-V toolchain。测试环境比如 riscv tools,nuclei SDK 等。

交叉工具链中 Build 是程序构建时的系统(本机),Host 是程序要运行的系统,Target 是要构建的程序的输出的对应架构。

riscv 工具链可以跟随汪辰老师操作系统课程安装,步骤非常清晰。

nuclei 工具链我在安装过程中出了一些问题,我也不能保证说帮读者一定能解决这些问题。我说一下我个人和官方老师沟通后的一些安装建议吧……

需要安装的软件下载链接说明安装建议检验成功安装
riscv-gnu-toolchainriscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com)编译 riscv 架构可运行程序不要 --recursive 克隆,会变得不幸。每个外链仓库分别手动克隆riscv64-unknown-linux-gnu-gcc -v
riscv-toolsriscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com)执行 riscv 架构可执行程序同上.
编译安装 fevsr 和 spike
spike -h
nuclei-riscv-toolchain芯来工具链_专业RISC-V处理器IP及解决方案公司 (nucleisys.com)芯来的工具链2023 以后版本程序名称改为和 riscv-gnu-toolchain 里一样的 riscv64-unknown-elf-gcc,而之前版本的工具链名称为 riscv-nuclei-elf-gcc。我建议学习此课程使用 2022.10 版本工具链, 下载速度有些慢,可以使用我下载下来的工具链:
链接:https://pan.baidu.com/s/1jIZvawmb4Oz7PsOXBclOFw?pwd=4lye
提取码:4lye
riscv-nuclei-elf-gcc -v
nuclei sdkNuclei-Software/nuclei-sdk: Nuclei RISC-V Software Development Kit (github.com)用于评估开发板/软件riscv-nuclei-elf-gcc 相应的 sdk 使用 9369a3a 版本。如果使用23年以后的芯来工具链,就不用切换版本。make CORE=n600 PROGRAM=baremetal/demo_eclic all

Spike

针对 RV 的轻量级 ISA 模拟器。其代码包含在 riscv-tools/riscv-ism-sim 中。

1700576208373

processor 是核心硬件。

cache 只是统计功能使用,统计命中率,并不会真正加速(毕竟这是模拟器)。

spike 对于新扩展支持比较全面,MDFV 都有。

查看 spike 使用帮助:

$ spike -h
Spike RISC-V ISA Simulator 1.1.1-devusage: spike [host options] <target program> [target options]
Host Options:-p<n>                 Simulate <n> processors [default 1]-m<n>                 Provide <n> MiB of target memory [default 2048]-m<a:m,b:n,...>       Provide memory regions of size m and n bytesat base addresses a and b (with 4 KiB alignment)-d                    Interactive debug mode-g                    Track histogram of PCs-l                    Generate a log of execution-s                    Command I/O via socket (use with -d)-h, --help            Print this help message-H                    Start halted, allowing a debugger to connect--log=<name>          File name for option -l--debug-cmd=<name>    Read commands from file (use with -d)--isa=<name>          RISC-V ISA string [default RV64IMAFDC_zicntr_zihpm]--pmpregions=<n>      Number of PMP regions [default 16]--pmpgranularity=<n>  PMP Granularity in bytes [default 4]--priv=<m|mu|msu>     RISC-V privilege modes supported [default MSU]--varch=<name>        RISC-V Vector uArch string [default vlen:128,elen:64]--pc=<address>        Override ELF entry point--hartids=<a,b,...>   Explicitly specify hartids, default is 0,1,...--ic=<S>:<W>:<B>      Instantiate a cache model with S sets,--dc=<S>:<W>:<B>        W ways, and B-byte blocks (with S and--l2=<S>:<W>:<B>        B both powers of 2).--big-endian          Use a big-endian memory system.--misaligned          Support misaligned memory accesses--device=<name>       Attach MMIO plugin device from an --extlib library--log-cache-miss      Generate a log of cache miss--log-commits         Generate a log of commits info--extension=<name>    Specify RoCC ExtensionThis flag can be used multiple times.--extlib=<name>       Shared library to loadThis flag can be used multiple times.--rbb-port=<port>     Listen on <port> for remote bitbang connection--dump-dts            Print device tree string and exit--dtb=<path>          Use specified device tree blob [default: auto-generate]--disable-dtb         Don't write the device tree blob into memory--kernel=<path>       Load kernel flat image into memory--initrd=<path>       Load kernel initrd into memory--bootargs=<args>     Provide custom bootargs for kernel [default: console=ttyS0 earlycon]--real-time-clint     Increment clint time at real-time rate--triggers=<n>        Number of supported triggers [default 4]--dm-progsize=<words> Progsize for the debug module [default 2]--dm-sba=<bits>       Debug system bus access supports up to <bits> wide accesses [default 0]--dm-auth             Debug module requires debugger to authenticate--dmi-rti=<n>         Number of Run-Test/Idle cycles required for a DMI access [default 0]--dm-abstract-rti=<n> Number of Run-Test/Idle cycles required for an abstract command to execute [default 0]--dm-no-hasel         Debug module supports hasel--dm-no-abstract-csr  Debug module won't support abstract CSR access--dm-no-abstract-fpr  Debug module won't support abstract FPR access--dm-no-halt-groups   Debug module won't support halt groups--dm-no-impebreak     Debug module won't support implicit ebreak in program buffer--blocksz=<size>      Cache block size (B) for CMO operations(powers of 2) [default 64]

比较重要的:

p:处理器个数。

m:内存空间大小。

isa:指定指令集(rv32 rv64)。

pc:入口地址。

varch:向量长度。

ic id l2:设置缓存信息,当然起不到加速作用。

extension:扩展。

extlib:添加链接外部库的扩展。添加后 isa 选项可以添加外部库中包含的新指令集。

device:从 extlib 库中附加MMIO插件设备。

-l:生成日志文件。

log-cache-miss:生成缓存命中日志文件。

dump-dts:输出设备树字符串。

g:pc 的跟踪直方图。

d:交互式调试。

rbb-port=<port>:openOCD+gdb 调试。

qemu

spike 是轻量级 CPU,重点在于模拟不同 CPU 如何运行这个程序,针对目标文件;qemu 重点在于模拟不同 CPU,比如 IO 总线 等模拟。

qemu 主要包含两种模式,用户模式类似 spike,即用特定架构去模拟运行程序。系统模式则是模拟出一整个架构硬件环境。

其代码包含在 riscv-gnu-toolchain 中。编译构建推荐大家看这篇博主文章:

Ubuntu20.04搭建RISC-V和qemu环境-CSDN博客

image-20231125011630809

# 查看用户态支持的 CPU 和系统态支持的机器
$ qemu-riscv32 -cpu help
any
lowrisc-ibex
rv32
sifive-e31
sifive-e34
sifive-u34
$ qemu-system-riscv32 -M ?
Supported machines are:
none                 empty machine
opentitan            RISC-V Board compatible with OpenTitan
sifive_e             RISC-V Board compatible with SiFive E SDK
sifive_u             RISC-V Board compatible with SiFive U SDK
spike                RISC-V Spike board (default)
virt                 RISC-V VirtIO board

image-20231125012132439

image-20231125012146382

后面对于 linux 构建,还需要 nuclei-linux-sdk 和 linux 的下载,这里我就先不弄了,环境也忒麻烦了。

image-20231125012617068

下节课先学一下 Spike 的 CPU 模拟吧。

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

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

相关文章

表达式与作用域

1、作用域 表达式由操作数和运算符组成&#xff0c;按照四则运算的法则优先级&#xff0c;大多数运算符可以自定义 下面表达式的优先级从高到低进行排列 这里网上给出的解释是以分号为界限&#xff0c;是执行完分号前加东西还是执行分号后加东西 2、作用域 在子括号中可以调…

buuctf web [极客大挑战 2019]PHP

提示有备份,dirsearch扫描网站备份 GitHub - maurosoria/dirsearch: Web path scanner下载.zip格式文件 解压到python目录下 在上图位置cmd打开窗口 输入python setup.py install安装dirsearch 安装好后输入命令使用dirsearch python dirsearch.py -u http://44296191-973d-…

pandas分组选中最大值并且新增列

题目 根据每个session_id分组&#xff0c;将popular最大的值设为这个session中所有popular的值 category item_id label popular session_id 0 4729 True 53.0 4069 0 4729 True 53.0 4069 0 4729 True 53.0 4069 0…

线性表,也是Java中数组的知识点!

线性表定义&#xff1a; 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表&#xff0c;(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

【Python】用三种方法创建tkinter桌面窗口

Python的tkinter是Python的标准GUI库之一&#xff0c;它是一个开源的、跨平台的GUI工具包&#xff0c;可以用于创建桌面应用程序。 tkinter提供了许多常见的GUI组件&#xff0c;例如按钮、文本框、标签、列表框等等&#xff0c;可以轻松地创建各种类型的桌面应用程序。它还支持…

JavaScript解构数组

还记得之前我们是如何读取到数组里面的元素的么&#xff1f; const arr [2, 3, 4]; const a arr[0]; const b arr[1]; const c arr[2];然后通过这个方式去读取数组中的数据&#xff1b; 现在我们可以使用解构赋值的方法去实现 const [x, y, z] arr; console.log(x, y, …

offer 选择难?说说我的 2 个思考

大家好&#xff0c;我是鱼皮。秋招仍在进行中&#xff0c;随着越来越多的公司开奖&#xff0c;最近 编程导航星球 的小伙伴们也陆续发来了 offer 报喜&#xff1a; 图片 图片 但也有一部分小伙伴陷入了 “甜蜜的烦恼”&#xff0c;拿了几个 offer 却不知道怎么选择。 offer 选择…

大数据数据仓库,Sqoop--学习笔记

数据仓库介绍 1. 数据仓库概念 数据仓库概念创始人在《建立数据仓库》一书中对数据仓库的定义是&#xff1a;数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&#xff08;Subject Oriented&#xff09;、数据集成的&#xff08;Integrated&#xff09;、相对…

【机器学习】聚类(二):原型聚类:LVQ聚类(学习向量量化)

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. LVQ类a. 构造函数b. 闵可夫斯基距离c. LVQ聚类过程e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令行界面 &#xff…

构建SQL Server链接服务器:实现跨服务器数据访问及整合

点击上方蓝字关注我 在SQL Server数据库管理中&#xff0c;链接服务器是一项强大的功能&#xff0c;允许在一个SQL Server实例中访问另一个SQL Server实例的数据。这种功能为数据库管理员提供了灵活性&#xff0c;使其能够跨不同服务器进行数据交互&#xff0c;开辟了更多的应用…

Spring的依赖注入,依赖注入的基本原则,依赖注入的优势

文章目录 Spring的依赖注入依赖注入的基本原则依赖注入有什么优势查找定位操作与应用代码完全无关。有哪些不同类型的依赖注入实现方式&#xff1f;构造器依赖注入和 Setter方法注入的区别 Spring的依赖注入 控制反转IoC是一个很大的概念&#xff0c;可以用不同的方式来实现。…

【开源】基于Vue.js的陕西非物质文化遗产网站

文末获取源码&#xff0c;项目编号&#xff1a; S 065 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S065。} 文末获取源码&#xff0c;项目编号&#xff1a;S065。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与…