#risc-v #assembly #simulator #emulator #testing

lib-rv32-common

所有lib_rv32 crate的通用数据

1个不稳定版本

0.2.0 2021年8月25日

#396 in 仿真


4 个crate中使用(2个直接使用)

MIT 协议

9KB
197

lib-rv32

build tests

概述

lib-rv32是一组Rust库,用于模拟、学习和汇编32位RISC-V整数指令集架构。


ISA模拟器

此库可以执行针对实现所需原语的任何内存和寄存器文件的指令。这是为了鼓励与您想要的任何前端一起使用。

然而,提供了在 lib_rv32_mcu::* 中的参考实现。库提供了从内存、寄存器读取和执行单条指令的函数。由于用户决定何时调用这些函数,因此这些函数可能适用于大多数用例。

MCU

MCU crate为与ISA模拟器一起使用提供了MemoryRegisterFile的实现。有了这个,就可以完全模拟一个嵌入式RISC-V核心。

汇编器

此crate可用于汇编简单的RISC-V汇编程序。此库提供的主要功能包括

  • assemble_ir:将指令&str汇编为u32
  • assemble_program:将程序&str汇编为Vec<u32>
  • assemble_program_buf:将BufRead汇编为Vec<u32>

CLI

模拟器

模拟器的主要用途是跟踪RISC-V程序的执行并对其行为做出断言。目前它仅支持简单的二进制内存镜像(不是ELF二进制文件)。

将断言输入到JSON文件中(注意:所有数字都是字符串,以便允许十六进制或十进制基数)。

断言.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还通过命令行公开了汇编器。您可以使用

lrv-cli-cv program.s-o program.bin


测试

该项目具有非常灵活的测试系统。

在适当的地方提供了单元测试。

此外,为了测试整个系统,可以将测试程序添加到mcu/tests/programs中。测试只是一个包含.c.s源文件以及一个test_case.json的目录,该文件包含关于程序完成后MCU状态的断言。

在测试期间,Cargo将为每个测试

  1. 为RISC-V编译它
  2. 启动一个新的MCU
  3. 用生成的二进制文件编程它
  4. 运行测试程序一段时间
  5. 做出断言
  6. 报告成功或失败

如果测试失败,它将描述导致崩溃的错误或失败的断言,并打印编译测试二进制的对象转储

...
[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,也可以在本地运行。

无运行时依赖