mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-02 09:45:18 +00:00
csr cleanup
This commit is contained in:
parent
7358402bc0
commit
e4f4b31896
@ -129,16 +129,8 @@ module csr #(parameter
|
||||
endcase
|
||||
|
||||
///////////////////////////////////////////
|
||||
// Trap Vectoring & Returns
|
||||
// Trap Vectoring & Returns; vectored traps must be aligned to 64-byte address boundaries
|
||||
///////////////////////////////////////////
|
||||
//
|
||||
// POSSIBLE OPTIMIZATION:
|
||||
// From 20190608 privielegd spec page 27 (3.1.7)
|
||||
// > Allowing coarser alignments in Vectored mode enables vectoring to be
|
||||
// > implemented without a hardware adder circuit.
|
||||
// For example, we could require m/stvec be aligned on 7 bits to let us replace the adder directly below with
|
||||
// [untested] TrapVectorM = {TVec[`XLEN-1:7], CauseM[3:0], 4'b0000}
|
||||
// However, this is program dependent, so not implemented at this time.
|
||||
|
||||
// Select trap vector from STVEC or MTVEC and word-align
|
||||
assign SelMtvecM = (NextPrivilegeModeM == `M_MODE);
|
||||
@ -150,10 +142,7 @@ module csr #(parameter
|
||||
logic VectoredM;
|
||||
logic [`XLEN-1:0] TVecPlusCauseM;
|
||||
assign VectoredM = InterruptM & (TVecM[1:0] == 2'b01);
|
||||
// *** Would like you use concat version, but breaks uart test wally64priv when
|
||||
// mtvec is aligned to 64 bytes.
|
||||
assign TVecPlusCauseM = TVecAlignedM + {{(`XLEN-2-`LOG_XLEN){1'b0}}, CauseM, 2'b00};
|
||||
//assign TVecPlusCauseM = {TVecAlignedM[`XLEN-1:6], CauseM[3:0], 2'b00};
|
||||
assign TVecPlusCauseM = {TVecAlignedM[`XLEN-1:6], CauseM[3:0], 2'b00}; // 64-byte alignment allows concatenation rather than addition
|
||||
mux2 #(`XLEN) trapvecmux(TVecAlignedM, TVecPlusCauseM, VectoredM, TrapVectorM);
|
||||
end else
|
||||
assign TrapVectorM = TVecAlignedM;
|
||||
@ -168,6 +157,7 @@ module csr #(parameter
|
||||
///////////////////////////////////////////
|
||||
// CSRWriteValM
|
||||
///////////////////////////////////////////
|
||||
|
||||
always_comb begin
|
||||
// Choose either rs1 or uimm[4:0] as source
|
||||
CSRSrcM = InstrM[14] ? {{(`XLEN-5){1'b0}}, InstrM[19:15]} : SrcAM;
|
||||
@ -191,6 +181,7 @@ module csr #(parameter
|
||||
///////////////////////////////////////////
|
||||
// CSR Write values
|
||||
///////////////////////////////////////////
|
||||
|
||||
assign CSRAdrM = InstrM[31:20];
|
||||
assign UnalignedNextEPCM = TrapM ? ((wfiM & IntPendingM) ? PCM+4 : PCM) : CSRWriteValM;
|
||||
assign NextEPCM = `C_SUPPORTED ? {UnalignedNextEPCM[`XLEN-1:1], 1'b0} : {UnalignedNextEPCM[`XLEN-1:2], 2'b00}; // 3.1.15 alignment
|
||||
@ -218,8 +209,7 @@ module csr #(parameter
|
||||
.STATUS_MPP, .STATUS_SPP, .STATUS_TSR, .STATUS_TW,
|
||||
.STATUS_MIE, .STATUS_SIE, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_TVM,
|
||||
.STATUS_FS, .BigEndianM);
|
||||
csrc counters(.clk, .reset,
|
||||
.StallE, .StallM, .FlushM,
|
||||
csrc counters(.clk, .reset, .StallE, .StallM, .FlushM,
|
||||
.InstrValidNotFlushedM, .LoadStallD, .CSRMWriteM,
|
||||
.DirPredictionWrongM, .BTBPredPCWrongM, .RASPredPCWrongM, .PredictionInstrClassWrongM,
|
||||
.InstrClassM, .DCacheMiss, .DCacheAccess, .ICacheMiss, .ICacheAccess,
|
||||
|
Loading…
Reference in New Issue
Block a user