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 ...
随机推荐
- Delphi实现Windows的气泡提示样式
其实也不复杂,主要使用到shellAPI下的TNotifyIconData这个结构体: typedef struct _NOTIFYICONDATA { DWORD cbSize; //结构体的大小, ...
- CH32F103C8T6的USB开发(一)
一.背景 项目用到单片机采集模拟量数据,原先使用USB转串口,速度嫌慢,还要转串口芯片,电脑还要安装驱动,现更改为采用USB的HID类来传输. 二.单片机选型 STM32F103的USB接口简单易用, ...
- vue后台管理系统——项目优化上线
1. 项目优化 项目优化策略: 使用进度条nprogress 生成打包报告 第三方库启用 CDN Element-UI 组件按需加载 路由懒加载 首页内容定制 ① 使用进度条nprogress 在页面 ...
- Unit Test下使用H2内存数据库
1.Maven引入包 <dependency> <groupId>com.h2database</groupId> <artifactId>h2< ...
- h5移动端识别二维码信息
jsqr插件 图片跨域时不允许绘制到canvas,所以先转blob在画到canvas上面就可以,如果不跨域直接画就行 function getImageBlob (url) { ...
- 4组-Alpha冲刺-6/6
一.基本情况 队名:摸鲨鱼小队 组长博客:https://www.cnblogs.com/smallgrape/p/15574385.html 小组人数:8人 二.冲刺概况汇报 组长:许雅萍 过去两天 ...
- Maven将项目包deploy到nexus私服
maven配置 打开maven安装目录下面的settings.xml,在servers中添加配置.如下: pom配置 在pom文件中加入distributionManagement配置,注意:这里的i ...
- 循环结构(Java)
基本介绍 while循环语法 while(布尔表达式){循环内容} 只要布尔表达式为true,循环则会一直循环下去 我们大多数会让循环停止下来,我们需要一个让表达式失效的方式来结束循环 少部分需要循环 ...
- java不返回某些字段,包括 null
一.使用 fastjson 包. (1) SimplePropertyPreFilter 可以将需要的字段留下来. import com.alibaba.fastjson.JSON;import co ...
- python C# DES 加密转换
import time import base64 import pyDes import binascii def DESEncrypt(desKey, target): key = desKey[ ...