不用花几百块钱买开发板,也不需要折腾复杂的官方模拟器,只需要有Python就可以进行RISC-V的开发了

=====================================================================================================================================================================

1. 简介

pyriscv 是笔者开发的一套RISC-V数据精确的模拟器。由于Python对运算符重载、函数指针等高级编程方法有非常方便的支持,因此代码量非常的小,也便于阅读和理解。

目前pyriscv还在持续开发中。当前github上的版本只支持RV32I这个指令集,且没有实现FENCE、SYSTEM和CSR。

目前的代码量近300行,核心部分仅仅60多行。在开发过程中没有用到任何第三方库,仅仅使用Python自带的功能。

2. 快速运行

github地址:github.com/jerry-jho/py

clone下来之后,src/pyriscv.py即为模拟器入口。交叉编译器产生elf后,需要使用交叉编译器提供的objcopy工具将elf转换为verilog memory格式,便于模拟器读取。模拟器的命令行参数即为

python3 pyriscv.py <mem convert from elf>

在代码库里提供了一个示例app.S和链接脚本link.ld,没有安装riscv编译器的同学可以从这里下载到预先编译好的编译器。注意不要把这个编译器安装到带空格的目录里,在安装过程中要仔细观看它的默认安装路径

https://github.com/gnu-mcu-eclipse/riscv-none-gcc/releases?

github.com
图标

全套命令为:

cd app
$riscv-gcc -g -march=rv32i -mabi=ilp32 app.S -nostdlib -Tlink.ld -o app.elf
$riscv-objdump -S -d app.elf > app.lst
$riscv-objcopy -F verilog app.elf app.mem
python3 ../src/pyriscv.py app.mem

3. 平台约定

  • 复位向量位于0x00000000,如果需要修改它,需要在link.ld中指定或者在代码里分配,同时,在例化PyRiscv时指定reset_vec这个参数。
  • 任何对x0的写入均会列印到控制台上。因此,如果想使用printf,只需要在putc里将传入的字元扔给x0就可以了。当然,这样的设计不太理想,因为很多命令都会写入x0(例如跳转)
  • 执行slt x0,x0,x0这条指令会退出模拟器

接下来的几个章节会对这个模拟器的设计进行分析,也欢迎大家评论、fork、star,我会尽可能在接下来的讲述中优先考虑回答读者的问题。


推荐阅读:
查看原文 >>
相关文章