57 个版本
0.1.0-rc.5 | 2023 年 9 月 16 日 |
---|---|
0.1.0-rc.4 | 2023 年 9 月 15 日 |
0.0.52 | 2023 年 9 月 13 日 |
0.0.15 | 2023 年 8 月 30 日 |
#576 在 WebAssembly
每月下载量 543
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);
}
}
路线图
依赖关系
~2.5MB
~56K SLoC