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
					
				
							
								
								
									
										215
									
								
								src/fpu/fctrl.sv
									
									
									
									
									
								
							
							
						
						
									
										215
									
								
								src/fpu/fctrl.sv
									
									
									
									
									
								
							@ -90,118 +90,119 @@ module fctrl (
 | 
			
		||||
                         (Fmt2 == 2'b10 & `ZFH_SUPPORTED) | (Fmt2 == 2'b11 & `Q_SUPPORTED));
 | 
			
		||||
 | 
			
		||||
  // decode the instruction                       
 | 
			
		||||
   // ControlsD: FRegWrite_FWriteInt_FResSel_PostProcSel_FOpCtrl_FDivStart_IllegalFPUInstr_FCvtInt
 | 
			
		||||
   always_comb
 | 
			
		||||
  // 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
 | 
			
		||||
    else begin 
 | 
			
		||||
      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)
 | 
			
		||||
                    3'b010:                      ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flw
 | 
			
		||||
                    3'b011:  if (`D_SUPPORTED)   ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // fld
 | 
			
		||||
                    3'b100:  if (`Q_SUPPORTED)   ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flq
 | 
			
		||||
                    3'b001:  if (`ZFH_SUPPORTED) ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flh
 | 
			
		||||
                  endcase
 | 
			
		||||
      7'b0100111: case(Funct3D)
 | 
			
		||||
                    3'b010:                      ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsw
 | 
			
		||||
                    3'b011:  if (`D_SUPPORTED)   ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsd
 | 
			
		||||
                    3'b100:  if (`Q_SUPPORTED)   ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsq
 | 
			
		||||
                    3'b001:  if (`ZFH_SUPPORTED) ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsh
 | 
			
		||||
                  endcase
 | 
			
		||||
      7'b1000011:   ControlsD = `FCTRLW'b1_0_01_10_000_0_0_0; // fmadd
 | 
			
		||||
      7'b1000111:   ControlsD = `FCTRLW'b1_0_01_10_001_0_0_0; // fmsub
 | 
			
		||||
      7'b1001011:   ControlsD = `FCTRLW'b1_0_01_10_010_0_0_0; // fnmsub
 | 
			
		||||
      7'b1001111:   ControlsD = `FCTRLW'b1_0_01_10_011_0_0_0; // fnmadd
 | 
			
		||||
      7'b1010011: casez(Funct7D)
 | 
			
		||||
                    7'b00000??: ControlsD = `FCTRLW'b1_0_01_10_110_0_0_0; // fadd
 | 
			
		||||
                    7'b00001??: ControlsD = `FCTRLW'b1_0_01_10_111_0_0_0; // fsub
 | 
			
		||||
                    7'b00010??: ControlsD = `FCTRLW'b1_0_01_10_100_0_0_0; // fmul
 | 
			
		||||
                    7'b00011??: ControlsD = `FCTRLW'b1_0_01_01_xx0_1_0_0; // fdiv
 | 
			
		||||
                    7'b01011??: if (Rs2D == 5'b0000) ControlsD = `FCTRLW'b1_0_01_01_xx1_1_0_0; // fsqrt
 | 
			
		||||
                    7'b00100??: case(Funct3D)
 | 
			
		||||
                                  3'b000:  ControlsD = `FCTRLW'b1_0_00_xx_000_0_0_0; // fsgnj
 | 
			
		||||
                                  3'b001:  ControlsD = `FCTRLW'b1_0_00_xx_001_0_0_0; // fsgnjn
 | 
			
		||||
                                  3'b010:  ControlsD = `FCTRLW'b1_0_00_xx_010_0_0_0; // fsgnjx
 | 
			
		||||
                               endcase
 | 
			
		||||
                    7'b00101??: case(Funct3D)
 | 
			
		||||
                                  3'b000:  ControlsD = `FCTRLW'b1_0_00_xx_110_0_0_0; // fmin
 | 
			
		||||
                                  3'b001:  ControlsD = `FCTRLW'b1_0_00_xx_101_0_0_0; // fmax
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b10100??: case(Funct3D)
 | 
			
		||||
                                  3'b010:  ControlsD = `FCTRLW'b0_1_00_xx_010_0_0_0; // feq
 | 
			
		||||
                                  3'b001:  ControlsD = `FCTRLW'b0_1_00_xx_001_0_0_0; // flt
 | 
			
		||||
                                  3'b000:  ControlsD = `FCTRLW'b0_1_00_xx_011_0_0_0; // fle
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b11100??: if (Funct3D == 3'b001 & Rs2D == 5'b00000)          
 | 
			
		||||
                                               ControlsD = `FCTRLW'b0_1_10_xx_000_0_0_0; // fclass
 | 
			
		||||
                                else if (Funct3D == 3'b000 & Rs2D == 5'b00000) 
 | 
			
		||||
                                               ControlsD = `FCTRLW'b0_1_11_xx_000_0_0_0; // fmv.x.w / fmv.x.d to int register
 | 
			
		||||
                    7'b111100?: if (Funct3D == 3'b000 & Rs2D == 5'b00000) 
 | 
			
		||||
                                               ControlsD = `FCTRLW'b1_0_00_xx_011_0_0_0; // fmv.w.x / fmv.d.x   to fp reg
 | 
			
		||||
                    7'b0100000: if (Rs2D[4:2] == 3'b000 & SupportedFmt2 & Rs2D[1:0] != 2'b00)
 | 
			
		||||
                                               ControlsD = `FCTRLW'b1_0_01_00_000_0_0_0; // fcvt.s.(d/q/h)
 | 
			
		||||
                    7'b0100001: if (Rs2D[4:2] == 3'b000  & SupportedFmt2 & Rs2D[1:0] != 2'b01)
 | 
			
		||||
                                               ControlsD = `FCTRLW'b1_0_01_00_001_0_0_0; // fcvt.d.(s/h/q)
 | 
			
		||||
                    7'b0100010: if (Rs2D[4:2] == 3'b000 & SupportedFmt2 & Rs2D[1:0] != 2'b10)
 | 
			
		||||
                                               ControlsD = `FCTRLW'b1_0_01_00_010_0_0_0; // fcvt.h.(s/d/q)
 | 
			
		||||
                    7'b0100011: if (Rs2D[4:2] == 3'b000  & SupportedFmt2 & Rs2D[1:0] != 2'b11)
 | 
			
		||||
                                               ControlsD = `FCTRLW'b1_0_01_00_011_0_0_0; // fcvt.q.(s/h/d)
 | 
			
		||||
                   7'b1101000: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.s.w   w->s
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.s.wu wu->s
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.s.l   l->s
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.s.lu lu->s
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1100000: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.s   s->w
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.s  s->wu
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.s   s->l
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.s  s->lu
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1101001: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.d.w   w->d
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.d.wu wu->d
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.d.l   l->d
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.d.lu lu->d
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1100001: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.d   d->w
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.d  d->wu
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.d   d->l
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.d  d->lu
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1101010: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.h.w   w->h
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.h.wu wu->h
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.h.l   l->h
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.h.lu lu->h
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1100010: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.h   h->w
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.h  h->wu
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.h   h->l
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.h  h->lu
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1101011: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.q.w   w->q
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.q.wu wu->q
 | 
			
		||||
                                  5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.q.l   l->q
 | 
			
		||||
                                  5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.q.lu lu->q
 | 
			
		||||
                                endcase
 | 
			
		||||
                    7'b1100011: case(Rs2D)
 | 
			
		||||
                                  5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.q   q->w
 | 
			
		||||
                                  5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.q  q->wu
 | 
			
		||||
                                  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
 | 
			
		||||
        7'b0000111: case(Funct3D)
 | 
			
		||||
                      3'b010:                      ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flw
 | 
			
		||||
                      3'b011:  if (`D_SUPPORTED)   ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // fld
 | 
			
		||||
                      3'b100:  if (`Q_SUPPORTED)   ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flq
 | 
			
		||||
                      3'b001:  if (`ZFH_SUPPORTED) ControlsD = `FCTRLW'b1_0_10_xx_0xx_0_0_0; // flh
 | 
			
		||||
                    endcase
 | 
			
		||||
        7'b0100111: case(Funct3D)
 | 
			
		||||
                      3'b010:                      ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsw
 | 
			
		||||
                      3'b011:  if (`D_SUPPORTED)   ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsd
 | 
			
		||||
                      3'b100:  if (`Q_SUPPORTED)   ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsq
 | 
			
		||||
                      3'b001:  if (`ZFH_SUPPORTED) ControlsD = `FCTRLW'b0_0_10_xx_0xx_0_0_0; // fsh
 | 
			
		||||
                    endcase
 | 
			
		||||
        7'b1000011:   ControlsD = `FCTRLW'b1_0_01_10_000_0_0_0; // fmadd
 | 
			
		||||
        7'b1000111:   ControlsD = `FCTRLW'b1_0_01_10_001_0_0_0; // fmsub
 | 
			
		||||
        7'b1001011:   ControlsD = `FCTRLW'b1_0_01_10_010_0_0_0; // fnmsub
 | 
			
		||||
        7'b1001111:   ControlsD = `FCTRLW'b1_0_01_10_011_0_0_0; // fnmadd
 | 
			
		||||
        7'b1010011: casez(Funct7D)
 | 
			
		||||
                      7'b00000??: ControlsD = `FCTRLW'b1_0_01_10_110_0_0_0; // fadd
 | 
			
		||||
                      7'b00001??: ControlsD = `FCTRLW'b1_0_01_10_111_0_0_0; // fsub
 | 
			
		||||
                      7'b00010??: ControlsD = `FCTRLW'b1_0_01_10_100_0_0_0; // fmul
 | 
			
		||||
                      7'b00011??: ControlsD = `FCTRLW'b1_0_01_01_xx0_1_0_0; // fdiv
 | 
			
		||||
                      7'b01011??: if (Rs2D == 5'b0000) ControlsD = `FCTRLW'b1_0_01_01_xx1_1_0_0; // fsqrt
 | 
			
		||||
                      7'b00100??: case(Funct3D)
 | 
			
		||||
                                    3'b000:  ControlsD = `FCTRLW'b1_0_00_xx_000_0_0_0; // fsgnj
 | 
			
		||||
                                    3'b001:  ControlsD = `FCTRLW'b1_0_00_xx_001_0_0_0; // fsgnjn
 | 
			
		||||
                                    3'b010:  ControlsD = `FCTRLW'b1_0_00_xx_010_0_0_0; // fsgnjx
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b00101??: case(Funct3D)
 | 
			
		||||
                                    3'b000:  ControlsD = `FCTRLW'b1_0_00_xx_110_0_0_0; // fmin
 | 
			
		||||
                                    3'b001:  ControlsD = `FCTRLW'b1_0_00_xx_101_0_0_0; // fmax
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b10100??: case(Funct3D)
 | 
			
		||||
                                    3'b010:  ControlsD = `FCTRLW'b0_1_00_xx_010_0_0_0; // feq
 | 
			
		||||
                                    3'b001:  ControlsD = `FCTRLW'b0_1_00_xx_001_0_0_0; // flt
 | 
			
		||||
                                    3'b000:  ControlsD = `FCTRLW'b0_1_00_xx_011_0_0_0; // fle
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b11100??: if (Funct3D == 3'b001 & Rs2D == 5'b00000)          
 | 
			
		||||
                                                ControlsD = `FCTRLW'b0_1_10_xx_000_0_0_0; // fclass
 | 
			
		||||
                                  else if (Funct3D == 3'b000 & Rs2D == 5'b00000) 
 | 
			
		||||
                                                ControlsD = `FCTRLW'b0_1_11_xx_000_0_0_0; // fmv.x.w / fmv.x.d to int register
 | 
			
		||||
                      7'b111100?: if (Funct3D == 3'b000 & Rs2D == 5'b00000) 
 | 
			
		||||
                                                ControlsD = `FCTRLW'b1_0_00_xx_011_0_0_0; // fmv.w.x / fmv.d.x   to fp reg
 | 
			
		||||
                      7'b0100000: if (Rs2D[4:2] == 3'b000 & SupportedFmt2 & Rs2D[1:0] != 2'b00)
 | 
			
		||||
                                                ControlsD = `FCTRLW'b1_0_01_00_000_0_0_0; // fcvt.s.(d/q/h)
 | 
			
		||||
                      7'b0100001: if (Rs2D[4:2] == 3'b000  & SupportedFmt2 & Rs2D[1:0] != 2'b01)
 | 
			
		||||
                                                ControlsD = `FCTRLW'b1_0_01_00_001_0_0_0; // fcvt.d.(s/h/q)
 | 
			
		||||
                      7'b0100010: if (Rs2D[4:2] == 3'b000 & SupportedFmt2 & Rs2D[1:0] != 2'b10)
 | 
			
		||||
                                                ControlsD = `FCTRLW'b1_0_01_00_010_0_0_0; // fcvt.h.(s/d/q)
 | 
			
		||||
                      7'b0100011: if (Rs2D[4:2] == 3'b000  & SupportedFmt2 & Rs2D[1:0] != 2'b11)
 | 
			
		||||
                                                ControlsD = `FCTRLW'b1_0_01_00_011_0_0_0; // fcvt.q.(s/h/d)
 | 
			
		||||
                      7'b1101000: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.s.w   w->s
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.s.wu wu->s
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.s.l   l->s
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.s.lu lu->s
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1100000: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.s   s->w
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.s  s->wu
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.s   s->l
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.s  s->lu
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1101001: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.d.w   w->d
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.d.wu wu->d
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.d.l   l->d
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.d.lu lu->d
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1100001: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.d   d->w
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.d  d->wu
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.d   d->l
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.d  d->lu
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1101010: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.h.w   w->h
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.h.wu wu->h
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.h.l   l->h
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.h.lu lu->h
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1100010: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.h   h->w
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.h  h->wu
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b0_1_01_00_011_0_0_1; // fcvt.l.h   h->l
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b0_1_01_00_010_0_0_1; // fcvt.lu.h  h->lu
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1101011: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b1_0_01_00_101_0_0_0; // fcvt.q.w   w->q
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b1_0_01_00_100_0_0_0; // fcvt.q.wu wu->q
 | 
			
		||||
                                    5'b00010:    ControlsD = `FCTRLW'b1_0_01_00_111_0_0_0; // fcvt.q.l   l->q
 | 
			
		||||
                                    5'b00011:    ControlsD = `FCTRLW'b1_0_01_00_110_0_0_0; // fcvt.q.lu lu->q
 | 
			
		||||
                                  endcase
 | 
			
		||||
                      7'b1100011: case(Rs2D)
 | 
			
		||||
                                    5'b00000:    ControlsD = `FCTRLW'b0_1_01_00_001_0_0_1; // fcvt.w.q   q->w
 | 
			
		||||
                                    5'b00001:    ControlsD = `FCTRLW'b0_1_01_00_000_0_0_1; // fcvt.wu.q  q->wu
 | 
			
		||||
                                    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;
 | 
			
		||||
@ -327,7 +328,5 @@ module fctrl (
 | 
			
		||||
  flopenrc #(4)  MWCtrlReg(clk, reset, FlushW, ~StallW,
 | 
			
		||||
          {FRegWriteM, FResSelM, FCvtIntM},
 | 
			
		||||
          {FRegWriteW, FResSelW, FCvtIntW});
 | 
			
		||||
  
 | 
			
		||||
  //assign FCvtIntW = (FResSelW == 2'b01);
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 
 | 
			
		||||
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