Factor out Opcodes and CSRs into separate files

This commit is contained in:
Peter Rugg
2020-04-21 20:36:56 +01:00
parent 3693326b62
commit a89a606a6d
3 changed files with 110 additions and 191 deletions

View 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

View 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)

View File

@@ -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