forked from Github_Repos/cvw
		
	Merge pull request #179 from davidharrishmc/dev
Fixed broken regression: privileged tests and build root
This commit is contained in:
		
						commit
						a28a457099
					
				@ -90,14 +90,14 @@ module fctrl (
 | 
			
		||||
                         (Fmt2 == 2'b10 & `ZFH_SUPPORTED) | (Fmt2 == 2'b11 & `Q_SUPPORTED));
 | 
			
		||||
 | 
			
		||||
  // decode the instruction                       
 | 
			
		||||
   // ControlsD: FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt
 | 
			
		||||
  // FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt
 | 
			
		||||
  always_comb
 | 
			
		||||
    if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0;
 | 
			
		||||
    else if (OpD != 7'b0000111 & OpD != 7'b0100111 & ~SupportedFmt) 
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0; // for anything other than loads and stores, check for supported format
 | 
			
		||||
    else begin 
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_0xx_0_1_0; // default: illegal FPU instruction
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_xx_000_0_1_0; // default: non-implemented instruction
 | 
			
		||||
      /* verilator lint_off CASEINCOMPLETE */ // default value above has priority so no other default needed
 | 
			
		||||
      case(OpD)
 | 
			
		||||
        7'b0000111: case(Funct3D)
 | 
			
		||||
@ -198,10 +198,11 @@ module fctrl (
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.q   q->l
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.q  q->lu
 | 
			
		||||
                                  endcase
 | 
			
		||||
                                
 | 
			
		||||
                    endcase
 | 
			
		||||
      endcase
 | 
			
		||||
      /* verilator lint_off CASEINCOMPLETE */
 | 
			
		||||
    end
 | 
			
		||||
    /* verilator lint_on CASEINCOMPLETE */
 | 
			
		||||
 | 
			
		||||
  // unswizzle control bits
 | 
			
		||||
  assign #1 {FRegWriteD, FWriteIntD, FResSelD, PostProcSelD, OpCtrlD, FDivStartD, IllegalFPUInstrD, FCvtIntD} = ControlsD;
 | 
			
		||||
@ -328,6 +329,4 @@ module fctrl (
 | 
			
		||||
          {FRegWriteM, FResSelM, FCvtIntM},
 | 
			
		||||
          {FRegWriteW, FResSelW, FCvtIntW});
 | 
			
		||||
 
 | 
			
		||||
  //assign FCvtIntW = (FResSelW == 2'b01);
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
@ -106,6 +106,7 @@ module csr #(parameter
 | 
			
		||||
  logic [31:0]             MCOUNTINHIBIT_REGW, MCOUNTEREN_REGW, SCOUNTEREN_REGW;
 | 
			
		||||
  logic                    WriteMSTATUSM, WriteMSTATUSHM, WriteSSTATUSM;
 | 
			
		||||
  logic                    CSRMWriteM, CSRSWriteM, CSRUWriteM;
 | 
			
		||||
  logic                    UngatedCSRMWriteM;
 | 
			
		||||
  logic                    WriteFRMM, WriteFFLAGSM;
 | 
			
		||||
  logic [`XLEN-1:0]        UnalignedNextEPCM, NextEPCM, NextMtvalM;
 | 
			
		||||
  logic [4:0]              NextCauseM;
 | 
			
		||||
@ -199,9 +200,10 @@ module csr #(parameter
 | 
			
		||||
  assign NextEPCM = `C_SUPPORTED ? {UnalignedNextEPCM[`XLEN-1:1], 1'b0} : {UnalignedNextEPCM[`XLEN-1:2], 2'b00}; // 3.1.15 alignment
 | 
			
		||||
  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);
 | 
			
		||||
  assign CSRUWriteM = CSRWriteM;  
 | 
			
		||||
  assign UngatedCSRMWriteM = CSRWriteM & (PrivilegeModeW == `M_MODE);
 | 
			
		||||
  assign CSRMWriteM = UngatedCSRMWriteM & InstrValidNotFlushedM;
 | 
			
		||||
  assign CSRSWriteM = CSRWriteM & (|PrivilegeModeW)  & InstrValidNotFlushedM;
 | 
			
		||||
  assign CSRUWriteM = CSRWriteM  & InstrValidNotFlushedM;
 | 
			
		||||
  assign MTrapM = TrapM & (NextPrivilegeModeM == `M_MODE);
 | 
			
		||||
  assign STrapM = TrapM & (NextPrivilegeModeM == `S_MODE) & `S_SUPPORTED;
 | 
			
		||||
 | 
			
		||||
@ -209,7 +211,7 @@ module csr #(parameter
 | 
			
		||||
  // CSRs
 | 
			
		||||
  ///////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
  csri   csri(.clk, .reset, .InstrValidNotFlushedM,  
 | 
			
		||||
  csri   csri(.clk, .reset,  
 | 
			
		||||
    .CSRMWriteM, .CSRSWriteM, .CSRWriteValM, .CSRAdrM, 
 | 
			
		||||
    .MExtInt, .SExtInt, .MTimerInt, .STimerInt, .MSwInt,
 | 
			
		||||
    .MIDELEG_REGW, .MIP_REGW, .MIE_REGW, .MIP_REGW_writeable);
 | 
			
		||||
@ -223,8 +225,8 @@ module csr #(parameter
 | 
			
		||||
    .STATUS_MIE, .STATUS_SIE, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_TVM,
 | 
			
		||||
    .STATUS_FS, .BigEndianM);
 | 
			
		||||
 | 
			
		||||
  csrm  csrm(.clk, .reset, .InstrValidNotFlushedM, 
 | 
			
		||||
    .CSRMWriteM, .MTrapM, .CSRAdrM,
 | 
			
		||||
  csrm  csrm(.clk, .reset, 
 | 
			
		||||
    .UngatedCSRMWriteM, .CSRMWriteM, .MTrapM, .CSRAdrM,
 | 
			
		||||
    .NextEPCM, .NextCauseM, .NextMtvalM, .MSTATUS_REGW, .MSTATUSH_REGW,
 | 
			
		||||
    .CSRWriteValM, .CSRMReadValM, .MTVEC_REGW,
 | 
			
		||||
    .MEPC_REGW, .MCOUNTEREN_REGW, .MCOUNTINHIBIT_REGW, 
 | 
			
		||||
@ -234,7 +236,7 @@ module csr #(parameter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if (`S_SUPPORTED) begin:csrs
 | 
			
		||||
    csrs  csrs(.clk, .reset,  .InstrValidNotFlushedM,
 | 
			
		||||
    csrs  csrs(.clk, .reset,
 | 
			
		||||
      .CSRSWriteM, .STrapM, .CSRAdrM,
 | 
			
		||||
      .NextEPCM, .NextCauseM, .NextMtvalM, .SSTATUS_REGW, 
 | 
			
		||||
      .STATUS_TVM, .MCOUNTEREN_TM(MCOUNTEREN_REGW[1]),
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,6 @@ module csri #(parameter
 | 
			
		||||
  SIE = 12'h104,
 | 
			
		||||
  SIP = 12'h144) (
 | 
			
		||||
  input  logic              clk, reset, 
 | 
			
		||||
  input  logic              InstrValidNotFlushedM,
 | 
			
		||||
  input  logic              CSRMWriteM, CSRSWriteM,
 | 
			
		||||
  input  logic [`XLEN-1:0]  CSRWriteValM,
 | 
			
		||||
  input  logic [11:0]       CSRAdrM,
 | 
			
		||||
@ -50,10 +49,10 @@ module csri #(parameter
 | 
			
		||||
  logic                     STIP;
 | 
			
		||||
 | 
			
		||||
  // Interrupt Write Enables
 | 
			
		||||
  assign WriteMIPM = CSRMWriteM & (CSRAdrM == MIP) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMIEM = CSRMWriteM & (CSRAdrM == MIE) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSIPM = CSRSWriteM & (CSRAdrM == SIP) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSIEM = CSRSWriteM & (CSRAdrM == SIE) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMIPM = CSRMWriteM & (CSRAdrM == MIP);
 | 
			
		||||
  assign WriteMIEM = CSRMWriteM & (CSRAdrM == MIE);
 | 
			
		||||
  assign WriteSIPM = CSRSWriteM & (CSRAdrM == SIP);
 | 
			
		||||
  assign WriteSIEM = CSRSWriteM & (CSRAdrM == SIE);
 | 
			
		||||
 | 
			
		||||
  // Interrupt Pending and Enable Registers
 | 
			
		||||
  // MEIP, MTIP, MSIP are read-only
 | 
			
		||||
 | 
			
		||||
@ -73,8 +73,7 @@ module csrm #(parameter
 | 
			
		||||
  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                    UngatedCSRMWriteM, CSRMWriteM, MTrapM,
 | 
			
		||||
  input  logic [11:0]             CSRAdrM,
 | 
			
		||||
  input  logic [`XLEN-1:0]        NextEPCM, NextMtvalM, MSTATUS_REGW, MSTATUSH_REGW,
 | 
			
		||||
  input  logic [4:0]              NextCauseM,
 | 
			
		||||
@ -112,13 +111,13 @@ module csrm #(parameter
 | 
			
		||||
      else
 | 
			
		||||
        assign ADDRLocked[i] = PMPCFG_ARRAY_REGW[i][7] | (PMPCFG_ARRAY_REGW[i+1][7] & PMPCFG_ARRAY_REGW[i+1][4:3] == 2'b01);
 | 
			
		||||
      
 | 
			
		||||
      assign WritePMPADDRM[i] = (CSRMWriteM & (CSRAdrM == (PMPADDR0+i))) & InstrValidNotFlushedM & ~ADDRLocked[i];
 | 
			
		||||
      assign WritePMPADDRM[i] = (CSRMWriteM & (CSRAdrM == (PMPADDR0+i))) & ~ADDRLocked[i];
 | 
			
		||||
      flopenr #(`PA_BITS-2) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM[`PA_BITS-3:0], PMPADDR_ARRAY_REGW[i]);
 | 
			
		||||
      if (`XLEN==64) begin
 | 
			
		||||
        assign WritePMPCFGM[i] = (CSRMWriteM & (CSRAdrM == (PMPCFG0+2*(i/8)))) & InstrValidNotFlushedM & ~CFGLocked[i];
 | 
			
		||||
        assign WritePMPCFGM[i] = (CSRMWriteM & (CSRAdrM == (PMPCFG0+2*(i/8)))) & ~CFGLocked[i];
 | 
			
		||||
        flopenr #(8) PMPCFGreg(clk, reset, WritePMPCFGM[i], CSRWriteValM[(i%8)*8+7:(i%8)*8], PMPCFG_ARRAY_REGW[i]);
 | 
			
		||||
      end else begin
 | 
			
		||||
        assign WritePMPCFGM[i]  = (CSRMWriteM & (CSRAdrM == (PMPCFG0+i/4))) & InstrValidNotFlushedM & ~CFGLocked[i];
 | 
			
		||||
        assign WritePMPCFGM[i]  = (CSRMWriteM & (CSRAdrM == (PMPCFG0+i/4))) & ~CFGLocked[i];
 | 
			
		||||
        flopenr #(8) PMPCFGreg(clk, reset, WritePMPCFGM[i], CSRWriteValM[(i%4)*8+7:(i%4)*8], PMPCFG_ARRAY_REGW[i]);
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
@ -133,19 +132,19 @@ module csrm #(parameter
 | 
			
		||||
  assign MHARTID_REGW = 0;
 | 
			
		||||
 | 
			
		||||
  // Write machine Mode CSRs 
 | 
			
		||||
  assign WriteMSTATUSM = CSRMWriteM & (CSRAdrM == MSTATUS) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMSTATUSHM = CSRMWriteM & (CSRAdrM == MSTATUSH) & InstrValidNotFlushedM & (`XLEN==32);
 | 
			
		||||
  assign WriteMTVECM = CSRMWriteM & (CSRAdrM == MTVEC) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMEDELEGM = CSRMWriteM & (CSRAdrM == MEDELEG) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMIDELEGM = CSRMWriteM & (CSRAdrM == MIDELEG) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMSCRATCHM = CSRMWriteM & (CSRAdrM == MSCRATCH) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMEPCM = MTrapM | (CSRMWriteM & (CSRAdrM == MEPC)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMCAUSEM = MTrapM | (CSRMWriteM & (CSRAdrM == MCAUSE)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMTVALM = MTrapM | (CSRMWriteM & (CSRAdrM == MTVAL)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMCOUNTERENM = CSRMWriteM & (CSRAdrM == MCOUNTEREN) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMCOUNTINHIBITM = CSRMWriteM & (CSRAdrM == MCOUNTINHIBIT) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteMSTATUSM = CSRMWriteM & (CSRAdrM == MSTATUS);
 | 
			
		||||
  assign WriteMSTATUSHM = CSRMWriteM & (CSRAdrM == MSTATUSH)& (`XLEN==32);
 | 
			
		||||
  assign WriteMTVECM = CSRMWriteM & (CSRAdrM == MTVEC);
 | 
			
		||||
  assign WriteMEDELEGM = CSRMWriteM & (CSRAdrM == MEDELEG);
 | 
			
		||||
  assign WriteMIDELEGM = CSRMWriteM & (CSRAdrM == MIDELEG);
 | 
			
		||||
  assign WriteMSCRATCHM = CSRMWriteM & (CSRAdrM == MSCRATCH);
 | 
			
		||||
  assign WriteMEPCM = MTrapM | (CSRMWriteM & (CSRAdrM == MEPC));
 | 
			
		||||
  assign WriteMCAUSEM = MTrapM | (CSRMWriteM & (CSRAdrM == MCAUSE));
 | 
			
		||||
  assign WriteMTVALM = MTrapM | (CSRMWriteM & (CSRAdrM == MTVAL));
 | 
			
		||||
  assign WriteMCOUNTERENM = CSRMWriteM & (CSRAdrM == MCOUNTEREN);
 | 
			
		||||
  assign WriteMCOUNTINHIBITM = CSRMWriteM & (CSRAdrM == MCOUNTINHIBIT);
 | 
			
		||||
 | 
			
		||||
  assign IllegalCSRMWriteReadonlyM = CSRMWriteM & (CSRAdrM == MVENDORID | CSRAdrM == MARCHID | CSRAdrM == MIMPID | CSRAdrM == MHARTID);
 | 
			
		||||
  assign IllegalCSRMWriteReadonlyM = UngatedCSRMWriteM & (CSRAdrM == MVENDORID | CSRAdrM == MARCHID | CSRAdrM == MIMPID | CSRAdrM == MHARTID);
 | 
			
		||||
 | 
			
		||||
  // CSRs
 | 
			
		||||
  flopenr #(`XLEN) MTVECreg(clk, reset, WriteMTVECM, {CSRWriteValM[`XLEN-1:2], 1'b0, CSRWriteValM[0]}, MTVEC_REGW); 
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,6 @@ module csrs #(parameter
 | 
			
		||||
  STIMECMPH = 12'h15D,
 | 
			
		||||
  SATP = 12'h180) (
 | 
			
		||||
  input  logic             clk, reset, 
 | 
			
		||||
  input  logic             InstrValidNotFlushedM, 
 | 
			
		||||
  input  logic             CSRSWriteM, STrapM,
 | 
			
		||||
  input  logic [11:0]      CSRAdrM,
 | 
			
		||||
  input  logic [`XLEN-1:0] NextEPCM, NextMtvalM, SSTATUS_REGW, 
 | 
			
		||||
@ -77,17 +76,16 @@ module csrs #(parameter
 | 
			
		||||
  logic [63:0]             STIMECMP_REGW;
 | 
			
		||||
  
 | 
			
		||||
  // write enables
 | 
			
		||||
  // *** can InstrValidNotFlushed be factored out of all these writes into CSRWriteM?
 | 
			
		||||
  assign WriteSSTATUSM = CSRSWriteM & (CSRAdrM == SSTATUS)  & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSTVECM = CSRSWriteM & (CSRAdrM == STVEC) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSSCRATCHM = CSRSWriteM & (CSRAdrM == SSCRATCH) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSEPCM = STrapM | (CSRSWriteM & (CSRAdrM == SEPC)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSCAUSEM = STrapM | (CSRSWriteM & (CSRAdrM == SCAUSE)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSTVALM = STrapM | (CSRSWriteM & (CSRAdrM == STVAL)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSATPM = CSRSWriteM & (CSRAdrM == SATP) & (PrivilegeModeW == `M_MODE | ~STATUS_TVM) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSCOUNTERENM = CSRSWriteM & (CSRAdrM == SCOUNTEREN) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSTIMECMPM = CSRSWriteM & (CSRAdrM == STIMECMP) & (PrivilegeModeW == `M_MODE | MCOUNTEREN_TM) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSTIMECMPHM = CSRSWriteM & (CSRAdrM == STIMECMPH) & (PrivilegeModeW == `M_MODE | MCOUNTEREN_TM) & (`XLEN == 32) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteSSTATUSM = CSRSWriteM & (CSRAdrM == SSTATUS);
 | 
			
		||||
  assign WriteSTVECM = CSRSWriteM & (CSRAdrM == STVEC);
 | 
			
		||||
  assign WriteSSCRATCHM = CSRSWriteM & (CSRAdrM == SSCRATCH);
 | 
			
		||||
  assign WriteSEPCM = STrapM | (CSRSWriteM & (CSRAdrM == SEPC));
 | 
			
		||||
  assign WriteSCAUSEM = STrapM | (CSRSWriteM & (CSRAdrM == SCAUSE));
 | 
			
		||||
  assign WriteSTVALM = STrapM | (CSRSWriteM & (CSRAdrM == STVAL));
 | 
			
		||||
  assign WriteSATPM = CSRSWriteM & (CSRAdrM == SATP) & (PrivilegeModeW == `M_MODE | ~STATUS_TVM);
 | 
			
		||||
  assign WriteSCOUNTERENM = CSRSWriteM & (CSRAdrM == SCOUNTEREN);
 | 
			
		||||
  assign WriteSTIMECMPM = CSRSWriteM & (CSRAdrM == STIMECMP) & (PrivilegeModeW == `M_MODE | MCOUNTEREN_TM);
 | 
			
		||||
  assign WriteSTIMECMPHM = CSRSWriteM & (CSRAdrM == STIMECMPH) & (PrivilegeModeW == `M_MODE | MCOUNTEREN_TM) & (`XLEN == 32);
 | 
			
		||||
 | 
			
		||||
  // CSRs
 | 
			
		||||
  flopenr #(`XLEN) STVECreg(clk, reset, WriteSTVECM, {CSRWriteValM[`XLEN-1:2], 1'b0, CSRWriteValM[0]}, STVEC_REGW); 
 | 
			
		||||
 | 
			
		||||
@ -51,9 +51,8 @@ module csru #(parameter
 | 
			
		||||
  logic                    SetOrWriteFFLAGSM;
 | 
			
		||||
  
 | 
			
		||||
  // Write enables
 | 
			
		||||
  //assign WriteFCSRM = CSRUWriteM & (CSRAdrM == FCSR)  & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteFRMM = (CSRUWriteM & (STATUS_FS != 2'b00) & (CSRAdrM == FRM | CSRAdrM == FCSR))  & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteFFLAGSM = (CSRUWriteM & (STATUS_FS != 2'b00) & (CSRAdrM == FFLAGS | CSRAdrM == FCSR)) & InstrValidNotFlushedM;
 | 
			
		||||
  assign WriteFRMM =    CSRUWriteM & (STATUS_FS != 2'b00) & (CSRAdrM == FRM | CSRAdrM == FCSR);
 | 
			
		||||
  assign WriteFFLAGSM = CSRUWriteM & (STATUS_FS != 2'b00) & (CSRAdrM == FFLAGS | CSRAdrM == FCSR);
 | 
			
		||||
 | 
			
		||||
  // Write Values
 | 
			
		||||
  assign NextFRMM = (CSRAdrM == FCSR) ? CSRWriteValM[7:5] : CSRWriteValM[2:0];
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user