spec and shit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "riscy-rust"
|
||||
version = "0.1.0"
|
||||
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "riscy-rust"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
BIN
microarchitecture.pdf
Normal file
BIN
microarchitecture.pdf
Normal file
Binary file not shown.
BIN
riscv-privileged-20211203.pdf
Normal file
BIN
riscv-privileged-20211203.pdf
Normal file
Binary file not shown.
BIN
riscv-spec-20191213.pdf
Normal file
BIN
riscv-spec-20191213.pdf
Normal file
Binary file not shown.
29
src/main.rs
Normal file
29
src/main.rs
Normal file
@@ -0,0 +1,29 @@
|
||||
const XLEN: usize = 32;
|
||||
// define words as byte fraction
|
||||
const QUADWORD: usize = 16;
|
||||
const DOUBLEWORD: usize = 8;
|
||||
const WORD: usize = 4;
|
||||
const HALFWORD: usize = 2;
|
||||
const BYTE: usize = 1;
|
||||
|
||||
type QuadWord = u128;
|
||||
type DoubleWord = u64;
|
||||
type Word = u32;
|
||||
type HalfWord = u16;
|
||||
type Byte = u8;
|
||||
|
||||
struct VMRV32I {
|
||||
// 32 registers
|
||||
x: [Word; 32],
|
||||
// 32-bit program counter
|
||||
pc: Word,
|
||||
}
|
||||
|
||||
struct VMChunk {
|
||||
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
|
||||
202
test/risc-v-poweron.S
Normal file
202
test/risc-v-poweron.S
Normal file
@@ -0,0 +1,202 @@
|
||||
.global _start
|
||||
|
||||
_start: # Clear out two registers
|
||||
xor x1, x1, x1
|
||||
xor x2, x2, x2
|
||||
# Set x1 to one
|
||||
addi x1, x1, 1
|
||||
# Test resgister+register adds.
|
||||
add x2, x1, x1
|
||||
add x2, x2, x1
|
||||
add x2, x1, x2
|
||||
|
||||
# test LUI
|
||||
lui x2, 0xFFFFF
|
||||
|
||||
# test immediate shifts
|
||||
srai x2,x2,2
|
||||
srli x2,x2,4
|
||||
slli x2,x2,2
|
||||
|
||||
# test AUIPC
|
||||
AUIPC x2, 0x12345
|
||||
|
||||
#######################################
|
||||
# Testing different size stores
|
||||
#######################################
|
||||
# Load the RAM address into x7
|
||||
lui x7, 0x10000
|
||||
|
||||
# Test four x byte stores
|
||||
sb x2, 0(x7)
|
||||
sb x2, 1(x7)
|
||||
sb x2, 2(x7)
|
||||
sb x2, 3(x7)
|
||||
|
||||
# Load them back as a word
|
||||
lw x3, 0(x7)
|
||||
|
||||
# Test two x halfword stores
|
||||
sh x2, 0(x7)
|
||||
sh x2, 2(x7)
|
||||
|
||||
# Load them back as a word
|
||||
lw x3, 0(x7)
|
||||
|
||||
#Create a new test value 0x89ABCDEF
|
||||
lui x2, 0x89ABD
|
||||
addi x2, x2, 0xFFFFFDEF
|
||||
|
||||
# Store it into RAM
|
||||
sw x2, 0(x7)
|
||||
|
||||
# Load them back as a word
|
||||
lw x3, 0(x7)
|
||||
|
||||
# Test signed halfword loads
|
||||
lh x2, 0(x7)
|
||||
lh x2, 2(x7)
|
||||
|
||||
# Test signed byte loads
|
||||
lb x2, 0(x7)
|
||||
lb x2, 1(x7)
|
||||
lb x2, 2(x7)
|
||||
lb x2, 3(x7)
|
||||
|
||||
# Test unsigned halfword loads
|
||||
lhu x2, 0(x7)
|
||||
lhu x2, 2(x7)
|
||||
|
||||
# Test unsigned byte loads
|
||||
lbu x2, 0(x7)
|
||||
lbu x2, 1(x7)
|
||||
lbu x2, 2(x7)
|
||||
lbu x2, 3(x7)
|
||||
|
||||
# Setup for reg <= reg op reg instructions
|
||||
lui x2, 0x66666
|
||||
addi x2, x2, 0x666
|
||||
|
||||
lui x3, 0xCCCCD
|
||||
addi x3, x3, 0xFFFFFCCC
|
||||
|
||||
# reg <= reg op reg instructions
|
||||
add x4, x2, x3
|
||||
add x4, x3, x2
|
||||
sub x4, x2, x3
|
||||
sub x4, x3, x2
|
||||
sll x4, x2, x3
|
||||
sll x4, x3, x2
|
||||
slt x4, x2, x3
|
||||
slt x4, x3, x2
|
||||
sltu x4, x2, x3
|
||||
sltu x4, x3, x2
|
||||
xor x4, x2, x3
|
||||
xor x4, x3, x2
|
||||
srl x4, x2, x3
|
||||
srl x4, x3, x2
|
||||
sra x4, x2, x3
|
||||
sra x4, x3, x2
|
||||
or x4, x2, x3
|
||||
or x4, x3, x2
|
||||
and x4, x2, x3
|
||||
and x4, x3, x2
|
||||
|
||||
# reg <= reg op immediate instructions
|
||||
addi x4, x3, 0x666
|
||||
slti x4, x3, 0x666
|
||||
sltiu x4, x3, 0x666
|
||||
xori x4, x3, 0x666
|
||||
ori x4, x3, 0x666
|
||||
andi x4, x3, 0x666
|
||||
slli x4, x3, 6
|
||||
srli x4, x3, 6
|
||||
srai x4, x3, 6
|
||||
# empty out x3 and test relative jump
|
||||
andi x3, x0, 0
|
||||
jal x4, tmp0
|
||||
ori x3, x3, 1
|
||||
tmp0: ori x3, x3, 2
|
||||
ori x3, x3, 4
|
||||
# Testing conditional branckes
|
||||
xor x2, x2, x2
|
||||
addi x3, x2, 0x8
|
||||
addi x4, x2, 0x8
|
||||
# Test conditionals with rboth registers = 0x8
|
||||
beq x3, x4, tmp1
|
||||
ori x2, x2, 1
|
||||
tmp1: bne x3, x4, tmp2
|
||||
ori x2, x2, 2
|
||||
tmp2: blt x3, x4, tmp3
|
||||
ori x2, x2, 4
|
||||
tmp3: bge x3, x4, tmp4
|
||||
ori x2, x2, 8
|
||||
tmp4: bltu x3, x4, tmp5
|
||||
ori x2, x2, 0x10
|
||||
tmp5: bgeu x3, x4, tmp6
|
||||
ori x2, x2, 0x20
|
||||
tmp6:
|
||||
# Set up for next pass of conditionals
|
||||
xor x2, x2, x2
|
||||
addi x4, x3, 8
|
||||
beq x3, x4, tmp11
|
||||
ori x2, x2, 0x01
|
||||
tmp11: bne x3, x4, tmp12
|
||||
ori x2, x2, 0x02
|
||||
tmp12: blt x3, x4, tmp13
|
||||
ori x2, x2, 0x04
|
||||
tmp13: bge x3, x4, tmp14
|
||||
ori x2, x2, 0x08
|
||||
tmp14: bltu x3, x4, tmp15
|
||||
ori x2, x2, 0x10
|
||||
tmp15: bgeu x3, x4, tmp16
|
||||
ori x2, x2, 0x20
|
||||
tmp16:
|
||||
|
||||
# Set up for next pass of conditionals
|
||||
xor x2, x2, x2
|
||||
addi x4, x2, 0xFFFFFFE0
|
||||
beq x3, x4, tmp21
|
||||
ori x2, x2, 0x01
|
||||
tmp21: bne x3, x4, tmp22
|
||||
ori x2, x2, 0x02
|
||||
tmp22: blt x3, x4, tmp23
|
||||
ori x2, x2, 0x04
|
||||
tmp23: bge x3, x4, tmp24
|
||||
ori x2, x2, 0x08
|
||||
tmp24: bltu x3, x4, tmp25
|
||||
ori x2, x2, 0x10
|
||||
tmp25: bgeu x3, x4, tmp26
|
||||
ori x2, x2, 0x20
|
||||
tmp26:
|
||||
# Now testing the CRS instructions
|
||||
csrrs x5, mvendorid, x0
|
||||
csrrs x5, marchid, x0
|
||||
csrrs x5, mimpid, x0
|
||||
csrrs x5, mhartid, x0
|
||||
|
||||
# Set up the trap vector
|
||||
lui x2, 0xF0000
|
||||
ori x2, x2, 0x200
|
||||
csrrw x2, mtvec, x2
|
||||
|
||||
ori x2, x2, 0x200 # Allow the testing of last instruction
|
||||
.word 0xFFF0007E # An invalid instruction
|
||||
.word 0
|
||||
.word 0
|
||||
traptarget:
|
||||
# Target for the "illegal opcode" vector
|
||||
csrrw x5, mcause, x0
|
||||
csrrw x5, mepc, x0
|
||||
# Padding
|
||||
addi x1, x1, 1
|
||||
addi x1, x1, 1
|
||||
addi x1, x1, 1
|
||||
addi x1, x1, 1
|
||||
addi x1, x1, 1
|
||||
addi x1, x1, 1
|
||||
addi x1, x1, 1
|
||||
.data
|
||||
.word 0
|
||||
.end
|
||||
|
||||
Reference in New Issue
Block a user