从零开始的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.mzph.cn/news/169241.shtml

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

相关文章

STM32 MAP文件

文章目录 1 生成Map2 map中概念3 文件分析流程3.1 Section Cross References3.2 Removing Unused input sections from the image&#xff08;移除未使用的段&#xff09;3.3 Memory Map of the image&#xff08;映像的内存分布&#xff09;3.3.1 加载域3.3.2 运行域 4 代码运…

机器学习探索计划——KNN算法流程的简易了解

文章目录 数据准备阶段KNN预测的过程1.计算新样本与已知样本点的距离2.按照举例排序3.确定k值4.距离最近的k个点投票 scikit-learn中的KNN算法 数据准备阶段 import matplotlib.pyplot as plt import numpy as np# 样本特征 data_X [[0.5, 2],[1.8, 3],[3.9, 1],[4.7, 4],[6.…

软件测试:超详细的Jmeter基础教程

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分 Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a; &#xff…

基于springboot实现高校食堂移动预约点餐系统【项目源码】

基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…

rancher2.6 docker版本部署

1. 拉取镜像 docker pull rancher/rancher:v2.6.5 注&#xff1a; 上面命令中rancher的版本v2.6.5&#xff0c;仅仅是我因为我们环境中使用的k8s都是 1.20.1 到1.23.6 之间的版本。rancher支持的k8s版本&#xff0c;在github上查看&#xff1a;Release Release v2.6.5 ranche…

2023 年 认证杯 小美赛 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…

基于springboot实现乒乓球预约管理系统项目【项目源码】

基于springboot实现乒乓球预约管理系统演示 系统的开发环境 浏览器&#xff1a;IE 8.1&#xff08;推荐6.0以上&#xff09; 开发使用语言&#xff1a;JAVA JDK版本&#xff1a;JDK_8 数据库管理系统软件&#xff1a;Mysql 运行平台&#xff1a;Windows 7 运行环境&#…

破案现场:Docker容器资源限制导致的oom问题

破案现场&#xff1a;Docker容器资源限制导致的oom问题 01 事故现场02 问题定位03 对症下药04 后记 原文来自于微信公众号“运维之美” https://mp.weixin.qq.com/s?__bizMzA5NDY1MTM3MA&mid2247484902&idx1&sn8394aefd884ee09ea546fcd400dd233c&chksm904a136…

是否有无限提取的代理IP?作为技术你需要知道这些

最近有互联网行业的技术小伙伴问到&#xff0c;有没有可以无限提取的代理IP&#xff1f;就是比如我一秒钟提取几万、几十万次&#xff0c;或者很多台机器同时调用API提取链接&#xff0c;这样可以吗&#xff1f;看到这个问题&#xff0c;不禁沉思起来&#xff0c;其实理论上是存…

python基础教程:动态参数

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 Python的动态参数有两种&#xff0c;分别是*args和**kwargs&#xff0c; 这里面的关键是一个和两个星号的区别&#xff0c;而不是args和kwargs在名字上的区别&#…

js粒子效果(二)

效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Particle Animation</title><…

一篇文章让你入门python集合和字典

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、集合: 增加 add 删除 del 删除集合 discard(常用)删除集合中的元素 &#xff0c;删除一个不存在的元素不会报错 remove 删除一个不存在的元素会报错 pop随…

【点云surface】Poisson表面重建

1 介绍 Poisson表面重建算法是一种用于从点云数据生成平滑曲面模型的算法。它基于Michael Kazhdan等人在2006年发表的论文《Poisson surface reconstruction》。该算法通过将点云数据转换为体素表示&#xff0c;并利用Poisson方程来重建曲面。 该算法的基本原理是将点云数据转…

训练日志——wandb

目录 安装与登录基础使用与可视化常用函数wandb.init()wandb.config()wandb.log()wandb.finish()wandb.watch() 参考 安装与登录 安装 pip install wandb注册并登录 https://wandb.ai/site客户端登陆 在终端中输入wandb login 然后出现You can find you API key的一串网站&am…

【MinIO】几个有用的方法

在windows总安装Minio 进入网址 在Windows安装时&#xff0c;选择相应的exe文件下载&#xff0c;下载到本地后&#xff0c;使用如下的命令即可在前台启动&#xff1a; minio.exe server D:\your_path 或者将该路径写进环境变量的path中&#xff0c;用来为minio指定数据存储…

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(三):核心机制策略

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:核心机制策略,子节点表示追问或同级提问 异常处理 …

想当老师应该去学什么专业

专业选择是决定未来职业发展的重要步骤&#xff0c;如果你也想成为一名老师&#xff0c;那么这五个专业可能会适合你&#xff01; 教育学专业 教育学专业是培养教育理论和方法的学科&#xff0c;这些理论知识将帮助你理解教学过程、学生发展、课程设计和评估。该专业将让你全面…

【沐风老师】在3dMax中如何把对象随机散布在表面上?

在3dMax中如何把对象随机散布在表面上&#xff1f; 在这个教程中&#xff0c;给大家讲解在3dMax中如何把对象随机散布到另一个对象的表面上。有不少3dMax的初学者在将对象分布在随机表面上时感到手足无措。如果&#xff0c;将每个对象手动放置在表面上并花时间调整每个对象根本…

怎么当代课老师教学生

老师朋友们&#xff0c;有没有帮忙当过代课老师呢&#xff1f;或者&#xff0c;没当过的老师是不是对这种职业充满了好奇&#xff1f;让我来分享一下&#xff0c;当代课老师的日常是什么样的吧&#xff01; 备课 说起备课&#xff0c;那可是个大工程&#xff01;不过&#xff…

教师编制缩减是为什么

老师们有没有注意到一个趋势&#xff1f;那就是教师编制正在逐步缩减。不知道你们发现没有&#xff0c;我最近在研究教育领域的新闻&#xff0c;发现这两年教师编制缩减的消息越来越多。这是为什么呢&#xff1f;今天就来跟大家聊一聊。 原因一&#xff1a;资金压力 第一个原因…