2 个版本
0.2.1 | 2021 年 8 月 25 日 |
---|---|
0.2.0 | 2021 年 8 月 25 日 |
在 模拟 中排名第 275
每月下载 21 次
用于 lib-rv32-cli
46KB
1K SLoC
lib-rv32
概述
lib-rv32 是一组 Rust 库,用于模拟、学习和汇编 32 位 RISC-V 整数 ISAs。
- lib-rv32-isa:ISA 模拟库
- lib-rv32-mcu:与 lib_rv32_isa 一起使用的 MCU 的参考实现
- lib-rv32-asm:用于汇编 RISC-V 程序的库
- lib-rv32-cli:暴露库的 CLI 工具
- lib-rv32-wasm:使用库的 WASM 绑定的 webapp。
库
ISA 模拟器
此库可以执行针对任何实现所需原语(在 traits lib_rv32_common::traits::{Memory, RegisterFile}
中)的内存和寄存器文件的指令。这是为了鼓励与您希望使用的任何前端一起使用。
然而,提供了在 lib_rv32_mcu::*
中的参考实现。该库提供从内存、寄存器中读取和执行单个指令的函数。由于用户决定何时调用这些函数,因此这些函数可能适用于大多数用例。
MCU
MCU 包提供了用于与 ISA 模拟器一起使用的 Memory
和 RegisterFile
的实现。有了这个,就可以完全模拟嵌入式 RISC-V 内核。
汇编器
此包可以用于汇编简单的 RISC-V 汇编程序。此库提供的主要功能有
assemble_ir
:将指令&str
汇编为u32
assemble_program
:将程序&str
汇编为Vec<u32>
assemble_program_buf
:将BufRead
汇编为一个Vec<u32>
CLI
模拟器
模拟器的首要用途是跟踪RISC-V程序的执行,并对它们的行为进行断言。它目前仅支持简单的二进制内存映像(不是ELF二进制文件)。
将断言输入到JSON文件中(注意:所有数字都是字符串,以允许十六进制或十进制基数)。
assert.json
:
{
"registers": {
"x0": "0x0",
"a0": "20"
},
"memory": {
"0x0000": "0x00010117"
}
}
然后运行
lrv-cli -v ./prog.bin -s 24 -a assert.json
这将执行prog.bin
,在PC值0x24处停止,然后执行assert.json
中的断言。
程序将逐条指令跟踪执行
[0000] 00010117 | auipc sp, 0x10 | sp <- 0x10000 (65536);
[0004] fe010113 | addi sp, sp, -32 | sp <- 0xffe0 (65504);
[0008] 00400513 | addi a0, zero, 4 | a0 <- 0x4 (4);
[000c] 00500593 | addi a1, zero, 5 | a1 <- 0x5 (5);
[0010] 00000097 | auipc ra, 0x0 | ra <- 0x10 (16);
[0014] 018080e7 | jalr ra, (24)ra | ra <- 0x18 (24); pc <- 0x28;
...
完成时,将总结结果
...
[001c] f0028293 | addi t0, t0, -256 | t0 <- 0xf00 (3840);
[0020] 00a2a023 | sw a0, 0(t0) | (word *)0x00000f00 <- 0x14 (20);
Reached stop-PC.
a0 == 20
*0x00000000 == 65815
汇编器
CLI还通过命令行公开汇编器。您可以使用以下命令将program.s
文件汇编为program.bin
:
lrv-cli-cv program.s-o program.bin
测试
该项目具有非常灵活的测试系统。
在适当的地方提供了单元测试。
此外,为了测试整个系统,可以将测试程序添加到mcu/tests/programs
。测试简单地是一个包含.c
和.s
源文件以及一个包含程序完成后MCU状态的断言的test_case.json
的目录。
在测试期间,Cargo将为每个测试
- 为其编译RISC-V
- 启动一个新的MCU
- 使用生成的二进制文件编程它
- 运行测试程序一段时间
- 进行断言
- 报告成功或失败
如果测试失败,它将描述导致崩溃的错误或失败的断言,并打印编译的测试二进制的对象转储
...
[001c] f0028293 | addi t0, t0, -256 | t0 <- 0xf00 (3840);
[0020] 00a2a023 | sw a0, 0(t0) | (word *)0x00000f00 <- 0x14 (20);
Stopping because the stop PC 0x24 was reached.
Failed test: tests/programs/mul@0x00000024: Register assertion failed: (x10=0x00000014) != 0x00000018.
prog.elf: file format elf32-littleriscv
Disassembly of section .text.init:
00000000 <start>:
0: 00010117 auipc sp,0x10
4: fe010113 addi sp,sp,-32 # ffe0 <__global_pointer$+0xf75c>
8: 00400513 li a0,4
c: 00500593 li a1,5
...
测试在CI中运行,但您的系统具有riscv(32|64)-unknown-elf-gcc
时,也可以本地运行。
依赖关系
~1.1–2MB
~43K SLoC