Crates.io | eeric |
lib.rs | eeric |
version | 0.1.0-rc.5 |
source | src |
created_at | 2023-08-25 18:00:28.491809 |
updated_at | 2023-09-16 11:16:41.967157 |
description | An easily embeddable RV64I core with MFDV extensions |
homepage | |
repository | https://github.com/PawelPerek/eeric |
max_upload_size | |
id | 954947 |
size | 366,556 |
An Easily Embeddable RIsc-v Core
eeric is a RV64I core with support for Zicsr, M, F, D and V extensions. I designed it with following design goals in mind:
Let's consider following RISC-V Vector Algorithm from RISCV Vector Spec examples:
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
It can be expressed as following eeric core:
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);
}
}