python模拟器 截图_使用Python实现RISCV模拟器(一)

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

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

1. 简介

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

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

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

2. 快速运行

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

python3 pyriscv.py

在代码库里提供了一个示例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,我会尽可能在接下来的讲述中优先考虑回答读者的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值