Skip to content

Commit

Permalink
Initial support for E extension
Browse files Browse the repository at this point in the history
  • Loading branch information
nwf committed Mar 3, 2025
1 parent c6a4ad8 commit 73950bd
Show file tree
Hide file tree
Showing 9 changed files with 423 additions and 191 deletions.
14 changes: 10 additions & 4 deletions Makefile.old
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ else
$(error '$(ARCH)' is not a valid architecture, must be one of: RV32, RV64)
endif

ARCH_IE ?= i

SAIL_XLEN += riscv_xlen.sail
SAIL_FLEN := riscv_flen_D.sail
SAIL_FLEN += riscv_flen.sail
Expand Down Expand Up @@ -97,19 +99,23 @@ SAIL_VM_SRCS += riscv_vmem.sail
PRELUDE = prelude.sail riscv_errors.sail $(SAIL_XLEN) $(SAIL_FLEN) $(SAIL_VLEN) prelude_mem_addrtype.sail prelude_mem_metadata.sail prelude_mem.sail

SAIL_REGS_SRCS = riscv_csr_begin.sail # Start of CSR scattered definitions.
SAIL_REGS_SRCS += riscv_reg_type.sail riscv_freg_type.sail riscv_regs.sail riscv_pc_access.sail riscv_sys_regs.sail
SAIL_REGS_SRCS += riscv_reg_type.sail riscv_freg_type.sail riscv_regs.sail
SAIL_REGS_SRCS += riscv_regs_$(ARCH_IE).sail
SAIL_REGS_SRCS += riscv_pc_access.sail riscv_sys_regs.sail
SAIL_REGS_SRCS += riscv_pmp_regs.sail riscv_pmp_control.sail
SAIL_REGS_SRCS += riscv_ext_regs.sail $(SAIL_CHECK_SRCS)
SAIL_REGS_SRCS += riscv_vreg_type.sail riscv_vext_regs.sail

SAIL_ARCH_SRCS = $(PRELUDE)
SAIL_ARCH_SRCS += riscv_extensions.sail riscv_types_common.sail riscv_types_ext.sail riscv_types.sail
SAIL_ARCH_SRCS = riscv_extensions.sail riscv_types_common.sail riscv_types_ext.sail
SAIL_ARCH_SRCS += riscv_types_$(ARCH_IE).sail
SAIL_ARCH_SRCS += riscv_types.sail
SAIL_ARCH_SRCS += riscv_vmem_types.sail $(SAIL_REGS_SRCS) $(SAIL_SYS_SRCS) riscv_platform.sail
SAIL_ARCH_SRCS += riscv_sstc.sail
SAIL_ARCH_SRCS += riscv_mem.sail $(SAIL_VM_SRCS)
SAIL_ARCH_RVFI_SRCS = $(PRELUDE) rvfi_dii.sail riscv_extensions.sail riscv_types_common.sail riscv_types_ext.sail riscv_types.sail riscv_vmem_types.sail $(SAIL_REGS_SRCS) $(SAIL_SYS_SRCS) riscv_platform.sail riscv_mem.sail $(SAIL_VM_SRCS) riscv_types_kext.sail
SAIL_ARCH_SRCS += riscv_types_kext.sail # Shared/common code for the cryptography extension.

SAIL_ARCH_RVFI_SRCS = $(PRELUDE) rvfi_dii.sail $(SAIL_ARCH_SRCS)

SAIL_STEP_SRCS = riscv_step_common.sail riscv_step_ext.sail riscv_decode_ext.sail riscv_fetch.sail riscv_step.sail
RVFI_STEP_SRCS = riscv_step_common.sail riscv_step_rvfi.sail riscv_decode_ext.sail riscv_fetch_rvfi.sail riscv_step.sail

Expand Down
2 changes: 2 additions & 0 deletions model/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ foreach (xlen IN ITEMS 32 64)
"riscv_reg_type.sail"
"riscv_freg_type.sail"
"riscv_regs.sail"
"riscv_regs_i.sail"
"riscv_pc_access.sail"
"riscv_sys_regs.sail"
"riscv_pmp_regs.sail"
Expand All @@ -158,6 +159,7 @@ foreach (xlen IN ITEMS 32 64)
"riscv_types_common.sail"
"riscv_types_ext.sail"
"riscv_types.sail"
"riscv_types_i.sail"
"riscv_vmem_types.sail"
${sail_regs_srcs}
${sail_sys_srcs}
Expand Down
174 changes: 6 additions & 168 deletions model/riscv_regs.sail
Original file line number Diff line number Diff line change
Expand Up @@ -14,133 +14,8 @@ register nextPC : xlenbits
/* internal state to hold instruction bits for faulting instructions */
register instbits : xlenbits

/* register file and accessors */

register x1 : regtype
register x2 : regtype
register x3 : regtype
register x4 : regtype
register x5 : regtype
register x6 : regtype
register x7 : regtype
register x8 : regtype
register x9 : regtype
register x10 : regtype
register x11 : regtype
register x12 : regtype
register x13 : regtype
register x14 : regtype
register x15 : regtype
register x16 : regtype
register x17 : regtype
register x18 : regtype
register x19 : regtype
register x20 : regtype
register x21 : regtype
register x22 : regtype
register x23 : regtype
register x24 : regtype
register x25 : regtype
register x26 : regtype
register x27 : regtype
register x28 : regtype
register x29 : regtype
register x30 : regtype
register x31 : regtype

function rX (Regno(r) : regno) -> xlenbits = {
let v : regtype =
match r {
0 => zero_reg,
1 => x1,
2 => x2,
3 => x3,
4 => x4,
5 => x5,
6 => x6,
7 => x7,
8 => x8,
9 => x9,
10 => x10,
11 => x11,
12 => x12,
13 => x13,
14 => x14,
15 => x15,
16 => x16,
17 => x17,
18 => x18,
19 => x19,
20 => x20,
21 => x21,
22 => x22,
23 => x23,
24 => x24,
25 => x25,
26 => x26,
27 => x27,
28 => x28,
29 => x29,
30 => x30,
31 => x31,
_ => {assert(false, "invalid register number"); zero_reg}
};
regval_from_reg(v)
}

$ifdef RVFI_DII
function rvfi_wX (Regno(r) : regno, v : xlenbits) -> unit = {
rvfi_int_data[rvfi_rd_wdata] = zero_extend(v);
rvfi_int_data[rvfi_rd_addr] = to_bits(8,r);
rvfi_int_data_present = true;
}
$else
function rvfi_wX (r : regno, v : xlenbits) -> unit = ()
$endif

function wX (Regno(r) : regno, in_v : xlenbits) -> unit = {
let v = regval_into_reg(in_v);
match r {
0 => (),
1 => x1 = v,
2 => x2 = v,
3 => x3 = v,
4 => x4 = v,
5 => x5 = v,
6 => x6 = v,
7 => x7 = v,
8 => x8 = v,
9 => x9 = v,
10 => x10 = v,
11 => x11 = v,
12 => x12 = v,
13 => x13 = v,
14 => x14 = v,
15 => x15 = v,
16 => x16 = v,
17 => x17 = v,
18 => x18 = v,
19 => x19 = v,
20 => x20 = v,
21 => x21 = v,
22 => x22 = v,
23 => x23 = v,
24 => x24 = v,
25 => x25 = v,
26 => x26 = v,
27 => x27 = v,
28 => x28 = v,
29 => x29 = v,
30 => x30 = v,
31 => x31 = v,
_ => assert(false, "invalid register number")
};
if (r != 0) then {
rvfi_wX(Regno(r), in_v);
if get_config_print_reg()
then print_reg("x" ^ dec_str(r) ^ " <- " ^ RegStr(v));
}
}
val rX : regno -> xlenbits
val wX : (regno, xlenbits) -> unit

function rX_bits(i: regidx) -> xlenbits = rX(regidx_to_regno(i))

Expand All @@ -150,45 +25,6 @@ function wX_bits(i: regidx, data: xlenbits) -> unit = {

overload X = {rX_bits, wX_bits, rX, wX}

/* mappings for assembly */

mapping reg_name_raw : bits(5) <-> string = {
0b00000 <-> "zero",
0b00001 <-> "ra",
0b00010 <-> "sp",
0b00011 <-> "gp",
0b00100 <-> "tp",
0b00101 <-> "t0",
0b00110 <-> "t1",
0b00111 <-> "t2",
0b01000 <-> "fp",
0b01001 <-> "s1",
0b01010 <-> "a0",
0b01011 <-> "a1",
0b01100 <-> "a2",
0b01101 <-> "a3",
0b01110 <-> "a4",
0b01111 <-> "a5",
0b10000 <-> "a6",
0b10001 <-> "a7",
0b10010 <-> "s2",
0b10011 <-> "s3",
0b10100 <-> "s4",
0b10101 <-> "s5",
0b10110 <-> "s6",
0b10111 <-> "s7",
0b11000 <-> "s8",
0b11001 <-> "s9",
0b11010 <-> "s10",
0b11011 <-> "s11",
0b11100 <-> "t3",
0b11101 <-> "t4",
0b11110 <-> "t5",
0b11111 <-> "t6"
}

mapping reg_name : regidx <-> string = { Regidx(i) <-> reg_name_raw(i) }

mapping creg_name_raw : bits(3) <-> string = {
0b000 <-> "s0",
0b001 <-> "s1",
Expand All @@ -204,6 +40,8 @@ mapping creg_name : cregidx <-> string = { Cregidx(i) <-> creg_name_raw(i) }

/* Mappings for encoding */

mapping encdec_reg : regidx <-> bits(5) = { Regidx(r) <-> r }

mapping encdec_creg : cregidx <-> bits(3) = { Cregidx(r) <-> r }

/* Initializtion */

val init_base_regs : unit -> unit
146 changes: 146 additions & 0 deletions model/riscv_regs_e.sail
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/*=======================================================================================*/
/* This Sail RISC-V architecture model, comprising all files and */
/* directories except where otherwise noted is subject the BSD */
/* two-clause license in the LICENSE file. */
/* */
/* SPDX-License-Identifier: BSD-2-Clause */
/*=======================================================================================*/

/* register file and accessors */

register x1 : regtype
register x2 : regtype
register x3 : regtype
register x4 : regtype
register x5 : regtype
register x6 : regtype
register x7 : regtype
register x8 : regtype
register x9 : regtype
register x10 : regtype
register x11 : regtype
register x12 : regtype
register x13 : regtype
register x14 : regtype
register x15 : regtype

function rX (Regno(r) : regno) -> xlenbits = {
let v : regtype =
match r {
0 => zero_reg,
1 => x1,
2 => x2,
3 => x3,
4 => x4,
5 => x5,
6 => x6,
7 => x7,
8 => x8,
9 => x9,
10 => x10,
11 => x11,
12 => x12,
13 => x13,
14 => x14,
15 => x15,
_ => {assert(false, "invalid register number"); zero_reg}
};
regval_from_reg(v)
}

$ifdef RVFI_DII
function rvfi_wX (Regno(r) : regno, v : xlenbits) -> unit = {
rvfi_int_data[rvfi_rd_wdata] = zero_extend(v);
rvfi_int_data[rvfi_rd_addr] = to_bits(8,r);
rvfi_int_data_present = true;
}
$else
function rvfi_wX (r : regno, v : xlenbits) -> unit = ()
$endif

function wX (Regno(r) : regno, in_v : xlenbits) -> unit = {
let v = regval_into_reg(in_v);
match r {
0 => (),
1 => x1 = v,
2 => x2 = v,
3 => x3 = v,
4 => x4 = v,
5 => x5 = v,
6 => x6 = v,
7 => x7 = v,
8 => x8 = v,
9 => x9 = v,
10 => x10 = v,
11 => x11 = v,
12 => x12 = v,
13 => x13 = v,
14 => x14 = v,
15 => x15 = v,
_ => assert(false, "invalid register number")
};
if (r != 0) then {
rvfi_wX(Regno(r), in_v);
if get_config_print_reg()
then print_reg("x" ^ dec_str(r) ^ " <- " ^ RegStr(v));
}
}

/*
* RV{32,64}E uses only the bottom four bits of register index operands, so its
* encoding function is total but its decoding function is partial, requiring a
* 0b0 at the start of the field to apply.
*/

mapping encdec_reg : regidx <-> bits(5) = { Regidx(r) <-> 0b0 @ r }

/* mappings for assembly */

mapping reg_name_raw : bits(4) <-> string = {
0b0000 <-> "zero",
0b0001 <-> "ra",
0b0010 <-> "sp",
0b0011 <-> "gp",
0b0100 <-> "tp",
0b0101 <-> "t0",
0b0110 <-> "t1",
0b0111 <-> "t2",
0b1000 <-> "fp",
0b1001 <-> "s1",
0b1010 <-> "a0",
0b1011 <-> "a1",
0b1100 <-> "a2",
0b1101 <-> "a3",
0b1110 <-> "a4",
0b1111 <-> "a5",
}

mapping reg_name : regidx <-> string = { Regidx(i) <-> reg_name_raw(i) }


/* mapping RVC register indices into normal indices */
val creg2reg_idx : cregidx -> regidx
function creg2reg_idx(Cregidx(i) : cregidx) -> regidx = Regidx(0b1 @ i)

/* some architecture and ABI relevant register identifiers */
let zreg : regidx = Regidx(0b0000) /* x0, zero register */
let ra : regidx = Regidx(0b0001) /* x1, return address */
let sp : regidx = Regidx(0b0010) /* x2, stack pointer */

function init_base_regs () = {
x1 = zero_reg;
x2 = zero_reg;
x3 = zero_reg;
x4 = zero_reg;
x5 = zero_reg;
x6 = zero_reg;
x7 = zero_reg;
x8 = zero_reg;
x9 = zero_reg;
x10 = zero_reg;
x11 = zero_reg;
x12 = zero_reg;
x13 = zero_reg;
x14 = zero_reg;
x15 = zero_reg;
}
Loading

0 comments on commit 73950bd

Please sign in to comment.