mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Reduced number of bits in mcause and medeleg registers
This commit is contained in:
		
							parent
							
								
									96e3c3bea8
								
							
						
					
					
						commit
						de2a0da9e9
					
				@ -55,7 +55,7 @@ module csr #(parameter
 | 
			
		||||
  input  logic [4:0]       SetFflagsM,                // Set floating point flag bits in FCSR
 | 
			
		||||
  input  logic [1:0]       NextPrivilegeModeM,        // STATUS bits updated based on next privilege mode
 | 
			
		||||
  input  logic [1:0]       PrivilegeModeW,            // current privilege mode
 | 
			
		||||
  input  logic [`LOG_XLEN-1:0] CauseM,                // Trap cause
 | 
			
		||||
  input  logic [3:0]       CauseM,                    // Trap cause
 | 
			
		||||
  input  logic             SelHPTW,                   // hardware page table walker active, so base endianness on supervisor mode
 | 
			
		||||
  // inputs for performance counters
 | 
			
		||||
  input  logic             LoadStallD,
 | 
			
		||||
@ -79,7 +79,7 @@ module csr #(parameter
 | 
			
		||||
  // outputs from CSRs
 | 
			
		||||
  output logic [1:0]       STATUS_MPP,
 | 
			
		||||
  output logic             STATUS_SPP, STATUS_TSR, STATUS_TVM,
 | 
			
		||||
  output logic [`XLEN-1:0] MEDELEG_REGW, 
 | 
			
		||||
  output logic [15:0] MEDELEG_REGW, 
 | 
			
		||||
  output logic [`XLEN-1:0] SATP_REGW,
 | 
			
		||||
  output logic [11:0]      MIP_REGW, MIE_REGW, MIDELEG_REGW,
 | 
			
		||||
  output logic             STATUS_MIE, STATUS_SIE,
 | 
			
		||||
@ -107,7 +107,8 @@ module csr #(parameter
 | 
			
		||||
  logic                    WriteMSTATUSM, WriteMSTATUSHM, WriteSSTATUSM;
 | 
			
		||||
  logic                    CSRMWriteM, CSRSWriteM, CSRUWriteM;
 | 
			
		||||
  logic                    WriteFRMM, WriteFFLAGSM;
 | 
			
		||||
  logic [`XLEN-1:0]        UnalignedNextEPCM, NextEPCM, NextCauseM, NextMtvalM;
 | 
			
		||||
  logic [`XLEN-1:0]        UnalignedNextEPCM, NextEPCM, NextMtvalM;
 | 
			
		||||
  logic [4:0]              NextCauseM;
 | 
			
		||||
  logic [11:0]             CSRAdrM;
 | 
			
		||||
  logic                    IllegalCSRCAccessM, IllegalCSRMAccessM, IllegalCSRSAccessM, IllegalCSRUAccessM;
 | 
			
		||||
  logic                    InsufficientCSRPrivilegeM;
 | 
			
		||||
@ -153,7 +154,7 @@ module csr #(parameter
 | 
			
		||||
    logic VectoredM;
 | 
			
		||||
    logic [`XLEN-1:0] TVecPlusCauseM;
 | 
			
		||||
    assign VectoredM = InterruptM & (TVecM[1:0] == 2'b01);
 | 
			
		||||
    assign TVecPlusCauseM = {TVecAlignedM[`XLEN-1:6], CauseM[3:0], 2'b00}; // 64-byte alignment allows concatenation rather than addition
 | 
			
		||||
    assign TVecPlusCauseM = {TVecAlignedM[`XLEN-1:6], CauseM, 2'b00}; // 64-byte alignment allows concatenation rather than addition
 | 
			
		||||
    mux2 #(`XLEN) trapvecmux(TVecAlignedM, TVecPlusCauseM, VectoredM, TrapVectorM);
 | 
			
		||||
  end else 
 | 
			
		||||
    assign TrapVectorM = TVecAlignedM;
 | 
			
		||||
@ -196,7 +197,7 @@ module csr #(parameter
 | 
			
		||||
  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
 | 
			
		||||
  assign NextCauseM = TrapM ? {InterruptM, {(`XLEN-`LOG_XLEN-1){1'b0}}, CauseM}: CSRWriteValM;
 | 
			
		||||
  assign NextCauseM = TrapM ? {InterruptM, CauseM}: {CSRWriteValM[`XLEN-1], CSRWriteValM[3:0]};
 | 
			
		||||
  assign NextMtvalM = TrapM ? NextFaultMtvalM : CSRWriteValM;
 | 
			
		||||
  assign CSRMWriteM = CSRWriteM & (PrivilegeModeW == `M_MODE);
 | 
			
		||||
  assign CSRSWriteM = CSRWriteM & (|PrivilegeModeW);
 | 
			
		||||
 | 
			
		||||
@ -69,20 +69,21 @@ module csrm #(parameter
 | 
			
		||||
  DSCRATCH1 = 12'h7B3,
 | 
			
		||||
  // Constants
 | 
			
		||||
  ZERO = {(`XLEN){1'b0}},
 | 
			
		||||
  MEDELEG_MASK = ~(ZERO | `XLEN'b1 << 11),
 | 
			
		||||
  MEDELEG_MASK = 16'hB3FF,
 | 
			
		||||
  MIDELEG_MASK = 12'h222 // we choose to not make machine interrupts delegable
 | 
			
		||||
) (
 | 
			
		||||
  input  logic                    clk, reset, 
 | 
			
		||||
  input  logic                    InstrValidNotFlushedM, 
 | 
			
		||||
  input  logic                    CSRMWriteM, MTrapM,
 | 
			
		||||
  input  logic [11:0]             CSRAdrM,
 | 
			
		||||
  input  logic [`XLEN-1:0]        NextEPCM, NextCauseM, NextMtvalM, MSTATUS_REGW, MSTATUSH_REGW,
 | 
			
		||||
  input  logic [`XLEN-1:0]        NextEPCM, NextMtvalM, MSTATUS_REGW, MSTATUSH_REGW,
 | 
			
		||||
  input  logic [4:0]              NextCauseM,
 | 
			
		||||
  input  logic [`XLEN-1:0]        CSRWriteValM,
 | 
			
		||||
  input  logic [11:0]             MIP_REGW, MIE_REGW,
 | 
			
		||||
  output logic [`XLEN-1:0]        CSRMReadValM, MTVEC_REGW,
 | 
			
		||||
  output logic [`XLEN-1:0]        MEPC_REGW,    
 | 
			
		||||
  output logic [31:0]             MCOUNTEREN_REGW, MCOUNTINHIBIT_REGW, 
 | 
			
		||||
  output logic [`XLEN-1:0]        MEDELEG_REGW,
 | 
			
		||||
  output logic [15:0]             MEDELEG_REGW,
 | 
			
		||||
  output logic [11:0]             MIDELEG_REGW,
 | 
			
		||||
  output var logic [7:0]          PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],
 | 
			
		||||
  output var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0],
 | 
			
		||||
@ -91,8 +92,8 @@ module csrm #(parameter
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  logic [`XLEN-1:0]               MISA_REGW, MHARTID_REGW;
 | 
			
		||||
  logic [`XLEN-1:0]               MSCRATCH_REGW;
 | 
			
		||||
  logic [`XLEN-1:0]               MCAUSE_REGW, MTVAL_REGW;
 | 
			
		||||
  logic [`XLEN-1:0]               MSCRATCH_REGW, MTVAL_REGW;
 | 
			
		||||
  logic [4:0]                     MCAUSE_REGW;
 | 
			
		||||
  logic                           WriteMTVECM, WriteMEDELEGM, WriteMIDELEGM;
 | 
			
		||||
  logic                           WriteMSCRATCHM, WriteMEPCM, WriteMCAUSEM, WriteMTVALM;
 | 
			
		||||
  logic                           WriteMCOUNTERENM, WriteMCOUNTINHIBITM;
 | 
			
		||||
@ -150,13 +151,13 @@ module csrm #(parameter
 | 
			
		||||
  // CSRs
 | 
			
		||||
  flopenr #(`XLEN) MTVECreg(clk, reset, WriteMTVECM, {CSRWriteValM[`XLEN-1:2], 1'b0, CSRWriteValM[0]}, MTVEC_REGW); 
 | 
			
		||||
  if (`S_SUPPORTED) begin:deleg // DELEG registers should exist
 | 
			
		||||
    flopenr #(`XLEN) MEDELEGreg(clk, reset, WriteMEDELEGM, CSRWriteValM & MEDELEG_MASK, MEDELEG_REGW);
 | 
			
		||||
    flopenr #(12)    MIDELEGreg(clk, reset, WriteMIDELEGM, CSRWriteValM[11:0] & MIDELEG_MASK, MIDELEG_REGW);
 | 
			
		||||
    flopenr #(16) MEDELEGreg(clk, reset, WriteMEDELEGM, CSRWriteValM[15:0] & MEDELEG_MASK, MEDELEG_REGW);
 | 
			
		||||
    flopenr #(12) MIDELEGreg(clk, reset, WriteMIDELEGM, CSRWriteValM[11:0] & MIDELEG_MASK, MIDELEG_REGW);
 | 
			
		||||
  end else assign {MEDELEG_REGW, MIDELEG_REGW} = 0;
 | 
			
		||||
 | 
			
		||||
  flopenr #(`XLEN) MSCRATCHreg(clk, reset, WriteMSCRATCHM, CSRWriteValM, MSCRATCH_REGW);
 | 
			
		||||
  flopenr #(`XLEN) MEPCreg(clk, reset, WriteMEPCM, NextEPCM, MEPC_REGW); 
 | 
			
		||||
  flopenr #(`XLEN) MCAUSEreg(clk, reset, WriteMCAUSEM, NextCauseM, MCAUSE_REGW);
 | 
			
		||||
  flopenr #(5)     MCAUSEreg(clk, reset, WriteMCAUSEM, NextCauseM, MCAUSE_REGW);
 | 
			
		||||
  if(`QEMU) assign MTVAL_REGW = `XLEN'b0; // MTVAL tied to 0 in QEMU configuration
 | 
			
		||||
  else flopenr #(`XLEN) MTVALreg(clk, reset, WriteMTVALM, NextMtvalM, MTVAL_REGW);
 | 
			
		||||
  flopenr #(32)   MCOUNTINHIBITreg(clk, reset, WriteMCOUNTINHIBITM, CSRWriteValM[31:0], MCOUNTINHIBIT_REGW);
 | 
			
		||||
@ -192,13 +193,13 @@ module csrm #(parameter
 | 
			
		||||
      MSTATUS:   CSRMReadValM = MSTATUS_REGW;
 | 
			
		||||
      MSTATUSH:  CSRMReadValM = MSTATUSH_REGW; 
 | 
			
		||||
      MTVEC:     CSRMReadValM = MTVEC_REGW;
 | 
			
		||||
      MEDELEG:   CSRMReadValM = MEDELEG_REGW;
 | 
			
		||||
      MEDELEG:   CSRMReadValM = {{(`XLEN-16){1'b0}}, MEDELEG_REGW};
 | 
			
		||||
      MIDELEG:   CSRMReadValM = {{(`XLEN-12){1'b0}}, MIDELEG_REGW};
 | 
			
		||||
      MIP:       CSRMReadValM = {{(`XLEN-12){1'b0}}, MIP_REGW};
 | 
			
		||||
      MIE:       CSRMReadValM = {{(`XLEN-12){1'b0}}, MIE_REGW};
 | 
			
		||||
      MSCRATCH:  CSRMReadValM = MSCRATCH_REGW;
 | 
			
		||||
      MEPC:      CSRMReadValM = MEPC_REGW;
 | 
			
		||||
      MCAUSE:    CSRMReadValM = MCAUSE_REGW;
 | 
			
		||||
      MCAUSE:    CSRMReadValM = {MCAUSE_REGW[4], {(`XLEN-5){1'b0}}, MCAUSE_REGW[3:0]};
 | 
			
		||||
      MTVAL:     CSRMReadValM = MTVAL_REGW;
 | 
			
		||||
      MTINST:    CSRMReadValM = 0; // implemented as trivial zero
 | 
			
		||||
      MCOUNTEREN:CSRMReadValM = {{(`XLEN-32){1'b0}}, MCOUNTEREN_REGW};
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,8 @@ module csrs #(parameter
 | 
			
		||||
  input  logic             InstrValidNotFlushedM, 
 | 
			
		||||
  input  logic             CSRSWriteM, STrapM,
 | 
			
		||||
  input  logic [11:0]      CSRAdrM,
 | 
			
		||||
  input  logic [`XLEN-1:0] NextEPCM, NextCauseM, NextMtvalM, SSTATUS_REGW, 
 | 
			
		||||
  input  logic [`XLEN-1:0] NextEPCM, NextMtvalM, SSTATUS_REGW, 
 | 
			
		||||
  input  logic [4:0]       NextCauseM,
 | 
			
		||||
  input  logic             STATUS_TVM,
 | 
			
		||||
  input  logic             MCOUNTEREN_TM, // TM bit (1) of MCOUNTEREN; cause illegal instruction when trying to access STIMECMP if clear
 | 
			
		||||
  input  logic [`XLEN-1:0] CSRWriteValM,
 | 
			
		||||
@ -73,7 +74,7 @@ module csrs #(parameter
 | 
			
		||||
  logic                    WriteSCAUSEM, WriteSTVALM, WriteSATPM, WriteSCOUNTERENM;
 | 
			
		||||
  logic                    WriteSTIMECMPM, WriteSTIMECMPHM;
 | 
			
		||||
  logic [`XLEN-1:0]        SSCRATCH_REGW, STVAL_REGW;
 | 
			
		||||
  logic [`XLEN-1:0]        SCAUSE_REGW;      
 | 
			
		||||
  logic [4:0]              SCAUSE_REGW;      
 | 
			
		||||
  logic [63:0]             STIMECMP_REGW;
 | 
			
		||||
  
 | 
			
		||||
  // write enables
 | 
			
		||||
@ -93,7 +94,7 @@ module csrs #(parameter
 | 
			
		||||
  flopenr #(`XLEN) STVECreg(clk, reset, WriteSTVECM, {CSRWriteValM[`XLEN-1:2], 1'b0, CSRWriteValM[0]}, STVEC_REGW); 
 | 
			
		||||
  flopenr #(`XLEN) SSCRATCHreg(clk, reset, WriteSSCRATCHM, CSRWriteValM, SSCRATCH_REGW);
 | 
			
		||||
  flopenr #(`XLEN) SEPCreg(clk, reset, WriteSEPCM, NextEPCM, SEPC_REGW); 
 | 
			
		||||
  flopenr #(`XLEN) SCAUSEreg(clk, reset, WriteSCAUSEM, NextCauseM, SCAUSE_REGW);
 | 
			
		||||
  flopenr #(5)     SCAUSEreg(clk, reset, WriteSCAUSEM, NextCauseM, SCAUSE_REGW);
 | 
			
		||||
  flopenr #(`XLEN) STVALreg(clk, reset, WriteSTVALM, NextMtvalM, STVAL_REGW);
 | 
			
		||||
  if (`VIRTMEM_SUPPORTED)
 | 
			
		||||
    flopenr #(`XLEN) SATPreg(clk, reset, WriteSATPM, CSRWriteValM, SATP_REGW);
 | 
			
		||||
@ -126,7 +127,7 @@ module csrs #(parameter
 | 
			
		||||
      SIE:       CSRSReadValM = {{(`XLEN-12){1'b0}}, MIE_REGW & 12'h222 & MIDELEG_REGW}; // only read supervisor fields
 | 
			
		||||
      SSCRATCH:  CSRSReadValM = SSCRATCH_REGW;
 | 
			
		||||
      SEPC:      CSRSReadValM = SEPC_REGW;
 | 
			
		||||
      SCAUSE:    CSRSReadValM = SCAUSE_REGW;
 | 
			
		||||
      SCAUSE:    CSRSReadValM = {SCAUSE_REGW[4], {(`XLEN-5){1'b0}}, SCAUSE_REGW[3:0]};
 | 
			
		||||
      STVAL:     CSRSReadValM = STVAL_REGW;
 | 
			
		||||
      SATP:      if (`VIRTMEM_SUPPORTED & (PrivilegeModeW == `M_MODE | ~STATUS_TVM)) CSRSReadValM = SATP_REGW;
 | 
			
		||||
                 else begin
 | 
			
		||||
 | 
			
		||||
@ -96,8 +96,8 @@ module privileged (
 | 
			
		||||
  output logic             WFIStallM                                       // Stall in Memory stage for WFI until interrupt or timeout
 | 
			
		||||
);                                                                         
 | 
			
		||||
                                                                           
 | 
			
		||||
  logic [`LOG_XLEN-1:0]    CauseM;                                         // trap cause
 | 
			
		||||
  logic [`XLEN-1:0]        MEDELEG_REGW;                                   // exception delegation CSR
 | 
			
		||||
  logic [3:0]              CauseM;                                         // trap cause
 | 
			
		||||
  logic [15:0]             MEDELEG_REGW;                                   // exception delegation CSR
 | 
			
		||||
  logic [11:0]             MIDELEG_REGW;                                   // interrupt delegation CSR
 | 
			
		||||
  logic                    sretM, mretM;                                   // supervisor / machine return instruction
 | 
			
		||||
  logic                    IllegalCSRAccessM;                              // Illegal access to CSR
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ module trap (
 | 
			
		||||
  input  logic                 wfiM,                                            // wait for interrupt instruction
 | 
			
		||||
  input  logic [1:0]           PrivilegeModeW,                                  // current privilege mode
 | 
			
		||||
  input  logic [11:0]          MIP_REGW, MIE_REGW, MIDELEG_REGW,                // interrupt pending, enabled, and delegate CSRs
 | 
			
		||||
  input  logic [`XLEN-1:0]     MEDELEG_REGW,                                    // exception delegation SR
 | 
			
		||||
  input  logic [15:0]          MEDELEG_REGW,                                    // exception delegation SR
 | 
			
		||||
  input  logic                 STATUS_MIE, STATUS_SIE,                          // machine/supervisor interrupt enables
 | 
			
		||||
  input  logic                 InstrValidM,                                     // current instruction is valid, not flushed
 | 
			
		||||
  input  logic                 CommittedM, CommittedF,                          // LSU/IFU has committed to a bus operation that can't be interrupted
 | 
			
		||||
@ -49,7 +49,7 @@ module trap (
 | 
			
		||||
  output logic                 IntPendingM,                                     // Interrupt is pending, might occur if enabled
 | 
			
		||||
  output logic                 DelegateM,                                       // Delegate trap to supervisor handler
 | 
			
		||||
  output logic                 WFIStallM,                                       // Stall due to WFI instruction
 | 
			
		||||
  output logic [`LOG_XLEN-1:0] CauseM                                           // trap cause
 | 
			
		||||
  output logic [3:0]           CauseM                                           // trap cause
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  logic                        MIntGlobalEnM, SIntGlobalEnM;                    // Global interupt enables
 | 
			
		||||
@ -72,7 +72,7 @@ module trap (
 | 
			
		||||
  assign EnabledIntsM = ({12{MIntGlobalEnM}} & PendingIntsM & ~MIDELEG_REGW | {12{SIntGlobalEnM}} & PendingIntsM & MIDELEG_REGW);
 | 
			
		||||
  assign ValidIntsM = {12{~Committed}} & EnabledIntsM;
 | 
			
		||||
  assign InterruptM = (|ValidIntsM) & InstrValidM; // suppress interrupt if the memory system has partially processed a request.
 | 
			
		||||
  assign DelegateM = `S_SUPPORTED & (InterruptM ? MIDELEG_REGW[CauseM[3:0]] : MEDELEG_REGW[CauseM]) & 
 | 
			
		||||
  assign DelegateM = `S_SUPPORTED & (InterruptM ? MIDELEG_REGW[CauseM] : MEDELEG_REGW[CauseM]) & 
 | 
			
		||||
                     (PrivilegeModeW == `U_MODE | PrivilegeModeW == `S_MODE);
 | 
			
		||||
  assign WFIStallM = wfiM & ~IntPendingM;
 | 
			
		||||
 | 
			
		||||
@ -109,7 +109,7 @@ module trap (
 | 
			
		||||
    else if (IllegalInstrFaultM)       CauseM = 2;
 | 
			
		||||
    else if (InstrMisalignedFaultM)    CauseM = 0;
 | 
			
		||||
    else if (BreakpointFaultM)         CauseM = 3;
 | 
			
		||||
    else if (EcallFaultM)              CauseM = {{(`LOG_XLEN-4){1'b0}}, {2'b10}, PrivilegeModeW};
 | 
			
		||||
    else if (EcallFaultM)              CauseM = {2'b10, PrivilegeModeW};
 | 
			
		||||
    else if (LoadMisalignedFaultM)     CauseM = 4;
 | 
			
		||||
    else if (StoreAmoMisalignedFaultM) CauseM = 6;
 | 
			
		||||
    else if (LoadPageFaultM)           CauseM = 13;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user