帮你一步一步实现RISCV指令集模拟器的框架。这个框架是terminus裁剪出来的。
- 实现RV32/64I
- 你需要定义RV32/64I 指令集, 指令的实现基于terminus_vault, 如何定义指令可以参考这里
- 你需要定义RV32/64I 必要的csr, csr的实现基于terminus_vault, 如何定义csr可以参考这里
- 你需要实现在这里实现Processor的基本功能,如取指令,译码(可参考这里), 执行等
- 你需要通过测试basic_tests, 你可能要修改riscv_test的内容
//run all test
cargo run --example basic_tests
//or run single test
cargo run --example basic_tests -- -r rv64ui-p-add
- 如果需要debug testcase, 请参考riscv-tests, 或自行objdump elf, 所有的elf在这里
- 实现RV32/64M
- 你需要定义RV32/64M 指令集, 相信通过第一步,你已经发现通过terminus_vault是很容易的
- 你需要通过测试m_ext_tests
- 实现M/S/U privilege
- 你需要修改processor, 定义新的csr,并添加相应的privilege指令
- 你需要通过priv_m_tests, priv_m_tests
- 实现atomic extension并支持多核
- 你需要添加atomic指令,修改processor和bus来支持atoimc操作
- 你需要通过multi_core_tests
- 实现compress extensionf
- 你需要添加compress指令集
- 你需要通过c_ext_tests
- 实现浮点指令集
- 你需要添加单精度和双精度浮点指令集
- 你需要通过f_ext_tests, d_ext_tests
- 支持虚拟地址
- 你需要修改该processor,为processor添加mmu,以支持虚拟地址,pmp
- 你需要通过mmu_tests
- 至此你应该能通过riscv_tests
- boot linux
- 通过之前步骤,你现在可以尝试用模拟器来启动linux, 这里提供了一个bbl+linux的image
- 你需要添加一些必要的外设,terminus_transport可以帮助到你,你也可以借助terminus_transport定义自己的外设
- 你可能需要利用到elf和dts的一些处理,这里可能可以帮助到你
- 在此步骤你可能会发现之前测试没有覆盖的bug,为processor提供一些简单的trace和debug功能会很很有帮助