Go to file
liangkangnan 233bb1fb23 fpga: constrs: do not constraint JTAG_CLK clk
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-07-25 16:20:54 +08:00
fpga fpga: constrs: do not constraint JTAG_CLK clk 2020-07-25 16:20:54 +08:00
pic pic: update arch.jpg 2020-06-27 10:11:46 +08:00
rtl rtl:timer: update interrupt assert 2020-07-12 22:33:15 +08:00
sim sim: add uart_debug.v 2020-07-04 17:21:50 +08:00
tb tb: set uart debug disable 2020-07-04 17:31:58 +08:00
tests example: common.mk: add Makefile dep 2020-07-25 15:24:50 +08:00
tools tools: add uart download script 2020-07-04 14:36:02 +08:00
.gitignore remove .elf 2020-05-27 23:05:39 +08:00
LICENSE first release 2019-12-04 08:47:19 +08:00
README.md README: update 2020-07-11 16:09:59 +08:00

README.md

与本项目配套的设计文档《从零开始写RISC-V处理器》,目前已经更新完第三章硬件篇,开始更新软件篇。

1.初衷

本开源项目的初衷是本人想入门RISC-V熟悉RISC-V的指令内容和汇编语法。

本人对RISC-V很感兴趣很看好RISC-V的发展前景觉得RISC-V就是CPU中的Linux。由于RISC-V是这两年才开始迅速发展的因此关于RISC-V的学习参考资料目前还很少特别是适合入门的资料因此学习起来进度很缓慢于是萌生了自己从零开始写RISC-V处理器核的想法。

本人是一名FPGA小白为了快速入门、深入掌握RISC-V我开始了学习FPGA和verilog的"艰难"历程。我工作的内容是和嵌入式软件相关的平时根本不会接触到FPGA也不会用到RISC-V因此只能用业余时间来学习RISC-V。

网上有不少关于RISC-V的开源项目但是大多都写得很"高深"对于我这种小白来说学习起来是非常吃力的不太适合入门。本项目目前的代码量非常少是很简单易懂的对于想入门RISC-V的同学来说是一个很好的参考希望能够吸引更多的同学参与到RISC-V的学习中来促进RISC-V的发展如果能起到抛砖引玉的作用的话那就更好了也许说是砖的话就有点夸大了但哪怕是起到一颗沙子的作用也就足矣。

2.介绍

本项目实现的是一个单核32位的小型RISC-V处理器核(tinyriscv)采用verilog语言编写。设计目标是对标ARM Cortex-M3系列处理器。tinyriscv有以下特点

  1. 支持RV32IM指令集通过RISC-V指令兼容性测试
  2. 采用三级流水线,即取指,译码,执行;
  3. 可以运行C语言程序
  4. 支持JTAG可以通过openocd读写内存(在线更新程序)
  5. 支持中断;
  6. 支持总线;
  7. 支持FreeRTOS
  8. 支持通过串口更新程序;
  9. 容易移植到任何FPGA平台(如果资源足够的话)

项目中的各目录说明:

rtl该目录包含tinyriscv的所有verilog源码

sim该目录包含仿真批处理bat文件和脚本

tests该目录包含测试程序源码其中example目录为C语言程序例程源码isa目录为RV32指令测试源码

tools该目录包含编译汇编和C语言程序所需GNU工具链和将二进制文件转成仿真所需的mem格式文件的工具BinToMem还有通过串口下载程序的脚本。BinToMem_CLI.exe需要在cmd窗口下执行BinToMem_GUI.exe提供图形界面双击即可运行

pic:存放图片;

tb该目录包含仿真的testbench文件

fpga存放FPGA相关文件比如约束文件

tinyriscv的整体框架如下

tinyriscv整体框架

tinyriscv目前外挂了6个外设每个外设的空间大小为256MB地址空间分配如下图所示

地址空间分配

3.CoreMark测试

目前tinyriscv在Xilinx Artix-7 35T FPGA平台(时钟50MHz)上运行CoreMark跑分程序的结果如下图所示

tinyriscv跑分

可知tinyriscv的跑分成绩为2.4。此成绩是基于指令在rom存储和数据在ram存储的情况下得出的如果指令和数据都在ram的话跑分上3.0问题应该不大。

选了几款其他MCU的跑分结果如下图所示

其他MCU跑分结果

更多MCU的跑分结果可以到coremark官网查询。

4.如何使用

本项目运行在windows平台编译仿真工具使用的是iverilog和vpp波形查看工具使用的是gtkwave。

4.1安装环境

在使用之前需要安装以下工具:

  1. 安装iverilog工具

可以在这里http://bleyer.org/icarus/下载安装过程中记得同意把iverilog添加到环境变量中当然也可以在安装完成后手动进行添加。安装完成后iverilog、vvp和gtkwave等工具也就安装好了。

  1. 安装GNU工具链

可以通过百度网盘下载(链接: https://pan.baidu.com/s/1bYgslKxHMjtiZtIPsB2caQ 提取码: 9n3c),或者通过微云下载https://share.weiyun.com/5bMOsu9下载完成后将压缩包解压到本项目的tools目录下。注意目录的层次结构解压后的工具路径应该如下所示

tinyriscv\tools\gnu-mcu-eclipse-riscv-none-gcc-8.2.0-2.2-20190521-0004-win64\bin\riscv-none-embed-gcc

  1. 安装make工具

可以通过百度网盘下载(链接: https://pan.baidu.com/s/1nFaUIwv171PDXuF7TziDFg 提取码: 9ntc),或者通过微云下载https://share.weiyun.com/59xtmWR下载完成后直接解压然后将make所在的路径添加到环境变量里。

  1. 安装python3

python官网下载win版本的python注意要下载python3版本的。网速慢的同学可以通过百度网盘下载(链接: https://pan.baidu.com/s/1gNC8L5dZTsN6E5TJD2rmnQ 提取码: 3b4t),或者通过微云下载https://share.weiyun.com/XwzSQHND。安装完后将python添加到环境变量里。

  1. 下载代码

使用git clone命令下载不要使用zip方式下载否则有些文件会有格式问题。

git clone https://gitee.com/liangkangnan/tinyriscv.git

4.2运行指令测试程序

4.2.1 运行旧的指令测试程序

旧的指令测试程序属于比较早的指令兼容性测试方法虽然目前RISC-V官方已经不更新了但仍然是一个比较好的测试参考。

下面以add指令为例说明如何运行旧的指令测试程序。

打开CMD窗口进入到sim目录执行以下命令

sim_new_nowave.bat ..\tests\isa\generated\rv32ui-p-add.bin inst.data

如果运行成功的话就可以看到"PASS"的打印。其他指令使用方法类似。

也可以一次性对所有指令进行测试,方法如下。

打开CMD窗口进入到sim目录下执行以下命令

python .\test_all_isa.py

4.2.2运行新的指令测试程序

新的指令兼容性(riscv-compliance)测试项相对于旧的指令兼容性测试项来说对指令的测试更加严谨可以精确到每一条指令的运行结果而且RISC-V官方一直在更新。

下面以add指令为例说明如何运行新的指令测试程序。

打开CMD窗口进入到sim/compliance_test目录执行以下命令

python compliance_test.py ..\..\tests\riscv-compliance\build_generated\rv32i\I-ADD-01.elf.bin inst.data

如果运行成功的话就可以看到"PASS"的打印。其他指令使用方法类似。

new_test_output

4.3运行C语言程序

C语言程序例程位于tests\example目录里。

下面以simple程序为例进行说明。

首先打开CMD窗口进入到tests\example\simple目录执行以下命令清除旧的目标文件

make clean

然后重新编译:

make

编译成功之后进入到sim目录执行以下命令开始测试

.\sim_new_nowave.bat ..\tests\example\simple\simple.bin inst.data

5.移植到FPGA

详细的移植方法请查看本项目下的fpga目录中的README.md文件。

6.未来计划

  1. 写设计文档;

  2. 支持硬件中断嵌套和快速实时中断;

  3. ......

7.更新记录

2020-07-04支持通过UART烧写固件

2020-05-27增加新的指令兼容性(riscv-compliance)测试项。

2020-05-05支持spi master增加spi测试例程。

2020-04-25支持FreeRTOS(v10.3.1)。

2020-04-18适当添加代码注释优化中断管理模块。

2020-04-11增加CoreMark跑分例程和跑分成绩。

2020-04-05支持CSR指令。

2020-03-29重大更新主要更新如下

  1. 支持RIB(RISC-V Internal Bus)总线;
  2. 优化乘法代码节省了2/3的DSP资源
  3. 优化除法代码解决了除法模块的BUG
  4. 完善C语言例程、启动代码和链接脚本
  5. 增加一次性对所有指令进行测试的脚本;

2020-03-08支持中断为此增加了timer模块来验证。

2020-03-01支持JTAG配合openocd可进行内存读写。JTAG文档参考深入浅出RISC-V调试

2020-02-23支持在Xilinx Artix-7平台上运行。详见tinyriscv_vivado

2020-01-13支持RV32M的除法指令。其C语言实现详见div

2020-01-02支持RV32M的乘法指令。

2019-12-06第一次发布。

8.其他

如有疑问或者建议,欢迎在下方评论、或者私信、或者发邮件(liangkangnan@163.com)给我24小时内必回复。

如果您热爱RISC-V或者对RISC-V感兴趣欢迎发邮件或者私信我我把您拉进群里面交流RISC-V相关的技术。