- OS 系统: Linux # Ubuntu 20.04 LTS (其他发行版需安装依赖)
- RTL 编译: verilator v4.204 # https://gitee.com/EasyRiscv/verilator.git
- vcd 波形: gtkwave # sudo apt-get install gtkwave
- gnu 编译: riscv-gnu-tool # https://gitee.com/EasyRiscv/riscv-gnu-tool.git
- 非 Ubuntu 20.04 系统环境依赖:
- python3.7 # https://blog.csdn.net/hello_world_banni/article/details/108297775
- glibc-2.29 # https://blog.csdn.net/Nice_zou/article/details/116699692
# sudo rm /lib/x86_64-linux-gnu/libm.so.6
# sudo ln -s /usr/local/lib/libm-2.29.so /lib/x86_64-linux-gnu/libm.so.6
# 谨慎处理(否则系统可能崩溃) su root -> sudo rm /lib/x86_64-linux-gnu/libc.so.6
# sudo ln -s /usr/local/lib/libc-2.29.so /lib/x86_64-linux-gnu/libc.so.6
- gcc9 # https://askubuntu.com/questions/1140183/install-gcc-9-on-ubuntu-18-04
- g++9 # https://gist.github.com/alexandreelise/192a63e287018ddfc896bbcb70b219d4
- 其他工具make, cmake, 编辑工具和软件依赖根据系统提示安装
├── SourceMe # 环境变量设置
├── hw # 硬件代码目录
│ ├── rtl # RTL 代码和 filelist
│ └── verify # 验证目录
│ ├── top.v # Verilog Testbench (包含 EASY_RISCV_TOP 例化)
│ ├── sim_main.cpp # Verilator Testbench (包含 Verilog Testbench 例化)
│ ├── Makefile # 编译脚本 (支持 make cmp 编译, make run 运行, make wave 开波形)
│ ├── run.sh # 回归脚本 (支持3个选项 simple-asm,simple-c,isa 分别运行对应测试)
│ ├── logs # 临时目录包含 easy_riscv.vcd 波形
│ ├── testcase.dump # 临时文件当前用例反汇编
│ ├── inst.bin.str # 临时文件当前用例指令段加载文件
│ ├── data.bin.str # 临时文件当前用例数据段加载文件
│ └── run_results # 临时目录包含用例 log
└── sw # 软件代码目录
├── riscv-tests # riscv-test 测试
│ └── isa # RV32I ISA 测试
├── scripts # 编译脚本
│ ├── build.sh # 主要编译脚本 (支持3个选项 simple-asm,simple-c,isa 分别编译对应目录)
│ └── convert-sim.py # 转换 bin to Memory 可加载 hex 格式
├── simple-asm # hello 汇编测试(须最先跑通)
│ ├── build # 汇编编译输出
│ └── src # 汇编代码
└── simple-c # hello world C 测试
├── build # C 编译输出
└── src # C 代码
按照环境需求安装工具和软件依赖
fork 或 clone easy-riscv-v1.0 分支,主目录 source SourceMe
sw/script 目录运行 ./build.sh simple-asm
hw/verify 目录运行 ./run.sh simple-asm,默认只支持lui和addi指令,用例无法正常结束,其他指令须自行补全
make wave 查看波形,默认波形如下,前2条指令实现 0x1000+0x24=0x1024
simple-asm PASSED 后可按上述流程分别完成 simple-c (打印hello world)和 isa 测试, PASSED 打印内容请参考 hw/README.md
easy-riscv-v1.0总体结构框图如下图所示。分为3级流水,主要包含IFU、IDU、IEX、WB等主要模块。
IFU功能说明
完成取指阶段的功能,包括PC的控制以及从指令存储器中取指的过程。本模块在core的启动信号(i_start_up)启动下,开启PC取指,并从指令存储器读出对应PC的指令码。如果检查出PC是非对齐的,或上报异常。
IDU功能说明
完成译码阶段的功能。对取回的指令进行拆分和解释,识别区分不同指令类别以及获取各种操作数。IDU中除了译码功能,还包括Register File读写和异常的处理。 译码阶段如果解析出非法指令,会产生非法指令异常。同时也会处理其他模块发送过来的异常类型,包括PC非对齐和访存地址非对齐异常。如果产生异常并且该异常类型没有mask,会阻塞住IFU,不让其再取值。
IEX功能说明
完成指令所规定的各种操作,实现指令的具体功能。主要包含运算、跳转、访存指令的处理。
WB功能说明
将指令执行阶段的运行结果写回到register file。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。