#risc-v #embeddable #rv64i #extension #vector #zicsr

nightly eeric

一个易于嵌入的带有 MFDV 扩展的 RV64I 内核

57 个版本

0.1.0-rc.52023 年 9 月 16 日
0.1.0-rc.42023 年 9 月 15 日
0.0.52 2023 年 9 月 13 日
0.0.15 2023 年 8 月 30 日

#576WebAssembly

Download history 4/week @ 2024-03-08 2/week @ 2024-03-15 189/week @ 2024-03-29 59/week @ 2024-04-05

每月下载量 543

MIT 许可证

360KB
11K SLoC

eeric

易于嵌入的 RIsc-v 内核

设计

eeric 是一个支持 Zicsr, M, F, D 和 V 扩展的 RV64I 内核。我设计它时考虑了以下设计目标

  • 它考虑了 WASM 编译(尽管任何 cdylib 目标都应该可以工作)
  • 它不支持中断
  • 它是单线程的,因此没有 A 扩展支持
  • 它不是设计为性能最高的模拟器,但它应该足够快
  • 它旨在作为一个抽象的后端机器,因此需要一个前端编译器或解释器才能工作(参见 https://github.com/PawelPerek/eeric-interpreter

示例

让我们考虑来自 RISCV Vector Spec 示例 的以下 RISC-V 向量算法

loop:
   vsetvli t0, a2, e8, m8, ta, ma   # Vectors of 8b
   vle8.v v0, (a1)               # Load bytes
     add a1, a1, t0              # Bump pointer
     sub a2, a2, t0              # Decrement count
   vse8.v v0, (a3)               # Store bytes
     add a3, a3, t0              # Bump pointer
     bnez a2, loop               # Any more?
     ret

它可以表示为以下 eeric 内核

use eeric::prelude::*;

fn main() {
    let mut core = RvCore::with_instructions(vec![
        I::Vsetvli(F::Vsetvli {
            rd: T0,
            rs1: A2,
            vtypei: 0b_1_1_000_011,
        }),
        I::Vlv {
            eew: 8,
            data: F::Vl {
                vd: 0,
                rs1: A1,
                vm: false,
            },
        },
        I::Add(F::R {
            rd: A1,
            rs1: A1,
            rs2: T0,
        }),
        I::Sub(F::R {
            rd: A2,
            rs1: A2,
            rs2: T0,
        }),
        I::Vsv {
            eew: 8,
            data: F::Vs {
                vs3: 0,
                rs1: A3,
                vm: false,
            },
        },
        I::Add(F::R {
            rd: A3,
            rs1: A3,
            rs2: T0,
        }),
        I::Bne(F::S {
            rs1: A2,
            rs2: ZERO,
            imm12: -24,
        }),
        I::Jalr(F::I {
            rd: ZERO,
            rs1: RA,
            imm12: 0,
        }),
    ]);

    for machine_state in core.run() {
        println!("{:?}", machine_state);
    }
}

路线图

请参阅 https://github.com/PawelPerek/eeric/issues

依赖关系

~2.5MB
~56K SLoC