forked from Github_Repos/cvw
		
	Merge branch 'main' of https://github.com/openhwgroup/cvw
This commit is contained in:
		
						commit
						17f80285ca
					
				@ -114,6 +114,8 @@ module controller(
 | 
				
			|||||||
  logic        SFenceVmaD;                     // sfence.vma instruction
 | 
					  logic        SFenceVmaD;                     // sfence.vma instruction
 | 
				
			||||||
  logic        IntDivM;                        // Integer divide instruction
 | 
					  logic        IntDivM;                        // Integer divide instruction
 | 
				
			||||||
  logic        IFunctD, RFunctD, MFunctD;      // Detect I, R, and M-type RV32IM/Rv64IM instructions
 | 
					  logic        IFunctD, RFunctD, MFunctD;      // Detect I, R, and M-type RV32IM/Rv64IM instructions
 | 
				
			||||||
 | 
					  logic        LFunctD, SFunctD, BFunctD;      // Detect load, store, branch instructions
 | 
				
			||||||
 | 
					  logic        JFunctD;                        // detect jalr instruction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Extract fields
 | 
					  // Extract fields
 | 
				
			||||||
  assign OpD = InstrD[6:0];
 | 
					  assign OpD = InstrD[6:0];
 | 
				
			||||||
@ -125,28 +127,43 @@ module controller(
 | 
				
			|||||||
  // Be rigorous about detecting illegal instructions if CSRs or bit manipulation is supported
 | 
					  // Be rigorous about detecting illegal instructions if CSRs or bit manipulation is supported
 | 
				
			||||||
  // otherwise be cheap
 | 
					  // otherwise be cheap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (`ZICSR_SUPPORTED | `ZBA_SUPPORTED | `ZBB_SUPPORTED | `ZBC_SUPPORTED | `ZBS_SUPPORTED) begin // Exact integer decoding
 | 
					  if (`ZICSR_SUPPORTED | `ZBA_SUPPORTED | `ZBB_SUPPORTED | `ZBC_SUPPORTED | `ZBS_SUPPORTED) begin:legalcheck // Exact integer decoding
 | 
				
			||||||
    logic Funct7ZeroD, Funct7b5D, IShiftD, INoShiftD;
 | 
					    logic Funct7ZeroD, Funct7b5D, IShiftD, INoShiftD;
 | 
				
			||||||
 | 
					    logic Funct7ShiftZeroD, Funct7Shiftb5D;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assign Funct7ZeroD = (Funct7D == 7'b0000000); // most R-type instructions
 | 
					    assign Funct7ZeroD = (Funct7D == 7'b0000000); // most R-type instructions
 | 
				
			||||||
    assign Funct7b5D   = (Funct7D == 7'b0100000); // srai, sub
 | 
					    assign Funct7b5D   = (Funct7D == 7'b0100000); // srai, sub
 | 
				
			||||||
    assign IShiftD     = (Funct3D == 3'b001 & Funct7ZeroD) | (Funct3D == 3'b101 & (Funct7ZeroD | Funct7b5D)); // slli, srli, srai, or w forms
 | 
					    assign Funct7ShiftZeroD = (`XLEN==64) ? (Funct7D[6:1] == 6'b000000) : Funct7ZeroD;
 | 
				
			||||||
    assign INoShiftD   = (Funct3D != 3'b001 & Funct3D != 3'b101);
 | 
					    assign Funct7Shiftb5D   = (`XLEN==64) ? (Funct7D[6:1] == 6'b010000) : Funct7b5D;
 | 
				
			||||||
 | 
					    assign IShiftD     = (Funct3D == 3'b001 & Funct7ShiftZeroD) | (Funct3D == 3'b101 & (Funct7ShiftZeroD | Funct7Shiftb5D)); // slli, srli, srai, or w forms
 | 
				
			||||||
 | 
					    assign INoShiftD   = ((Funct3D != 3'b001) & (Funct3D != 3'b101));
 | 
				
			||||||
    assign IFunctD     = IShiftD | INoShiftD;
 | 
					    assign IFunctD     = IShiftD | INoShiftD;
 | 
				
			||||||
    assign RFunctD     = ((Funct3D == 3'b000 | Funct3D == 3'b101) & Funct7b5D) | Funct7ZeroD;
 | 
					    assign RFunctD     = ((Funct3D == 3'b000 | Funct3D == 3'b101) & Funct7b5D) | Funct7ZeroD;
 | 
				
			||||||
    assign MFunctD     = (Funct7D == 7'b0000001) & (`M_SUPPORTED | (`ZMMUL_SUPPORTED & ~Funct3D[2])); // muldiv
 | 
					    assign MFunctD     = (Funct7D == 7'b0000001) & (`M_SUPPORTED | (`ZMMUL_SUPPORTED & ~Funct3D[2])); // muldiv
 | 
				
			||||||
  end else begin 
 | 
					    assign LFunctD     = Funct3D == 3'b000 | Funct3D == 3'b001 | Funct3D == 3'b010 | Funct3D == 3'b100 | Funct3D == 3'b101 | 
 | 
				
			||||||
 | 
					                         ((`XLEN == 64) & (Funct3D == 3'b011 | Funct3D == 3'b110));
 | 
				
			||||||
 | 
					    assign SFunctD     = Funct3D == 3'b000 | Funct3D == 3'b001 | Funct3D == 3'b010 | 
 | 
				
			||||||
 | 
					                         ((`XLEN == 64) & (Funct3D == 3'b011));
 | 
				
			||||||
 | 
					    assign BFunctD     = (Funct3D[2:1] != 2'b01); // legal branches
 | 
				
			||||||
 | 
					    assign JFunctD     = (Funct3D == 3'b000);
 | 
				
			||||||
 | 
					  end else begin:legalcheck2
 | 
				
			||||||
    assign IFunctD     = 1; // Don't bother to separate out shift decoding
 | 
					    assign IFunctD     = 1; // Don't bother to separate out shift decoding
 | 
				
			||||||
    assign RFunctD     = ~Funct7D[0]; // Not a multiply
 | 
					    assign RFunctD     = ~Funct7D[0]; // Not a multiply
 | 
				
			||||||
    assign MFunctD     = Funct7D[0] & (`M_SUPPORTED | (`ZMMUL_SUPPORTED & ~Funct3D[2])); // muldiv
 | 
					    assign MFunctD     = Funct7D[0] & (`M_SUPPORTED | (`ZMMUL_SUPPORTED & ~Funct3D[2])); // muldiv
 | 
				
			||||||
 | 
					    assign LFunctD     = 1; // don't bother to check Funct3 for loads
 | 
				
			||||||
 | 
					    assign SFunctD     = 1; // don't bother to check Funct3 for stores
 | 
				
			||||||
 | 
					    assign BFunctD     = 1; // don't bother to check Funct3 for branches
 | 
				
			||||||
 | 
					    assign JFunctD     = 1; // don't bother to check Funct3 for jumps    
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Main Instruction Decoder
 | 
					  // Main Instruction Decoder
 | 
				
			||||||
  always_comb
 | 
					  /* verilator lint_off CASEINCOMPLETE */
 | 
				
			||||||
 | 
					  always_comb begin
 | 
				
			||||||
 | 
					    ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // default: Illegal instruction
 | 
				
			||||||
    case(OpD)
 | 
					    case(OpD)
 | 
				
			||||||
    // RegWrite_ImmSrc_ALUSrc_MemRW_ResultSrc_Branch_ALUOp_Jump_ALUResultSrc_W64_CSRRead_Privileged_Fence_MDU_Atomic_Illegal
 | 
					    // RegWrite_ImmSrc_ALUSrc_MemRW_ResultSrc_Branch_ALUOp_Jump_ALUResultSrc_W64_CSRRead_Privileged_Fence_MDU_Atomic_Illegal
 | 
				
			||||||
      7'b0000000:     ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // Illegal instruction
 | 
					     7'b0000011: if (LFunctD) 
 | 
				
			||||||
      7'b0000011:     ControlsD = `CTRLW'b1_000_01_10_001_0_0_0_0_0_0_0_0_0_00_0; // lw
 | 
					                      ControlsD = `CTRLW'b1_000_01_10_001_0_0_0_0_0_0_0_0_0_00_0; // loads
 | 
				
			||||||
      7'b0000111:     ControlsD = `CTRLW'b0_000_01_10_001_0_0_0_0_0_0_0_0_0_00_1; // flw - only legal if FP supported
 | 
					      7'b0000111:     ControlsD = `CTRLW'b0_000_01_10_001_0_0_0_0_0_0_0_0_0_00_1; // flw - only legal if FP supported
 | 
				
			||||||
      7'b0001111: if (`ZIFENCEI_SUPPORTED)
 | 
					      7'b0001111: if (`ZIFENCEI_SUPPORTED)
 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_1_0_00_0; // fence
 | 
					                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_1_0_00_0; // fence
 | 
				
			||||||
@ -154,14 +171,11 @@ module controller(
 | 
				
			|||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_0; // fence treated as nop
 | 
					                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_0; // fence treated as nop
 | 
				
			||||||
      7'b0010011: if (IFunctD)    
 | 
					      7'b0010011: if (IFunctD)    
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_01_00_000_0_1_0_0_0_0_0_0_0_00_0; // I-type ALU
 | 
					                      ControlsD = `CTRLW'b1_000_01_00_000_0_1_0_0_0_0_0_0_0_00_0; // I-type ALU
 | 
				
			||||||
                  else
 | 
					 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // Non-implemented instruction
 | 
					 | 
				
			||||||
      7'b0010111:     ControlsD = `CTRLW'b1_100_11_00_000_0_0_0_0_0_0_0_0_0_00_0; // auipc
 | 
					      7'b0010111:     ControlsD = `CTRLW'b1_100_11_00_000_0_0_0_0_0_0_0_0_0_00_0; // auipc
 | 
				
			||||||
      7'b0011011: if (IFunctD & `XLEN == 64)
 | 
					      7'b0011011: if (IFunctD & `XLEN == 64)
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_01_00_000_0_1_0_0_1_0_0_0_0_00_0; // IW-type ALU for RV64i
 | 
					                      ControlsD = `CTRLW'b1_000_01_00_000_0_1_0_0_1_0_0_0_0_00_0; // IW-type ALU for RV64i
 | 
				
			||||||
                  else
 | 
					      7'b0100011: if (SFunctD) 
 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // Non-implemented instruction
 | 
					                      ControlsD = `CTRLW'b0_001_01_01_000_0_0_0_0_0_0_0_0_0_00_0; // stores
 | 
				
			||||||
      7'b0100011:     ControlsD = `CTRLW'b0_001_01_01_000_0_0_0_0_0_0_0_0_0_00_0; // sw
 | 
					 | 
				
			||||||
      7'b0100111:     ControlsD = `CTRLW'b0_001_01_01_000_0_0_0_0_0_0_0_0_0_00_1; // fsw - only legal if FP supported
 | 
					      7'b0100111:     ControlsD = `CTRLW'b0_001_01_01_000_0_0_0_0_0_0_0_0_0_00_1; // fsw - only legal if FP supported
 | 
				
			||||||
      7'b0101111: if (`A_SUPPORTED) begin
 | 
					      7'b0101111: if (`A_SUPPORTED) begin
 | 
				
			||||||
                    if (InstrD[31:27] == 5'b00010)
 | 
					                    if (InstrD[31:27] == 5'b00010)
 | 
				
			||||||
@ -170,33 +184,30 @@ module controller(
 | 
				
			|||||||
                      ControlsD = `CTRLW'b1_101_01_01_100_0_0_0_0_0_0_0_0_0_01_0; // sc
 | 
					                      ControlsD = `CTRLW'b1_101_01_01_100_0_0_0_0_0_0_0_0_0_01_0; // sc
 | 
				
			||||||
                    else 
 | 
					                    else 
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_101_01_11_001_0_0_0_0_0_0_0_0_0_10_0; // amo
 | 
					                      ControlsD = `CTRLW'b1_101_01_11_001_0_0_0_0_0_0_0_0_0_10_0; // amo
 | 
				
			||||||
                  end else
 | 
					                 end
 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // Non-implemented instruction
 | 
					 | 
				
			||||||
      7'b0110011: if (RFunctD)
 | 
					      7'b0110011: if (RFunctD)
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_00_00_000_0_1_0_0_0_0_0_0_0_00_0; // R-type 
 | 
					                      ControlsD = `CTRLW'b1_000_00_00_000_0_1_0_0_0_0_0_0_0_00_0; // R-type 
 | 
				
			||||||
                  else if (MFunctD)
 | 
					                  else if (MFunctD)
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_00_00_011_0_0_0_0_0_0_0_0_1_00_0; // Multiply/divide
 | 
					                      ControlsD = `CTRLW'b1_000_00_00_011_0_0_0_0_0_0_0_0_1_00_0; // Multiply/divide
 | 
				
			||||||
                  else
 | 
					 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // Non-implemented instruction
 | 
					 | 
				
			||||||
      7'b0110111:     ControlsD = `CTRLW'b1_100_01_00_000_0_0_0_1_0_0_0_0_0_00_0; // lui
 | 
					      7'b0110111:     ControlsD = `CTRLW'b1_100_01_00_000_0_0_0_1_0_0_0_0_0_00_0; // lui
 | 
				
			||||||
      7'b0111011: if (RFunctD & (`XLEN == 64))
 | 
					      7'b0111011: if (RFunctD & (`XLEN == 64))
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_00_00_000_0_1_0_0_1_0_0_0_0_00_0; // R-type W instructions for RV64i
 | 
					                      ControlsD = `CTRLW'b1_000_00_00_000_0_1_0_0_1_0_0_0_0_00_0; // R-type W instructions for RV64i
 | 
				
			||||||
                  else if (MFunctD & (`XLEN == 64))
 | 
					                  else if (MFunctD & (`XLEN == 64))
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_00_00_011_0_0_0_0_1_0_0_0_1_00_0; // W-type Multiply/Divide
 | 
					                      ControlsD = `CTRLW'b1_000_00_00_011_0_0_0_0_1_0_0_0_1_00_0; // W-type Multiply/Divide
 | 
				
			||||||
                  else
 | 
					      7'b1100011: if (BFunctD)   
 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // Non-implemented instruction
 | 
					                      ControlsD = `CTRLW'b0_010_11_00_000_1_0_0_0_0_0_0_0_0_00_0; // branches
 | 
				
			||||||
      7'b1100011:     ControlsD = `CTRLW'b0_010_11_00_000_1_0_0_0_0_0_0_0_0_00_0; // branches
 | 
					      7'b1100111: if (JFunctD)
 | 
				
			||||||
      7'b1100111:     ControlsD = `CTRLW'b1_000_01_00_000_0_0_1_1_0_0_0_0_0_00_0; // jalr
 | 
					                      ControlsD = `CTRLW'b1_000_01_00_000_0_0_1_1_0_0_0_0_0_00_0; // jalr
 | 
				
			||||||
      7'b1101111:     ControlsD = `CTRLW'b1_011_11_00_000_0_0_1_1_0_0_0_0_0_00_0; // jal
 | 
					      7'b1101111:     ControlsD = `CTRLW'b1_011_11_00_000_0_0_1_1_0_0_0_0_0_00_0; // jal
 | 
				
			||||||
      7'b1110011: if (`ZICSR_SUPPORTED) begin
 | 
					      7'b1110011: if (`ZICSR_SUPPORTED) begin
 | 
				
			||||||
                   if (Funct3D == 3'b000)
 | 
					                   if (Funct3D == 3'b000)
 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_1_0_0_00_0; // privileged; decoded further in priveleged modules
 | 
					                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_1_0_0_00_0; // privileged; decoded further in priveleged modules
 | 
				
			||||||
                   else
 | 
					                   else
 | 
				
			||||||
                      ControlsD = `CTRLW'b1_000_00_00_010_0_0_0_0_0_1_0_0_0_00_0; // csrs
 | 
					                      ControlsD = `CTRLW'b1_000_00_00_010_0_0_0_0_0_1_0_0_0_00_0; // csrs
 | 
				
			||||||
                  end else
 | 
					                  end
 | 
				
			||||||
                      ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // non-implemented instruction
 | 
					 | 
				
			||||||
      default:        ControlsD = `CTRLW'b0_000_00_00_000_0_0_0_0_0_0_0_0_0_00_1; // non-implemented instruction
 | 
					 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  /* verilator lint_on CASEINCOMPLETE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Unswizzle control bits
 | 
					  // Unswizzle control bits
 | 
				
			||||||
  // Squash control signals if coming from an illegal compressed instruction
 | 
					  // Squash control signals if coming from an illegal compressed instruction
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user