mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Removed depricated N-mode support and SI/EDELEG registers. rv64gc_wally64priv tests are failing, but seem to be failing before this change.
This commit is contained in:
		
							parent
							
								
									126f196d46
								
							
						
					
					
						commit
						5ef8f6bc7e
					
				@ -190,7 +190,7 @@ module hptw
 | 
				
			|||||||
	LEAF:                       NextWalkerState = IDLE; // updates TLB
 | 
						LEAF:                       NextWalkerState = IDLE; // updates TLB
 | 
				
			||||||
	default: begin
 | 
						default: begin
 | 
				
			||||||
		// synthesis translate_off
 | 
							// synthesis translate_off
 | 
				
			||||||
		$error("Default state in HPTW should be unreachable");
 | 
							$error("Default state in HPTW should be unreachable; was %d", WalkerState);
 | 
				
			||||||
		// synthesis translate_on
 | 
							// synthesis translate_on
 | 
				
			||||||
		NextWalkerState = IDLE; // should never be reached
 | 
							NextWalkerState = IDLE; // should never be reached
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
				
			|||||||
@ -60,7 +60,7 @@ module csr #(parameter
 | 
				
			|||||||
  output logic [1:0]       STATUS_MPP,
 | 
					  output logic [1:0]       STATUS_MPP,
 | 
				
			||||||
  output logic             STATUS_SPP, STATUS_TSR,
 | 
					  output logic             STATUS_SPP, STATUS_TSR,
 | 
				
			||||||
  output logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW,
 | 
					  output logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW,
 | 
				
			||||||
  output logic [`XLEN-1:0]      MEDELEG_REGW, MIDELEG_REGW, SEDELEG_REGW, SIDELEG_REGW, 
 | 
					  output logic [`XLEN-1:0]      MEDELEG_REGW, MIDELEG_REGW, 
 | 
				
			||||||
  output logic [`XLEN-1:0] SATP_REGW,
 | 
					  output logic [`XLEN-1:0] SATP_REGW,
 | 
				
			||||||
  output logic [11:0]      MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW,
 | 
					  output logic [11:0]      MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW,
 | 
				
			||||||
  output logic             STATUS_MIE, STATUS_SIE,
 | 
					  output logic             STATUS_MIE, STATUS_SIE,
 | 
				
			||||||
@ -153,7 +153,7 @@ module csr #(parameter
 | 
				
			|||||||
              .NextEPCM, .NextCauseM, .NextMtvalM, .SSTATUS_REGW, 
 | 
					              .NextEPCM, .NextCauseM, .NextMtvalM, .SSTATUS_REGW, 
 | 
				
			||||||
              .STATUS_TVM, .CSRWriteValM, .PrivilegeModeW,
 | 
					              .STATUS_TVM, .CSRWriteValM, .PrivilegeModeW,
 | 
				
			||||||
              .CSRSReadValM, .STVEC_REGW, .SEPC_REGW,      
 | 
					              .CSRSReadValM, .STVEC_REGW, .SEPC_REGW,      
 | 
				
			||||||
              .SCOUNTEREN_REGW, .SEDELEG_REGW, .SIDELEG_REGW, 
 | 
					              .SCOUNTEREN_REGW,
 | 
				
			||||||
              .SATP_REGW, .SIP_REGW, .SIE_REGW,
 | 
					              .SATP_REGW, .SIP_REGW, .SIE_REGW,
 | 
				
			||||||
              .WriteSSTATUSM, .IllegalCSRSAccessM);
 | 
					              .WriteSSTATUSM, .IllegalCSRSAccessM);
 | 
				
			||||||
  csrn  csrn(.clk, .reset, .InstrValidNotFlushedM, .StallW,
 | 
					  csrn  csrn(.clk, .reset, .InstrValidNotFlushedM, .StallW,
 | 
				
			||||||
 | 
				
			|||||||
@ -35,8 +35,6 @@
 | 
				
			|||||||
module csrs #(parameter 
 | 
					module csrs #(parameter 
 | 
				
			||||||
  // Supervisor CSRs
 | 
					  // Supervisor CSRs
 | 
				
			||||||
  SSTATUS = 12'h100,
 | 
					  SSTATUS = 12'h100,
 | 
				
			||||||
  SEDELEG = 12'h102,
 | 
					 | 
				
			||||||
  SIDELEG = 12'h103,
 | 
					 | 
				
			||||||
  SIE = 12'h104,
 | 
					  SIE = 12'h104,
 | 
				
			||||||
  STVEC = 12'h105,
 | 
					  STVEC = 12'h105,
 | 
				
			||||||
  SCOUNTEREN = 12'h106,
 | 
					  SCOUNTEREN = 12'h106,
 | 
				
			||||||
@ -62,7 +60,6 @@ module csrs #(parameter
 | 
				
			|||||||
    output logic [`XLEN-1:0] CSRSReadValM, STVEC_REGW,
 | 
					    output logic [`XLEN-1:0] CSRSReadValM, STVEC_REGW,
 | 
				
			||||||
    (* mark_debug = "true" *) output logic [`XLEN-1:0] SEPC_REGW,      
 | 
					    (* mark_debug = "true" *) output logic [`XLEN-1:0] SEPC_REGW,      
 | 
				
			||||||
    output logic [31:0]      SCOUNTEREN_REGW, 
 | 
					    output logic [31:0]      SCOUNTEREN_REGW, 
 | 
				
			||||||
    output logic [`XLEN-1:0] SEDELEG_REGW, SIDELEG_REGW, 
 | 
					 | 
				
			||||||
    output logic [`XLEN-1:0] SATP_REGW,
 | 
					    output logic [`XLEN-1:0] SATP_REGW,
 | 
				
			||||||
    (* mark_debug = "true" *) input logic [11:0] SIP_REGW, SIE_REGW,
 | 
					    (* mark_debug = "true" *) input logic [11:0] SIP_REGW, SIE_REGW,
 | 
				
			||||||
    output logic 	     WriteSSTATUSM,
 | 
					    output logic 	     WriteSSTATUSM,
 | 
				
			||||||
@ -102,27 +99,12 @@ module csrs #(parameter
 | 
				
			|||||||
      assign SATP_REGW = 0; // hardwire to zero if virtual memory not supported
 | 
					      assign SATP_REGW = 0; // hardwire to zero if virtual memory not supported
 | 
				
			||||||
    flopens #(32)   SCOUNTERENreg(clk, reset, WriteSCOUNTERENM, CSRWriteValM[31:0], SCOUNTEREN_REGW);
 | 
					    flopens #(32)   SCOUNTERENreg(clk, reset, WriteSCOUNTERENM, CSRWriteValM[31:0], SCOUNTEREN_REGW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (`N_SUPPORTED) begin:nregs
 | 
					 | 
				
			||||||
      logic WriteSEDELEGM, WriteSIDELEGM;
 | 
					 | 
				
			||||||
      assign WriteSEDELEGM = CSRSWriteM & (CSRAdrM == SEDELEG);
 | 
					 | 
				
			||||||
      assign WriteSIDELEGM = CSRSWriteM & (CSRAdrM == SIDELEG);
 | 
					 | 
				
			||||||
      flopenr #(`XLEN) SEDELEGreg(clk, reset, WriteSEDELEGM, CSRWriteValM & SEDELEG_MASK, SEDELEG_REGW);
 | 
					 | 
				
			||||||
      flopenr #(`XLEN) SIDELEGreg(clk, reset, WriteSIDELEGM, CSRWriteValM, SIDELEG_REGW);
 | 
					 | 
				
			||||||
    end else begin
 | 
					 | 
				
			||||||
      assign SEDELEG_REGW = 0;
 | 
					 | 
				
			||||||
      assign SIDELEG_REGW = 0;
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // CSR Reads
 | 
					    // CSR Reads
 | 
				
			||||||
    always_comb begin:csrr
 | 
					    always_comb begin:csrr
 | 
				
			||||||
      IllegalCSRSAccessM = !(`N_SUPPORTED)  & (CSRAdrM == SEDELEG | CSRAdrM == SIDELEG); // trap on DELEG register access when no N-mode
 | 
					      IllegalCSRSAccessM = 0;
 | 
				
			||||||
      case (CSRAdrM) 
 | 
					      case (CSRAdrM) 
 | 
				
			||||||
        SSTATUS:   CSRSReadValM = SSTATUS_REGW;
 | 
					        SSTATUS:   CSRSReadValM = SSTATUS_REGW;
 | 
				
			||||||
        STVEC:     CSRSReadValM = STVEC_REGW;
 | 
					        STVEC:     CSRSReadValM = STVEC_REGW;
 | 
				
			||||||
//          SIDELEG:   CSRSReadValM = {{(`XLEN-12){1'b0}}, SIDELEG_REGW};
 | 
					 | 
				
			||||||
//          SEDELEG:   CSRSReadValM = {{(`XLEN-12){1'b0}}, SEDELEG_REGW};
 | 
					 | 
				
			||||||
        SIDELEG:   CSRSReadValM = SIDELEG_REGW;
 | 
					 | 
				
			||||||
        SEDELEG:   CSRSReadValM = SEDELEG_REGW;
 | 
					 | 
				
			||||||
        SIP:       CSRSReadValM = {{(`XLEN-12){1'b0}}, SIP_REGW};
 | 
					        SIP:       CSRSReadValM = {{(`XLEN-12){1'b0}}, SIP_REGW};
 | 
				
			||||||
        SIE:       CSRSReadValM = {{(`XLEN-12){1'b0}}, SIE_REGW};
 | 
					        SIE:       CSRSReadValM = {{(`XLEN-12){1'b0}}, SIE_REGW};
 | 
				
			||||||
        SSCRATCH:  CSRSReadValM = SSCRATCH_REGW;
 | 
					        SSCRATCH:  CSRSReadValM = SSCRATCH_REGW;
 | 
				
			||||||
@ -146,8 +128,6 @@ module csrs #(parameter
 | 
				
			|||||||
    assign CSRSReadValM = 0;
 | 
					    assign CSRSReadValM = 0;
 | 
				
			||||||
    assign SEPC_REGW = 0;
 | 
					    assign SEPC_REGW = 0;
 | 
				
			||||||
    assign STVEC_REGW = 0;
 | 
					    assign STVEC_REGW = 0;
 | 
				
			||||||
    assign SEDELEG_REGW = 0;
 | 
					 | 
				
			||||||
    assign SIDELEG_REGW = 0;
 | 
					 | 
				
			||||||
    assign SCOUNTEREN_REGW = 0;
 | 
					    assign SCOUNTEREN_REGW = 0;
 | 
				
			||||||
    assign SATP_REGW = 0;
 | 
					    assign SATP_REGW = 0;
 | 
				
			||||||
    assign IllegalCSRSAccessM = 1;
 | 
					    assign IllegalCSRSAccessM = 1;
 | 
				
			||||||
 | 
				
			|||||||
@ -86,8 +86,7 @@ module privileged (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  logic [`XLEN-1:0] CauseM, NextFaultMtvalM;
 | 
					  logic [`XLEN-1:0] CauseM, NextFaultMtvalM;
 | 
				
			||||||
  logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW;
 | 
					  logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, UEPC_REGW, UTVEC_REGW, STVEC_REGW, MTVEC_REGW;
 | 
				
			||||||
  //  logic [11:0] MEDELEG_REGW, MIDELEG_REGW, SEDELEG_REGW, SIDELEG_REGW;
 | 
					  logic [`XLEN-1:0] MEDELEG_REGW, MIDELEG_REGW;
 | 
				
			||||||
  logic [`XLEN-1:0] MEDELEG_REGW, MIDELEG_REGW, SEDELEG_REGW, SIDELEG_REGW;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic uretM, sretM, mretM, ecallM, ebreakM, wfiM, sfencevmaM;
 | 
					  logic uretM, sretM, mretM, ecallM, ebreakM, wfiM, sfencevmaM;
 | 
				
			||||||
  logic IllegalCSRAccessM;
 | 
					  logic IllegalCSRAccessM;
 | 
				
			||||||
@ -103,7 +102,7 @@ module privileged (
 | 
				
			|||||||
  logic       STATUS_SPP, STATUS_TSR, STATUS_TW; 
 | 
					  logic       STATUS_SPP, STATUS_TSR, STATUS_TW; 
 | 
				
			||||||
  logic       STATUS_MIE, STATUS_SIE;
 | 
					  logic       STATUS_MIE, STATUS_SIE;
 | 
				
			||||||
  logic [11:0] MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW;
 | 
					  logic [11:0] MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW;
 | 
				
			||||||
  logic md, sd;
 | 
					  logic md;
 | 
				
			||||||
  logic       StallMQ;
 | 
					  logic       StallMQ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -112,36 +111,29 @@ module privileged (
 | 
				
			|||||||
  ///////////////////////////////////////////
 | 
					  ///////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // get bits of DELEG registers based on CAUSE
 | 
					  // get bits of DELEG registers based on CAUSE
 | 
				
			||||||
  //  assign md = CauseM[`XLEN-1] ? MIDELEG_REGW[CauseM[3:0]] : MEDELEG_REGW[CauseM[3:0]];
 | 
					 | 
				
			||||||
  //  assign sd = CauseM[`XLEN-1] ? SIDELEG_REGW[CauseM[3:0]] : SEDELEG_REGW[CauseM[3:0]]; // depricated
 | 
					 | 
				
			||||||
  assign md = CauseM[`XLEN-1] ? MIDELEG_REGW[CauseM[`LOG_XLEN-1:0]] : MEDELEG_REGW[CauseM[`LOG_XLEN-1:0]];
 | 
					  assign md = CauseM[`XLEN-1] ? MIDELEG_REGW[CauseM[`LOG_XLEN-1:0]] : MEDELEG_REGW[CauseM[`LOG_XLEN-1:0]];
 | 
				
			||||||
  assign sd = CauseM[`XLEN-1] ? SIDELEG_REGW[CauseM[`LOG_XLEN-1:0]] : SEDELEG_REGW[CauseM[`LOG_XLEN-1:0]]; // depricated
 | 
					 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // PrivilegeMode FSM
 | 
					  // PrivilegeMode FSM
 | 
				
			||||||
  always_comb begin
 | 
					  always_comb begin
 | 
				
			||||||
    TrappedSRETM = 0;
 | 
					    TrappedSRETM = 0;
 | 
				
			||||||
    if (mretM) NextPrivilegeModeM = STATUS_MPP;
 | 
					    if (mretM)      NextPrivilegeModeM = STATUS_MPP;
 | 
				
			||||||
    else if (sretM) 
 | 
					    else if (sretM) 
 | 
				
			||||||
      if (STATUS_TSR & PrivilegeModeW == `S_MODE) begin
 | 
					      if (STATUS_TSR & PrivilegeModeW == `S_MODE) begin
 | 
				
			||||||
        TrappedSRETM = 1;
 | 
					        TrappedSRETM = 1;
 | 
				
			||||||
        NextPrivilegeModeM = PrivilegeModeW;
 | 
					                    NextPrivilegeModeM = PrivilegeModeW;
 | 
				
			||||||
      end else NextPrivilegeModeM = {1'b0, STATUS_SPP};
 | 
					      end else      NextPrivilegeModeM = {1'b0, STATUS_SPP};
 | 
				
			||||||
    else if (uretM) NextPrivilegeModeM = `U_MODE;
 | 
					    else if (uretM) NextPrivilegeModeM = `U_MODE; // *** can this happen without N mode?
 | 
				
			||||||
    else if (TrapM) begin // Change privilege based on DELEG registers (see 3.1.8)
 | 
					    else if (TrapM) begin // Change privilege based on DELEG registers (see 3.1.8)
 | 
				
			||||||
      if (PrivilegeModeW == `U_MODE)
 | 
					      if (`S_SUPPORTED & md & (PrivilegeModeW == `U_MODE | PrivilegeModeW == `S_MODE))
 | 
				
			||||||
        if (`N_SUPPORTED & `U_SUPPORTED & md & sd) NextPrivilegeModeM = `U_MODE;
 | 
					                    NextPrivilegeModeM = `S_MODE;
 | 
				
			||||||
        else if (`S_SUPPORTED & md)                NextPrivilegeModeM = `S_MODE;
 | 
					      else          NextPrivilegeModeM = `M_MODE;
 | 
				
			||||||
        else                                       NextPrivilegeModeM = `M_MODE;
 | 
					    end else        NextPrivilegeModeM = PrivilegeModeW;
 | 
				
			||||||
      else if (PrivilegeModeW == `S_MODE) 
 | 
					 | 
				
			||||||
        if (`S_SUPPORTED & md)                     NextPrivilegeModeM = `S_MODE;
 | 
					 | 
				
			||||||
        else                                       NextPrivilegeModeM = `M_MODE;
 | 
					 | 
				
			||||||
      else                                         NextPrivilegeModeM = `M_MODE;
 | 
					 | 
				
			||||||
    end else                                       NextPrivilegeModeM = PrivilegeModeW;
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  // *** WFI could be implemented here and depends on TW
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  flopenl #(2) privmodereg(clk, reset, ~StallW, NextPrivilegeModeM, `M_MODE, PrivilegeModeW);
 | 
					  flopenl #(2) privmodereg(clk, reset, ~StallW, NextPrivilegeModeM, `M_MODE, PrivilegeModeW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // *** WFI could be implemented here and depends on TW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ///////////////////////////////////////////
 | 
					  ///////////////////////////////////////////
 | 
				
			||||||
  // decode privileged instructions
 | 
					  // decode privileged instructions
 | 
				
			||||||
  ///////////////////////////////////////////
 | 
					  ///////////////////////////////////////////
 | 
				
			||||||
@ -168,7 +160,7 @@ module privileged (
 | 
				
			|||||||
          .CauseM, .NextFaultMtvalM, .STATUS_MPP,
 | 
					          .CauseM, .NextFaultMtvalM, .STATUS_MPP,
 | 
				
			||||||
          .STATUS_SPP, .STATUS_TSR,
 | 
					          .STATUS_SPP, .STATUS_TSR,
 | 
				
			||||||
          .MEPC_REGW, .SEPC_REGW, .UEPC_REGW, .UTVEC_REGW, .STVEC_REGW, .MTVEC_REGW,
 | 
					          .MEPC_REGW, .SEPC_REGW, .UEPC_REGW, .UTVEC_REGW, .STVEC_REGW, .MTVEC_REGW,
 | 
				
			||||||
          .MEDELEG_REGW, .MIDELEG_REGW, .SEDELEG_REGW, .SIDELEG_REGW, 
 | 
					          .MEDELEG_REGW, .MIDELEG_REGW, 
 | 
				
			||||||
          .SATP_REGW,
 | 
					          .SATP_REGW,
 | 
				
			||||||
          .MIP_REGW, .MIE_REGW, .SIP_REGW, .SIE_REGW,
 | 
					          .MIP_REGW, .MIE_REGW, .SIP_REGW, .SIE_REGW,
 | 
				
			||||||
          .STATUS_MIE, .STATUS_SIE,
 | 
					          .STATUS_MIE, .STATUS_SIE,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user