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
						2e4ca4c876
					
				| @ -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