forked from Github_Repos/cvw
		
	Fix Issue #120 about SIE/SIP being 0 unless MIDELEG bits are set. However, this fix breaks the wally32/64priv tests in regression.
This commit is contained in:
		
							parent
							
								
									70e4c71f41
								
							
						
					
					
						commit
						031cc6967a
					
				@ -210,7 +210,7 @@ module csr #(parameter
 | 
			
		||||
  csri   csri(.clk, .reset, .InstrValidNotFlushedM,  
 | 
			
		||||
    .CSRMWriteM, .CSRSWriteM, .CSRWriteValM, .CSRAdrM, 
 | 
			
		||||
    .MExtInt, .SExtInt, .MTimerInt, .STimerInt, .MSwInt,
 | 
			
		||||
    .MIP_REGW, .MIE_REGW, .MIP_REGW_writeable);
 | 
			
		||||
    .MIDELEG_REGW, .MIP_REGW, .MIE_REGW, .MIP_REGW_writeable);
 | 
			
		||||
 | 
			
		||||
  csrsr csrsr(.clk, .reset, .StallW, 
 | 
			
		||||
    .WriteMSTATUSM, .WriteMSTATUSHM, .WriteSSTATUSM, 
 | 
			
		||||
 | 
			
		||||
@ -40,6 +40,7 @@ module csri #(parameter
 | 
			
		||||
  input  logic [`XLEN-1:0]  CSRWriteValM,
 | 
			
		||||
  input  logic [11:0] 		  CSRAdrM,
 | 
			
		||||
  input  logic              MExtInt, SExtInt, MTimerInt, STimerInt, MSwInt,
 | 
			
		||||
  input  logic [11:0]       MIDELEG_REGW,
 | 
			
		||||
  output logic [11:0] 	    MIP_REGW, MIE_REGW,
 | 
			
		||||
  output logic [11:0]       MIP_REGW_writeable // only SEIP, STIP, SSIP are actually writeable; the rest are hardwired to 0
 | 
			
		||||
);
 | 
			
		||||
@ -66,7 +67,7 @@ module csri #(parameter
 | 
			
		||||
      assign MIP_WRITE_MASK = 12'h222; // SEIP, STIP, SSIP are writeable in MIP (20210108-draft 3.1.9)
 | 
			
		||||
      assign STIP = MIP_REGW_writeable[5];
 | 
			
		||||
    end
 | 
			
		||||
    assign SIP_WRITE_MASK = 12'h002; // SSIP is writeable in SIP (privileged 20210108-draft 4.1.3) 
 | 
			
		||||
    assign SIP_WRITE_MASK = 12'h002 & MIDELEG_REGW; // SSIP is writeable in SIP (privileged 20210108-draft 4.1.3) 
 | 
			
		||||
    assign MIE_WRITE_MASK = 12'hAAA;
 | 
			
		||||
  end else begin:mask
 | 
			
		||||
    assign MIP_WRITE_MASK = 12'h000;
 | 
			
		||||
@ -80,7 +81,7 @@ module csri #(parameter
 | 
			
		||||
  always @(posedge clk)
 | 
			
		||||
    if (reset)          MIE_REGW <= 12'b0;
 | 
			
		||||
    else if (WriteMIEM) MIE_REGW <= (CSRWriteValM[11:0] & MIE_WRITE_MASK); // MIE controls M and S fields
 | 
			
		||||
    else if (WriteSIEM) MIE_REGW <= (CSRWriteValM[11:0] & 12'h222) | (MIE_REGW & 12'h888); // only S fields
 | 
			
		||||
    else if (WriteSIEM) MIE_REGW <= (CSRWriteValM[11:0] & 12'h222 & MIDELEG_REGW) | (MIE_REGW & 12'h888); // only S fields
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  assign MIP_REGW = {MExtInt,   1'b0, SExtInt|MIP_REGW_writeable[9],  1'b0,
 | 
			
		||||
 | 
			
		||||
@ -123,7 +123,7 @@ module csrs #(parameter
 | 
			
		||||
      SSTATUS:   CSRSReadValM = SSTATUS_REGW;
 | 
			
		||||
      STVEC:     CSRSReadValM = STVEC_REGW;
 | 
			
		||||
      SIP:       CSRSReadValM = {{(`XLEN-12){1'b0}}, MIP_REGW & 12'h222 & MIDELEG_REGW}; // only read supervisor fields  
 | 
			
		||||
      SIE:       CSRSReadValM = {{(`XLEN-12){1'b0}}, MIE_REGW & 12'h222}; // only read supervisor fields
 | 
			
		||||
      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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user