分享一个我最近完成过的小项目--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 模拟器的更多相关文章

  1. verilog实现的16位CPU单周期设计

    verilog实现的16位CPU单周期设计 这个工程完成了16位CPU的单周期设计,模块化设计,包含对于关键指令的仿真与设计,有包含必要的分析说明. 单周期CPU结构图 单周期CPU设计真值表与结构图 ...

  2. 16位CPU多周期设计

    16位CPU多周期设计 这个工程完成了16位CPU的多周期设计,模块化设计,有包含必要的分析说明. 多周期CPU结构图 多周期CPU设计真值表 对应某一指令的情况,但仅当对应周期时才为对应的输出,不是 ...

  3. 64位linux下安装ps模拟器ePSxe

    早就想在爱机上玩ps游戏,特别是彩京的1945一代和非常经典的实况足球2002版.在ubuntu64位下可以通过wine模拟的方式运行windows版的ePSxe,但是总觉得差些呢?非原生啊!网上搜了 ...

  4. 64位ubuntu安装N64模拟器mupen64

    我们知道在windows平台下模拟器多如牛毛,N64的模拟器也不例外.而linux下对于想玩N64的童鞋们有啥好办法呢?我通过度娘找到一款开源的N64模拟器mupen64,其官方网址为:http:// ...

  5. 单周期cpu设计代码解读

    目录 写在前面 单周期cpu设计代码讲解 概念回顾 Verilog代码讲解 写在前面 欢迎转载,转载请说明出处. 单周期cpu设计代码讲解 概念回顾 一.电子计算机的部件 分为:中央处理器(cpu). ...

  6. centos 7 64位虚机上android4环境运行

    场景 现在的开发大多是在linux的虚拟机上进行,现在有些工作和android有关,因此初步尝试了一下是否可以和目前的场景进行统一. 系统是在vmware workstaion上的centos 7的6 ...

  7. <转>32位移植到64位 注意事项

    32bit-64bit porting work注意事项 64位服务器逐步普及,各条产品线对64位升级的需求也不断加大.在本文中,主要讨论向64位平台移植现有32位代码时,应注意的一些细小问题. 什么 ...

  8. 用VC进行64位编程

    用VC进行64位编程 分类: C/C++2014-04-30 15:14 532人阅读 评论(0) 收藏 举报 本文转自:http://www.usidcbbs.com/read-htm-tid-52 ...

  9. 64位Redhat系统应用(c++代码)搭建-使用informix和g++编译

    这篇博客很有必要写下来,记录我在一个比较原生的Linux系统上搭建一套应用所遇到的各种问题和各种坑. 关于这套应用,算是我离职前的一个项目,不完成的话没有办法交差,同时,这个项目也比较紧,合作行一直在 ...

  10. windows 64位下,React-Native环境搭建详解 (Android)

    React-Native环境搭建需要: 1.安装Java JDK 2.安装Android Studio 3.安装node.js 4.安装git 5.安装Python 2.x (注意目前不支持Pytho ...

随机推荐

  1. 简述ECMAScript6的新特性

    1.增加块级作用域 2.增加let const 3.解构赋值 4.函数参数拓展(函数参数可以使用默认值,不定参数及拓展参数) 5.增加class类支持 6.增加箭头函数 7.增加模块和模块加载(ES6 ...

  2. Django启动时提示ModuleNotFoundError: No module named 'xxx'的原因

    ①创建项目:django-admin startproject DL ②创建app:python manage.py startapp myapp ③启动服务:python manage.py run ...

  3. openEuler22.09初始化脚本

    #!/bin/bash s=`nmcli d | grep "已断开" | awk '{print $1}'` echo /etc/sysconfig/network-script ...

  4. wait_event_interruptible() 等待队列

    在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞进程的唤醒. 1.定义"等待队列头部" wait_queue_head_t my_queue; wait_ ...

  5. jmeter&badboy安装

    一.jmeter下载地址: 1. http://jmeter.apache.org/download_jmeter.cgi   \  https://www.apache.org/dist/jmete ...

  6. python中将各种类型表达式中的 \ 符号,都看作转义符

    python中将各种类型表达式中的 \ 符号,都看作转义符,如 \n 代表换行  \t  代表空tab,还发现 \a 相当于什么都不是,改行末尾的 \ 的意思是该行还没写完,接着下边一行的内容. 转义 ...

  7. LoadRunner压力测试(web)

    1.打开Virtual User Generator->新建脚本->选择创建新脚本类型,web-HTTP,HTML->创建 2.录制脚本 3.停止脚本录制 4.创建controlle ...

  8. mysql主从复制常见问题(useing version:8)

    Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ...

  9. form表单 css的选择器和一些属性以及盒子模型,浮动

    form表单 <form action='' method='' enctype=''> <input type='text'> input:更下type属性就可以得到对应的效 ...

  10. windows远程linux桌面

    TigerVNC是一个高性能.平台无关的虚拟网络计算(Virtual Network Computing,VNC)实现,是一个客户端/服务器应用程序,允许用户在远程机器上启动并与图形应用程序进行交互. ...