mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Fixed WARL bug on MTVEC/STVEC alignment to 64 in vectored mode
This commit is contained in:
		
							parent
							
								
									0781a32991
								
							
						
					
					
						commit
						13f1aa1ebf
					
				@ -57,6 +57,7 @@ module csrm  import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
  logic [P.XLEN-1:0]               MISA_REGW, MHARTID_REGW;
 | 
					  logic [P.XLEN-1:0]               MISA_REGW, MHARTID_REGW;
 | 
				
			||||||
  logic [P.XLEN-1:0]               MSCRATCH_REGW, MTVAL_REGW, MCAUSE_REGW;
 | 
					  logic [P.XLEN-1:0]               MSCRATCH_REGW, MTVAL_REGW, MCAUSE_REGW;
 | 
				
			||||||
  logic [P.XLEN-1:0]               MENVCFGH_REGW;
 | 
					  logic [P.XLEN-1:0]               MENVCFGH_REGW;
 | 
				
			||||||
 | 
					  logic [P.XLEN-1:0]               TVECWriteValM;
 | 
				
			||||||
  logic                            WriteMTVECM, WriteMEDELEGM, WriteMIDELEGM;
 | 
					  logic                            WriteMTVECM, WriteMEDELEGM, WriteMIDELEGM;
 | 
				
			||||||
  logic                            WriteMSCRATCHM, WriteMEPCM, WriteMCAUSEM, WriteMTVALM;
 | 
					  logic                            WriteMSCRATCHM, WriteMEPCM, WriteMCAUSEM, WriteMTVALM;
 | 
				
			||||||
  logic                            WriteMCOUNTERENM, WriteMCOUNTINHIBITM;
 | 
					  logic                            WriteMCOUNTERENM, WriteMCOUNTINHIBITM;
 | 
				
			||||||
@ -152,7 +153,8 @@ module csrm  import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
  assign IllegalCSRMWriteReadonlyM = UngatedCSRMWriteM & (CSRAdrM == MVENDORID | CSRAdrM == MARCHID | CSRAdrM == MIMPID | CSRAdrM == MHARTID | CSRAdrM == MCONFIGPTR);
 | 
					  assign IllegalCSRMWriteReadonlyM = UngatedCSRMWriteM & (CSRAdrM == MVENDORID | CSRAdrM == MARCHID | CSRAdrM == MIMPID | CSRAdrM == MHARTID | CSRAdrM == MCONFIGPTR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // CSRs
 | 
					  // CSRs
 | 
				
			||||||
  flopenr #(P.XLEN) MTVECreg(clk, reset, WriteMTVECM, {CSRWriteValM[P.XLEN-1:2], 1'b0, CSRWriteValM[0]}, MTVEC_REGW); 
 | 
					  assign TVECWriteValM = CSRWriteValM[0] ? {CSRWriteValM[P.XLEN-1:6], 6'b000001} : {CSRWriteValM[P.XLEN-1:2], 2'b00};
 | 
				
			||||||
 | 
					  flopenr #(P.XLEN) MTVECreg(clk, reset, WriteMTVECM, TVECWriteValM, MTVEC_REGW); 
 | 
				
			||||||
  if (P.S_SUPPORTED) begin:deleg // DELEG registers should exist
 | 
					  if (P.S_SUPPORTED) begin:deleg // DELEG registers should exist
 | 
				
			||||||
    flopenr #(16) MEDELEGreg(clk, reset, WriteMEDELEGM, CSRWriteValM[15:0] & MEDELEG_MASK, MEDELEG_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);
 | 
					    flopenr #(12) MIDELEGreg(clk, reset, WriteMIDELEGM, CSRWriteValM[11:0] & MIDELEG_MASK, MIDELEG_REGW);
 | 
				
			||||||
 | 
				
			|||||||
@ -78,6 +78,7 @@ module csrs import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  logic [P.XLEN-1:0]       SSCRATCH_REGW, STVAL_REGW, SCAUSE_REGW;
 | 
					  logic [P.XLEN-1:0]       SSCRATCH_REGW, STVAL_REGW, SCAUSE_REGW;
 | 
				
			||||||
  logic [P.XLEN-1:0]       SENVCFG_WriteValM;
 | 
					  logic [P.XLEN-1:0]       SENVCFG_WriteValM;
 | 
				
			||||||
 | 
					  logic [P.XLEN-1:0]               TVECWriteValM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [63:0]             STIMECMP_REGW;
 | 
					  logic [63:0]             STIMECMP_REGW;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
@ -100,7 +101,8 @@ module csrs import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
  assign WriteSTIMECMPHM  = CSRSWriteM & (CSRAdrM == STIMECMPH) & STCE & (P.XLEN == 32);
 | 
					  assign WriteSTIMECMPHM  = CSRSWriteM & (CSRAdrM == STIMECMPH) & STCE & (P.XLEN == 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // CSRs
 | 
					  // CSRs
 | 
				
			||||||
  flopenr #(P.XLEN) STVECreg(clk, reset, WriteSTVECM, {CSRWriteValM[P.XLEN-1:2], 1'b0, CSRWriteValM[0]}, STVEC_REGW); 
 | 
					  assign TVECWriteValM = CSRWriteValM[0] ? {CSRWriteValM[P.XLEN-1:6], 6'b000001} : {CSRWriteValM[P.XLEN-1:2], 2'b00}; // could share this with MTVEC, but reduces to 4-bit AND to mask bits [5:2]
 | 
				
			||||||
 | 
					  flopenr #(P.XLEN) STVECreg(clk, reset, WriteSTVECM, TVECWriteValM, STVEC_REGW); 
 | 
				
			||||||
  flopenr #(P.XLEN) SSCRATCHreg(clk, reset, WriteSSCRATCHM, CSRWriteValM, SSCRATCH_REGW);
 | 
					  flopenr #(P.XLEN) SSCRATCHreg(clk, reset, WriteSSCRATCHM, CSRWriteValM, SSCRATCH_REGW);
 | 
				
			||||||
  flopenr #(P.XLEN) SEPCreg(clk, reset, WriteSEPCM, NextEPCM, SEPC_REGW); 
 | 
					  flopenr #(P.XLEN) SEPCreg(clk, reset, WriteSEPCM, NextEPCM, SEPC_REGW); 
 | 
				
			||||||
  flopenr #(P.XLEN) SCAUSEreg(clk, reset, WriteSCAUSEM, {NextCauseM[4], {(P.XLEN-5){1'b0}}, NextCauseM[3:0]}, SCAUSE_REGW);
 | 
					  flopenr #(P.XLEN) SCAUSEreg(clk, reset, WriteSCAUSEM, {NextCauseM[4], {(P.XLEN-5){1'b0}}, NextCauseM[3:0]}, SCAUSE_REGW);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user