mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge pull request #895 from davidharrishmc/dev
Fix Issue 894 about floating-point decoding of reserved rm/frm
This commit is contained in:
		
						commit
						6496454054
					
				@ -81,6 +81,7 @@ module fctrl import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
  logic [1:0]                  Fmt, Fmt2;                          // format - before possible reduction
 | 
			
		||||
  logic                        SupportedFmt;                       // is the format supported
 | 
			
		||||
  logic                        SupportedFmt2;                      // is the source format supported for fp -> fp
 | 
			
		||||
  logic                        SupportedRM;                        // is the rounding mode supported
 | 
			
		||||
  logic                        FCvtIntD, FCvtIntM;                 // convert to integer operation
 | 
			
		||||
  logic                        ZfaD;                               // Zfa variants of instructions
 | 
			
		||||
  logic                        ZfaFRoundNXD;                       // Zfa froundnx instruction
 | 
			
		||||
@ -93,14 +94,19 @@ module fctrl import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
                         (Fmt == 2'b10 & P.ZFH_SUPPORTED)  | (Fmt == 2'b11 & P.Q_SUPPORTED));
 | 
			
		||||
  assign SupportedFmt2 = (Fmt2 == 2'b00 | (Fmt2 == 2'b01 & P.D_SUPPORTED) |
 | 
			
		||||
                         (Fmt2 == 2'b10 & P.ZFH_SUPPORTED) | (Fmt2 == 2'b11 & P.Q_SUPPORTED));
 | 
			
		||||
 | 
			
		||||
  // rounding modes 5 and 6 are reserved.  Rounding mode 7 is dynamic, and is reserved if FRM is 5, 6, or 7
 | 
			
		||||
  assign SupportedRM =  ~(Funct3D == 3'b101 | Funct3D == 3'b110 | (Funct3D == 3'b111 & (FRM_REGW == 3'b101 | FRM_REGW == 3'b110 | FRM_REGW == 3'b111))) |
 | 
			
		||||
                         (OpD == 7'b1010011 & Funct3D == 3'b101 & Funct7D[6:2] == 5'b10100 & P.ZFA_SUPPORTED); // Zfa fltq has a funny rounding mode
 | 
			
		||||
  /*assign SupportedRM =  ~(Funct3D == 3'b101 | Funct3D == 3'b110 | (Funct3D == 3'b111 & (FRM_REGW == 3'b101 | FRM_REGW == 3'b110 | FRM_REGW == 3'b111))) |
 | 
			
		||||
                          (OpD == 7'b1010011 & P.ZFA_SUPPORTED);
 | 
			
		||||
*/
 | 
			
		||||
  // decode the instruction                       
 | 
			
		||||
  // FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt_Zfa_FroundNX
 | 
			
		||||
  always_comb
 | 
			
		||||
    if (STATUS_FS == 2'b00) // FPU instructions are illegal when FPU is disabled
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0;
 | 
			
		||||
    else if (OpD != 7'b0000111 & OpD != 7'b0100111 & ~SupportedFmt) 
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // for anything other than loads and stores, check for supported format
 | 
			
		||||
    else if (OpD != 7'b0000111 & OpD != 7'b0100111 & (~SupportedFmt | ~SupportedRM)) 
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // for anything other than loads and stores, check for supported format and rounding mode
 | 
			
		||||
    else begin 
 | 
			
		||||
      ControlsD = `FCTRLW'b0_0_00_00_000_0_1_0_0_0; // default: non-implemented instruction
 | 
			
		||||
      /* verilator lint_off CASEINCOMPLETE */   // default value above has priority so no other default needed
 | 
			
		||||
 | 
			
		||||
@ -238,7 +238,7 @@ module bmuctrl import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
    
 | 
			
		||||
    if ((P.ZKND_SUPPORTED | P.ZKNE_SUPPORTED) & P.XLEN == 64) begin // ZKND and ZKNE shared instructions
 | 
			
		||||
      casez({OpD, Funct7D, Funct3D})
 | 
			
		||||
        17'b0010011_0011000_001: if (Rs2D[4] == 1'b1)
 | 
			
		||||
        17'b0010011_0011000_001: if (Rs2D[4] == 1'b1 & $unsigned(Rs2D[3:0]) <= 10)
 | 
			
		||||
                                   BMUControlsD = `BMUCTRLW'b000_0111_0010_1_0_0_0_1_0_0_0_0_0;  // aes64ks1i - key schedule istr1
 | 
			
		||||
          17'b0110011_0111111_000: BMUControlsD = `BMUCTRLW'b000_0111_0011_1_0_0_0_1_0_0_0_0_0;  // aes64ks2 - key schedule istr2
 | 
			
		||||
      endcase
 | 
			
		||||
 | 
			
		||||
@ -106,7 +106,10 @@ module csrm  import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
  genvar i;
 | 
			
		||||
  if (P.PMP_ENTRIES > 0) begin:pmp
 | 
			
		||||
    logic [P.PMP_ENTRIES-1:0] WritePMPCFGM;
 | 
			
		||||
    logic [P.PMP_ENTRIES-1:0] WritePMPADDRM ; 
 | 
			
		||||
    logic [P.PMP_ENTRIES-1:0] WritePMPADDRM; 
 | 
			
		||||
    logic [7:0]               CSRPMPWriteValM[P.PMP_ENTRIES-1:0];
 | 
			
		||||
    logic [7:0]               CSRPMPLegalizedWriteValM[P.PMP_ENTRIES-1:0];
 | 
			
		||||
    logic [1:0]               CSRPMPWRLegalizedWriteValM[P.PMP_ENTRIES-1:0]; 
 | 
			
		||||
    logic [P.PMP_ENTRIES-1:0] ADDRLocked, CFGLocked;
 | 
			
		||||
    for(i=0; i<P.PMP_ENTRIES; i++) begin
 | 
			
		||||
      // when the lock bit is set, don't allow writes to the PMPCFG or PMPADDR
 | 
			
		||||
@ -121,11 +124,15 @@ module csrm  import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
      flopenr #(P.PA_BITS-2) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM[P.PA_BITS-3:0], PMPADDR_ARRAY_REGW[i]);
 | 
			
		||||
      if (P.XLEN==64) begin
 | 
			
		||||
        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]);
 | 
			
		||||
        assign CSRPMPWriteValM[i] = CSRWriteValM[(i%8)*8+7:(i%8)*8];
 | 
			
		||||
      end else begin
 | 
			
		||||
        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]);
 | 
			
		||||
        assign CSRPMPWriteValM[i] = CSRWriteValM[(i%4)*8+7:(i%4)*8];
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      assign CSRPMPWRLegalizedWriteValM[i] = {(CSRPMPWriteValM[i][1] & CSRPMPWriteValM[i][0]), CSRPMPWriteValM[i][0]}; // legalize WR fields (reserved 10 written as 00)
 | 
			
		||||
      assign CSRPMPLegalizedWriteValM[i] = {CSRPMPWriteValM[i][7], 2'b00, CSRPMPWriteValM[i][4:2], CSRPMPWRLegalizedWriteValM[i]};
 | 
			
		||||
      flopenr #(8) PMPCFGreg(clk, reset, WritePMPCFGM[i], CSRPMPWriteValM[i], PMPCFG_ARRAY_REGW[i]);
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user