64位的单周期 RISC-V 模拟器
分享一个我最近完成过的小项目--64位的单周期 RISC-V 模拟器,这个项目我最近参与一生一芯计划过程中完成的一个小项目。
需要用到的相关知识:Verilog、Verilator、计算机组成原理、汇编、RISC-V、C语言、C++、编译与链接、Mekfile、Linux、Shell
1. 于开始前
由于一生一芯计划的性质以及学术诚信的原因,该项目不会开源,本文章重在分享该项目的实现思路。当然,如果你在尝试复现该项目时,遇到了问题可以发给我邮箱(1439627984@qq.com),如何提问可以参考这个网站。
2.项目简介
该项目使用 Verilog 来实现单周期 RISC-V CPU 的行为,C 语言实现相关外设以及存储器的功能,外设包括 VGA、时钟、串口等。
最终的完整项目可以运行任意 C 语言程序,甚至可以跑一个红白机模拟器。
3.项目组成
该项目可以分为两个部分:
【1】使用 Verilog 编写的 RTL 代码:该部分实现了 CPU 除存储器之外所有功能。(这里我后面简称为npc)
【2】PA实验提供的框架代码:南京大学一个超硬核的编程实验(一个用来折磨人的实验
4.项目实现思路
【1】完成 PA 实验
完成 PA 实验至少到 PA2,做到熟悉 PA 实验提供的代码框架,便于后续的使用。
【2】编写 npc
使用 Verilog 实现一个64位单周期 RISC-V CPU除存储器之外所有功能,具体实现可以参考南京大学的数电实验。
【3】将 npc 接入 PA 框架中
完成上面的俩步后,便是需要将npc接入到PA提供的框架代码中了。具体可以细分为几步:
① 熟悉编译过程
通过阅读 Verilator 编译生成的 Makefile,能给自己编写一个新的 Makefile 实现 C 语言仿真 Verilog,即调用通过 Verilator 生成的 C++ 文件,为后续把 npc 接入到 PA 框架中做好基础
② 改写 NEMU
改写 PA 中 NEMU 代码,具体的是,先改写 KConfig 配置文件,使其支持一个新 ISA-npc。作为验证,应先是直接复制在 PA2 中已经实现的 RISC-V64,改写对应的代码,完成编译。
③ 封装 npc 并调用
通过编写 API,封装 Verilog 编译生成的 C++文件,再改写 NEMU 中 inst.c 的实现,使其是调用我们刚刚封装的 API 实现正常工作的。
【4】调试与优化
这步时,我们已经有了一个完成的框架了,接着要做的就是不断的调试加优化了,而在调试时我们可以复用PA提供的一切的基础设施、外设与测试环境,这就是为什么要引用 PA 框架代码的原因之一。
64位的单周期 RISC-V 模拟器的更多相关文章
- verilog实现的16位CPU单周期设计
verilog实现的16位CPU单周期设计 这个工程完成了16位CPU的单周期设计,模块化设计,包含对于关键指令的仿真与设计,有包含必要的分析说明. 单周期CPU结构图 单周期CPU设计真值表与结构图 ...
- 16位CPU多周期设计
16位CPU多周期设计 这个工程完成了16位CPU的多周期设计,模块化设计,有包含必要的分析说明. 多周期CPU结构图 多周期CPU设计真值表 对应某一指令的情况,但仅当对应周期时才为对应的输出,不是 ...
- 64位linux下安装ps模拟器ePSxe
早就想在爱机上玩ps游戏,特别是彩京的1945一代和非常经典的实况足球2002版.在ubuntu64位下可以通过wine模拟的方式运行windows版的ePSxe,但是总觉得差些呢?非原生啊!网上搜了 ...
- 64位ubuntu安装N64模拟器mupen64
我们知道在windows平台下模拟器多如牛毛,N64的模拟器也不例外.而linux下对于想玩N64的童鞋们有啥好办法呢?我通过度娘找到一款开源的N64模拟器mupen64,其官方网址为:http:// ...
- 单周期cpu设计代码解读
目录 写在前面 单周期cpu设计代码讲解 概念回顾 Verilog代码讲解 写在前面 欢迎转载,转载请说明出处. 单周期cpu设计代码讲解 概念回顾 一.电子计算机的部件 分为:中央处理器(cpu). ...
- centos 7 64位虚机上android4环境运行
场景 现在的开发大多是在linux的虚拟机上进行,现在有些工作和android有关,因此初步尝试了一下是否可以和目前的场景进行统一. 系统是在vmware workstaion上的centos 7的6 ...
- <转>32位移植到64位 注意事项
32bit-64bit porting work注意事项 64位服务器逐步普及,各条产品线对64位升级的需求也不断加大.在本文中,主要讨论向64位平台移植现有32位代码时,应注意的一些细小问题. 什么 ...
- 用VC进行64位编程
用VC进行64位编程 分类: C/C++2014-04-30 15:14 532人阅读 评论(0) 收藏 举报 本文转自:http://www.usidcbbs.com/read-htm-tid-52 ...
- 64位Redhat系统应用(c++代码)搭建-使用informix和g++编译
这篇博客很有必要写下来,记录我在一个比较原生的Linux系统上搭建一套应用所遇到的各种问题和各种坑. 关于这套应用,算是我离职前的一个项目,不完成的话没有办法交差,同时,这个项目也比较紧,合作行一直在 ...
- windows 64位下,React-Native环境搭建详解 (Android)
React-Native环境搭建需要: 1.安装Java JDK 2.安装Android Studio 3.安装node.js 4.安装git 5.安装Python 2.x (注意目前不支持Pytho ...
随机推荐
- 20200923--计算鞍点(奥赛一本通P91 4)
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点.鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值. 例如:在下面的例子中(第4行第1列的元素就是鞍 ...
- 20200921--同行列对角线的格(奥赛一本通P89 2 二维数组)
输入三个自然数n,i,j(1<=i<=n,1<=j<=n),输出在一个n*n格的棋盘中(行列均从1开始编号),与格子(i,j)同行,同列,同一对角线的所有格子的位置. 如:n= ...
- springboot[2.3.4.RELEASE]application.properties常用配置
常用配置 spring.profiles.active=@spring.profiles.active@ pom文件中定义的配置文件 server.port=8080 web默认访问端口 server ...
- 高并发解决方案之 redis 分布式锁
背景:秒杀服务中要写一个定时任务:活动到期时给order微服务发送关闭订单的通知.这需要改变数据库表中的数据,而集群中服务是多节点的方式进行部署,会出现并发执行的情况,所以采用的redis的分布式锁的 ...
- Unity 转小游戏
填写appid 和游戏资源位置 在导出的项目里可以修改游戏资源位置 两个目录 minigame 是小程序打开的目录 webgl 是要下载的的资源 下载一个http 服务器就有了 和JS交互 大部分js ...
- 剑指offer-孩子们的游戏
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- python高阶编程(一)
1.生成器 通过列表⽣成式,我们可以直接创建⼀个列表.但是,受到内存限制,列表容量肯定是有限的.⽽且,创建⼀个包 含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后 ...
- k8s介绍和学习思路
1. Kubernetes介绍 Kubernetes是一个完备的分布式系统支撑平台.具备完备的集群管理能力,包括多层次的安全防护和准入机制.多租户应用支撑能力.透明的服务注册和服务发现机制.内建的智能 ...
- 加热算法,加热温度控制加热功率,加热功率控制加热速度(PWM)
uint8_t user_heating_algorithmPID(void) { uint32_t temp_1; uint16_t Adcn; nrfx_err_t err_code; HEATI ...
- 【javascript】关于charCodeAt()方法
在做算法题目leetcode 2283时,看见某些答案会使用charCodeAt(),因为自己没用过,所以作此纪录 描述在 JavaScript 中,charCodeAt() 是一种字符串方法,用于检 ...