Factor out Opcodes and CSRs into separate files
This commit is contained in:
72
src_Core/RISCY_OOO/procs/lib/CSRs.bsvi
Normal file
72
src_Core/RISCY_OOO/procs/lib/CSRs.bsvi
Normal file
@@ -0,0 +1,72 @@
|
||||
// user standard CSRs
|
||||
`CSR(CSRfflags , 12'h001)
|
||||
`CSR(CSRfrm , 12'h002)
|
||||
`CSR(CSRfcsr , 12'h003)
|
||||
`CSR(CSRcycle , 12'hc00)
|
||||
`CSR(CSRtime , 12'hc01)
|
||||
`CSR(CSRinstret , 12'hc02)
|
||||
// user non-standard CSRs (TODO)
|
||||
`CSR(CSRterminate , 12'h800) // terminate (used to exit Linux)
|
||||
`CSR(CSRstats , 12'h801) // turn on/off perf counters
|
||||
// `CSR(CSRuccsr , 12'h8c0)
|
||||
// supervisor standard `CSR(CSRs
|
||||
`CSR(CSRsstatus , 12'h100)
|
||||
// no user trap handler, so no se/ideleg
|
||||
`CSR(CSRsie , 12'h104)
|
||||
`CSR(CSRstvec , 12'h105)
|
||||
`CSR(CSRscounteren , 12'h106)
|
||||
`CSR(CSRsscratch , 12'h140)
|
||||
`CSR(CSRsepc , 12'h141)
|
||||
`CSR(CSRscause , 12'h142)
|
||||
`CSR(CSRstval , 12'h143) // it's still called sbadaddr in spike
|
||||
`CSR(CSRsip , 12'h144)
|
||||
`CSR(CSRsatp , 12'h180) // it's still called sptbr in spike
|
||||
`CSR(CSRsccsr , 12'h9c0)
|
||||
// machine standard CSRs
|
||||
`CSR(CSRmstatus , 12'h300)
|
||||
`CSR(CSRmisa , 12'h301)
|
||||
`CSR(CSRmedeleg , 12'h302)
|
||||
`CSR(CSRmideleg , 12'h303)
|
||||
`CSR(CSRmie , 12'h304)
|
||||
`CSR(CSRmtvec , 12'h305)
|
||||
`CSR(CSRmcounteren , 12'h306)
|
||||
`CSR(CSRmscratch , 12'h340)
|
||||
`CSR(CSRmepc , 12'h341)
|
||||
`CSR(CSRmcause , 12'h342)
|
||||
`CSR(CSRmtval , 12'h343) // it's still called mbadaddr in spike
|
||||
`CSR(CSRmip , 12'h344)
|
||||
`CSR(CSRmcycle , 12'hb00)
|
||||
`CSR(CSRminstret , 12'hb02)
|
||||
`CSR(CSRmvendorid , 12'hf11)
|
||||
`CSR(CSRmarchid , 12'hf12)
|
||||
`CSR(CSRmimpid , 12'hf13)
|
||||
`CSR(CSRmhartid , 12'hf14)
|
||||
`CSR(CSRmccsr , 12'hbc0)
|
||||
`ifdef SECURITY
|
||||
// sanctum machine CSR
|
||||
`CSR(CSRmevbase , 12'h7c0)
|
||||
`CSR(CSRmevmask , 12'h7c1)
|
||||
`CSR(CSRmeatp , 12'h7c2)
|
||||
`CSR(CSRmmrbm , 12'h7c3)
|
||||
`CSR(CSRmemrbm , 12'h7c4)
|
||||
`CSR(CSRmparbase , 12'h7c5)
|
||||
`CSR(CSRmparmask , 12'h7c6)
|
||||
`CSR(CSRmeparbase , 12'h7c7)
|
||||
`CSR(CSRmeparmask , 12'h7c8)
|
||||
`CSR(CSRmflush , 12'h7c9) // flush pipeline + cache
|
||||
`CSR(CSRmspec , 12'h7ca) // control speculation
|
||||
// sanctum user CSR
|
||||
`CSR(CSRtrng , 12'hcc0) // random number for secure boot
|
||||
`endif
|
||||
|
||||
`CSR(CSRtselect , 12'h7A0) // Debug/trace tselect
|
||||
`CSR(CSRtdata1 , 12'h7A1) // Debug/trace tdata1
|
||||
`CSR(CSRtdata2 , 12'h7A2) // Debug/trace tdata2
|
||||
`CSR(CSRtdata3 , 12'h7A3) // Debug/trace tdata3
|
||||
|
||||
`ifdef INCLUDE_GDB_CONTROL
|
||||
`CSR(CSRdcsr , 12'h7B0) // Debug control and status
|
||||
`CSR(CSRdpc , 12'h7B1) // Debug PC
|
||||
`CSR(CSRdscratch0 , 12'h7B2) // Debug scratch0
|
||||
`CSR(CSRdscratch1 , 12'h7B3) // Debug scratch1
|
||||
`endif
|
||||
22
src_Core/RISCY_OOO/procs/lib/Opcodes.bsvi
Normal file
22
src_Core/RISCY_OOO/procs/lib/Opcodes.bsvi
Normal file
@@ -0,0 +1,22 @@
|
||||
`OPCODE(Load , 7'b0000011)
|
||||
`OPCODE(LoadFp , 7'b0000111)
|
||||
`OPCODE(MiscMem, 7'b0001111)
|
||||
`OPCODE(OpImm , 7'b0010011)
|
||||
`OPCODE(Auipc , 7'b0010111)
|
||||
`OPCODE(OpImm32, 7'b0011011)
|
||||
`OPCODE(Store , 7'b0100011)
|
||||
`OPCODE(StoreFp, 7'b0100111)
|
||||
`OPCODE(Amo , 7'b0101111)
|
||||
`OPCODE(Op , 7'b0110011)
|
||||
`OPCODE(Lui , 7'b0110111)
|
||||
`OPCODE(Op32 , 7'b0111011)
|
||||
`OPCODE(Fmadd , 7'b1000011)
|
||||
`OPCODE(Fmsub , 7'b1000111)
|
||||
`OPCODE(Fnmsub , 7'b1001011)
|
||||
`OPCODE(Fnmadd , 7'b1001111)
|
||||
`OPCODE(OpFp , 7'b1010011)
|
||||
`OPCODE(OpCHERI, 7'b1011011)
|
||||
`OPCODE(Branch , 7'b1100011)
|
||||
`OPCODE(Jalr , 7'b1100111)
|
||||
`OPCODE(Jal , 7'b1101111)
|
||||
`OPCODE(System , 7'b1110011)
|
||||
@@ -171,212 +171,37 @@ function Bool allRegsReady(RegsReady x);
|
||||
endfunction
|
||||
|
||||
typedef enum {
|
||||
Invalid = 7'b0,
|
||||
Load = 7'b0000011,
|
||||
LoadFp = 7'b0000111,
|
||||
MiscMem = 7'b0001111,
|
||||
OpImm = 7'b0010011,
|
||||
Auipc = 7'b0010111,
|
||||
OpImm32 = 7'b0011011,
|
||||
Store = 7'b0100011,
|
||||
StoreFp = 7'b0100111,
|
||||
Amo = 7'b0101111,
|
||||
Op = 7'b0110011,
|
||||
Lui = 7'b0110111,
|
||||
Op32 = 7'b0111011,
|
||||
Fmadd = 7'b1000011,
|
||||
Fmsub = 7'b1000111,
|
||||
Fnmsub = 7'b1001011,
|
||||
Fnmadd = 7'b1001111,
|
||||
OpFp = 7'b1010011,
|
||||
OpCHERI = 7'b1011011,
|
||||
Branch = 7'b1100011,
|
||||
Jalr = 7'b1100111,
|
||||
Jal = 7'b1101111,
|
||||
System = 7'b1110011
|
||||
`define OPCODE(o,v) o = v,
|
||||
`include "Opcodes.bsvi"
|
||||
`undef OPCODE
|
||||
Invalid = 7'b0
|
||||
} Opcode deriving(Bits, Eq, FShow);
|
||||
|
||||
function Opcode unpackOpcode(Bit#(7) x);
|
||||
return (case(x)
|
||||
pack(Opcode'(Load )): (Load );
|
||||
pack(Opcode'(LoadFp )): (LoadFp );
|
||||
pack(Opcode'(MiscMem)): (MiscMem);
|
||||
pack(Opcode'(OpImm )): (OpImm );
|
||||
pack(Opcode'(Auipc )): (Auipc );
|
||||
pack(Opcode'(OpImm32)): (OpImm32);
|
||||
pack(Opcode'(Store )): (Store );
|
||||
pack(Opcode'(StoreFp)): (StoreFp);
|
||||
pack(Opcode'(Amo )): (Amo );
|
||||
pack(Opcode'(Op )): (Op );
|
||||
pack(Opcode'(Lui )): (Lui );
|
||||
pack(Opcode'(Op32 )): (Op32 );
|
||||
pack(Opcode'(Fmadd )): (Fmadd );
|
||||
pack(Opcode'(Fmsub )): (Fmsub );
|
||||
pack(Opcode'(Fnmsub )): (Fnmsub );
|
||||
pack(Opcode'(Fnmadd )): (Fnmadd );
|
||||
pack(Opcode'(OpFp )): (OpFp );
|
||||
pack(Opcode'(OpCHERI)): (OpCHERI);
|
||||
pack(Opcode'(Branch )): (Branch );
|
||||
pack(Opcode'(Jalr )): (Jalr );
|
||||
pack(Opcode'(Jal )): (Jal );
|
||||
pack(Opcode'(System )): (System );
|
||||
default : (Invalid);
|
||||
`define OPCODE(o,v) pack(Opcode'(o)): (o);
|
||||
`include "Opcodes.bsvi"
|
||||
`undef OPCODE
|
||||
default : Invalid;
|
||||
endcase);
|
||||
endfunction
|
||||
|
||||
/* If Bluespec never allows illegal values of sparse enumerated types, this function should replace the one above:
|
||||
function Opcode unpackOpcode(Bit#(7) x);
|
||||
Opcode test = unpack(x);
|
||||
if (pack(test) != x) return Invalid;
|
||||
else return test;
|
||||
endfunction
|
||||
*/
|
||||
typedef enum {
|
||||
// user standard CSRs
|
||||
CSRfflags = 12'h001,
|
||||
CSRfrm = 12'h002,
|
||||
CSRfcsr = 12'h003,
|
||||
CSRcycle = 12'hc00,
|
||||
CSRtime = 12'hc01,
|
||||
CSRinstret = 12'hc02,
|
||||
// user non-standard CSRs (TODO)
|
||||
CSRterminate = 12'h800, // terminate (used to exit Linux)
|
||||
CSRstats = 12'h801, // turn on/off perf counters
|
||||
CSRuccsr = 12'h8c0,
|
||||
// supervisor standard CSRs
|
||||
CSRsstatus = 12'h100,
|
||||
// no user trap handler, so no se/ideleg
|
||||
CSRsie = 12'h104,
|
||||
CSRstvec = 12'h105,
|
||||
CSRscounteren = 12'h106,
|
||||
CSRsscratch = 12'h140,
|
||||
CSRsepc = 12'h141,
|
||||
CSRscause = 12'h142,
|
||||
CSRstval = 12'h143, // it's still called sbadaddr in spike
|
||||
CSRsip = 12'h144,
|
||||
CSRsatp = 12'h180, // it's still called sptbr in spike
|
||||
CSRsccsr = 12'h9c0,
|
||||
// machine standard CSRs
|
||||
CSRmstatus = 12'h300,
|
||||
CSRmisa = 12'h301,
|
||||
CSRmedeleg = 12'h302,
|
||||
CSRmideleg = 12'h303,
|
||||
CSRmie = 12'h304,
|
||||
CSRmtvec = 12'h305,
|
||||
CSRmcounteren = 12'h306,
|
||||
CSRmscratch = 12'h340,
|
||||
CSRmepc = 12'h341,
|
||||
CSRmcause = 12'h342,
|
||||
CSRmtval = 12'h343, // it's still called mbadaddr in spike
|
||||
CSRmip = 12'h344,
|
||||
CSRmcycle = 12'hb00,
|
||||
CSRminstret = 12'hb02,
|
||||
CSRmvendorid = 12'hf11,
|
||||
CSRmarchid = 12'hf12,
|
||||
CSRmimpid = 12'hf13,
|
||||
CSRmhartid = 12'hf14,
|
||||
CSRmccsr = 12'hbc0,
|
||||
`ifdef SECURITY
|
||||
// sanctum machine CSR
|
||||
CSRmevbase = 12'h7c0,
|
||||
CSRmevmask = 12'h7c1,
|
||||
CSRmeatp = 12'h7c2,
|
||||
CSRmmrbm = 12'h7c3,
|
||||
CSRmemrbm = 12'h7c4,
|
||||
CSRmparbase = 12'h7c5,
|
||||
CSRmparmask = 12'h7c6,
|
||||
CSRmeparbase = 12'h7c7,
|
||||
CSRmeparmask = 12'h7c8,
|
||||
CSRmflush = 12'h7c9, // flush pipeline + cache
|
||||
CSRmspec = 12'h7ca, // control speculation
|
||||
// sanctum user CSR
|
||||
CSRtrng = 12'hcc0, // random number for secure boot
|
||||
`endif
|
||||
|
||||
CSRtselect = 12'h7A0, // Debug/trace tselect
|
||||
CSRtdata1 = 12'h7A1, // Debug/trace tdata1
|
||||
CSRtdata2 = 12'h7A2, // Debug/trace tdata2
|
||||
CSRtdata3 = 12'h7A3, // Debug/trace tdata3
|
||||
|
||||
`ifdef INCLUDE_GDB_CONTROL
|
||||
CSRdcsr = 12'h7B0, // Debug control and status
|
||||
CSRdpc = 12'h7B1, // Debug PC
|
||||
CSRdscratch0 = 12'h7B2, // Debug scratch0
|
||||
CSRdscratch1 = 12'h7B3, // Debug scratch1
|
||||
`endif
|
||||
|
||||
`define CSR(c,v) c = v,
|
||||
`include "CSRs.bsvi"
|
||||
`undef CSR
|
||||
// CSR that catches all the unimplemented CSRs. To avoid exception on this,
|
||||
// make it a user non-standard read/write CSR.
|
||||
// Bluespec: in RenameStage.getTrap(), we force this to be a csr_access_trap
|
||||
CSRnone = 12'h8ff
|
||||
CSRnone = 12'h8ff
|
||||
} CSR deriving(Bits, Eq, FShow);
|
||||
|
||||
function CSR unpackCSR(Bit#(12) x);
|
||||
return (case(x)
|
||||
pack(CSR'(CSRfflags )): (CSRfflags );
|
||||
pack(CSR'(CSRfrm )): (CSRfrm );
|
||||
pack(CSR'(CSRfcsr )): (CSRfcsr );
|
||||
pack(CSR'(CSRcycle )): (CSRcycle );
|
||||
pack(CSR'(CSRtime )): (CSRtime );
|
||||
pack(CSR'(CSRinstret )): (CSRinstret );
|
||||
pack(CSR'(CSRterminate )): (CSRterminate );
|
||||
pack(CSR'(CSRstats )): (CSRstats );
|
||||
pack(CSR'(CSRsstatus )): (CSRsstatus );
|
||||
pack(CSR'(CSRsie )): (CSRsie );
|
||||
pack(CSR'(CSRstvec )): (CSRstvec );
|
||||
pack(CSR'(CSRscounteren)): (CSRscounteren);
|
||||
pack(CSR'(CSRsscratch )): (CSRsscratch );
|
||||
pack(CSR'(CSRsepc )): (CSRsepc );
|
||||
pack(CSR'(CSRscause )): (CSRscause );
|
||||
pack(CSR'(CSRstval )): (CSRstval );
|
||||
pack(CSR'(CSRsip )): (CSRsip );
|
||||
pack(CSR'(CSRsatp )): (CSRsatp );
|
||||
pack(CSR'(CSRmstatus )): (CSRmstatus );
|
||||
pack(CSR'(CSRmisa )): (CSRmisa );
|
||||
pack(CSR'(CSRmedeleg )): (CSRmedeleg );
|
||||
pack(CSR'(CSRmideleg )): (CSRmideleg );
|
||||
pack(CSR'(CSRmie )): (CSRmie );
|
||||
pack(CSR'(CSRmtvec )): (CSRmtvec );
|
||||
pack(CSR'(CSRmcounteren)): (CSRmcounteren);
|
||||
pack(CSR'(CSRmscratch )): (CSRmscratch );
|
||||
pack(CSR'(CSRmepc )): (CSRmepc );
|
||||
pack(CSR'(CSRmcause )): (CSRmcause );
|
||||
pack(CSR'(CSRmtval )): (CSRmtval );
|
||||
pack(CSR'(CSRmip )): (CSRmip );
|
||||
pack(CSR'(CSRmcycle )): (CSRmcycle );
|
||||
pack(CSR'(CSRminstret )): (CSRminstret );
|
||||
pack(CSR'(CSRmvendorid )): (CSRmvendorid );
|
||||
pack(CSR'(CSRmarchid )): (CSRmarchid );
|
||||
pack(CSR'(CSRmimpid )): (CSRmimpid );
|
||||
pack(CSR'(CSRmhartid )): (CSRmhartid );
|
||||
`ifdef SECURITY
|
||||
pack(CSR'(CSRmevbase )): (CSRmevbase );
|
||||
pack(CSR'(CSRmevmask )): (CSRmevmask );
|
||||
pack(CSR'(CSRmeatp )): (CSRmeatp );
|
||||
pack(CSR'(CSRmmrbm )): (CSRmmrbm );
|
||||
pack(CSR'(CSRmemrbm )): (CSRmemrbm );
|
||||
pack(CSR'(CSRmparbase )): (CSRmparbase );
|
||||
pack(CSR'(CSRmparmask )): (CSRmparmask );
|
||||
pack(CSR'(CSRmeparbase )): (CSRmeparbase );
|
||||
pack(CSR'(CSRmeparmask )): (CSRmeparmask );
|
||||
pack(CSR'(CSRmflush )): (CSRmflush );
|
||||
pack(CSR'(CSRmspec )): (CSRmspec );
|
||||
pack(CSR'(CSRtrng )): (CSRtrng );
|
||||
`endif
|
||||
|
||||
pack(CSR'(CSRtselect )): (CSRtselect );
|
||||
pack(CSR'(CSRtdata1 )): (CSRtdata1 );
|
||||
pack(CSR'(CSRtdata2 )): (CSRtdata2 );
|
||||
pack(CSR'(CSRtdata3 )): (CSRtdata3 );
|
||||
|
||||
`ifdef INCLUDE_GDB_CONTROL
|
||||
pack(CSR'(CSRdcsr )): (CSRdcsr );
|
||||
pack(CSR'(CSRdpc )): (CSRdpc );
|
||||
pack(CSR'(CSRdscratch0 )): (CSRdscratch0 );
|
||||
pack(CSR'(CSRdscratch1 )): (CSRdscratch1 );
|
||||
`endif
|
||||
|
||||
default : (CSRnone );
|
||||
`define CSR(c,v) pack(CSR'(c)): (c);
|
||||
`include "CSRs.bsvi"
|
||||
`undef CSR
|
||||
default : (CSRnone );
|
||||
endcase);
|
||||
endfunction
|
||||
|
||||
|
||||
Reference in New Issue
Block a user