forked from Github_Repos/cvw
		
	B DONE (for now)
- datapath passes along comparator flag to alu - controllers and zbb handle min/max instructions
This commit is contained in:
		
							parent
							
								
									888f4318bc
								
							
						
					
					
						commit
						2069d92f9e
					
				@ -36,6 +36,7 @@ module alu #(parameter WIDTH=32) (
 | 
			
		||||
  input  logic [3:0]       BSelect,    // One-Hot encoding of if it's a ZBA_ZBB_ZBC_ZBS instruction
 | 
			
		||||
  input  logic [2:0]       ZBBSelect,  // ZBB mux select signal
 | 
			
		||||
  input  logic [2:0]       Funct3,     // With ALUControl, indicates operation to perform NOTE: Change signal name to ALUSelect
 | 
			
		||||
  input  logic [1:0]       CompFlags,  // Comparator flags
 | 
			
		||||
  output logic [WIDTH-1:0] Result,     // ALU result
 | 
			
		||||
  output logic [WIDTH-1:0] Sum);       // Sum of operands
 | 
			
		||||
 | 
			
		||||
@ -145,7 +146,7 @@ module alu #(parameter WIDTH=32) (
 | 
			
		||||
  end else assign ZBCResult = 0;
 | 
			
		||||
 | 
			
		||||
  if (`ZBB_SUPPORTED) begin: zbb
 | 
			
		||||
    zbb #(WIDTH) ZBB(.A(A), .B(B), .ALUResult(ALUResult), .W64(W64), .ZBBSelect(ZBBSelect), .ZBBResult(ZBBResult));
 | 
			
		||||
    zbb #(WIDTH) ZBB(.A(A), .B(B), .ALUResult(ALUResult), .W64(W64), .lt(CompFlags[0]), .ZBBSelect(ZBBSelect), .ZBBResult(ZBBResult));
 | 
			
		||||
  end else assign ZBBResult = 0;
 | 
			
		||||
  
 | 
			
		||||
  // Final Result B instruction select mux
 | 
			
		||||
 | 
			
		||||
@ -141,6 +141,10 @@ module bmuctrl(
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000;  // illegal instruction
 | 
			
		||||
      17'b0010011_0010100_101:   BMUControlsD = `BMUCTRLW'b000_0100_011;  // orc.b
 | 
			
		||||
      17'b0110011_0000101_110:   BMUControlsD = `BMUCTRLW'b000_0100_101;  // max
 | 
			
		||||
      17'b0110011_0000101_111:   BMUControlsD = `BMUCTRLW'b000_0100_101;  // maxu
 | 
			
		||||
      17'b0110011_0000101_100:   BMUControlsD = `BMUCTRLW'b000_0100_110;  // min
 | 
			
		||||
      17'b0110011_0000101_101:   BMUControlsD = `BMUCTRLW'b000_0100_110;  // minu
 | 
			
		||||
                                 
 | 
			
		||||
      default:                   BMUControlsD = {Funct3D, {7'b0}};        // not B instruction or shift
 | 
			
		||||
    endcase
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,7 @@ module zbb #(parameter WIDTH=32) (
 | 
			
		||||
  input  logic [WIDTH-1:0] A, B,         // Operands
 | 
			
		||||
  input  logic [WIDTH-1:0] ALUResult,    // ALU Result
 | 
			
		||||
  input  logic             W64,          // Indicates word operation
 | 
			
		||||
  input  logic             lt,           // lt flag
 | 
			
		||||
  input  logic [2:0]       ZBBSelect,    // Indicates word operation
 | 
			
		||||
  output logic [WIDTH-1:0] ZBBResult);   // ZBB result
 | 
			
		||||
 | 
			
		||||
@ -41,6 +42,10 @@ module zbb #(parameter WIDTH=32) (
 | 
			
		||||
  
 | 
			
		||||
  // count result
 | 
			
		||||
  logic [WIDTH-1:0] CntResult;           
 | 
			
		||||
  
 | 
			
		||||
  // min,max result
 | 
			
		||||
  logic [WIDTH-1:0] MaxResult;           
 | 
			
		||||
  logic [WIDTH-1:0] MinResult;           
 | 
			
		||||
 | 
			
		||||
  // byte results
 | 
			
		||||
  logic [WIDTH-1:0] ByteResult;
 | 
			
		||||
@ -52,6 +57,10 @@ module zbb #(parameter WIDTH=32) (
 | 
			
		||||
  byteUnit #(WIDTH) bu(.A(A), .B(B), .ByteResult(ByteResult));
 | 
			
		||||
  ext #(WIDTH) ext(.A(A), .B(B), .ExtResult(ExtResult));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  assign MaxResult = (lt) ? B : A;
 | 
			
		||||
  assign MinResult = (lt) ? A : B;
 | 
			
		||||
 | 
			
		||||
  //can replace with structural mux by looking at bit 4 in rs2 field
 | 
			
		||||
  always_comb begin 
 | 
			
		||||
      case (ZBBSelect)
 | 
			
		||||
@ -59,6 +68,8 @@ module zbb #(parameter WIDTH=32) (
 | 
			
		||||
      3'b000: ZBBResult = CntResult;  // count
 | 
			
		||||
      3'b100: ZBBResult = ExtResult;  // sign/zero extend
 | 
			
		||||
      3'b011: ZBBResult = ByteResult; // byte instructions
 | 
			
		||||
      3'b110: ZBBResult = MinResult;  // min, minu
 | 
			
		||||
      3'b101: ZBBResult = MaxResult;  // max, maxu 
 | 
			
		||||
      /*15'b0010100_101_00111: ZBBResult = OrcBResult;
 | 
			
		||||
      15'b0110100_101_11000: ZBBResult = Rev8Result;
 | 
			
		||||
      15'b0110101_101_11000: ZBBResult = Rev8Result;
 | 
			
		||||
 | 
			
		||||
@ -108,6 +108,7 @@ module controller(
 | 
			
		||||
  logic        subD, sraD, sltD, sltuD;        // Indicates if is one of these instructions
 | 
			
		||||
  logic        bclrD, bextD;                   // Indicates if is one of these instructions
 | 
			
		||||
  logic        andnD, ornD, xnorD;             // Indicates if is one of these instructions
 | 
			
		||||
  logic        maxE, maxuE, minE, minuE;       // Indicates if is one of these instructions in Execute Stage
 | 
			
		||||
  logic        BranchTakenE;                   // Branch is taken
 | 
			
		||||
  logic        eqE, ltE;                       // Comparator outputs
 | 
			
		||||
  logic        unused; 
 | 
			
		||||
@ -216,10 +217,19 @@ module controller(
 | 
			
		||||
    assign andnD = (ALUSelectD == 3'b111 & BSelectD[2]);
 | 
			
		||||
    assign ornD = (ALUSelectD == 3'b110 & BSelectD[2]);
 | 
			
		||||
    assign xnorD = (ALUSelectD == 3'b100 & BSelectD[2]);
 | 
			
		||||
    // we only need these signals if we want to calculate a signedD flag in decode stage to pass to the comparator.
 | 
			
		||||
    assign maxE = (Funct3E[1:0] == 2'b10 & BSelectE[2]);
 | 
			
		||||
    assign maxuE = (Funct3E[1:0] == 2'b11 & BSelectE[2]);
 | 
			
		||||
    assign minE = (Funct3E[1:0] == 2'b00 & BSelectE[2]);
 | 
			
		||||
    assign minuE = (Funct3E[1:0] == 2'b01 & BSelectE[2]);
 | 
			
		||||
  end else begin
 | 
			
		||||
    assign andnD = 0;
 | 
			
		||||
    assign ornD = 0;
 | 
			
		||||
    assign xnorD = 0;
 | 
			
		||||
    assign maxE = 0;
 | 
			
		||||
    assign maxuE = 0;
 | 
			
		||||
    assign minE = 0;
 | 
			
		||||
    assign minuE = 0;
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  // ALU Decoding is lazy, only using func7[5] to distinguish add/sub and srl/sra
 | 
			
		||||
@ -263,7 +273,8 @@ module controller(
 | 
			
		||||
  // Branch Logic
 | 
			
		||||
  //  The comparator handles both signed and unsigned branches using BranchSignedE
 | 
			
		||||
  //  Hence, only eq and lt flags are needed
 | 
			
		||||
  assign BranchSignedE = ~(Funct3E[2:1] == 2'b11);
 | 
			
		||||
  assign BranchSignedE = (~(Funct3E[2:1] == 2'b11) & ~BSelectE[2]) | (`ZBB_SUPPORTED & (maxE | minE)) ;
 | 
			
		||||
  //assign BranchSignedE = ~(Funct3E[2:1] == 2'b11);
 | 
			
		||||
  assign {eqE, ltE} = FlagsE;
 | 
			
		||||
  mux2 #(1) branchflagmux(eqE, ltE, Funct3E[2], BranchFlagE);
 | 
			
		||||
  assign BranchTakenE = BranchFlagE ^ Funct3E[0];
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,7 @@ module datapath (
 | 
			
		||||
  comparator #(`XLEN) comp(ForwardedSrcAE, ForwardedSrcBE, BranchSignedE, FlagsE);
 | 
			
		||||
  mux2  #(`XLEN)  srcamux(ForwardedSrcAE, PCE, ALUSrcAE, SrcAE);
 | 
			
		||||
  mux2  #(`XLEN)  srcbmux(ForwardedSrcBE, ImmExtE, ALUSrcBE, SrcBE);
 | 
			
		||||
  alu   #(`XLEN)  alu(SrcAE, SrcBE, ALUControlE, ALUSelectE, BSelectE, ZBBSelectE, Funct3E, ALUResultE, IEUAdrE);
 | 
			
		||||
  alu   #(`XLEN)  alu(SrcAE, SrcBE, ALUControlE, ALUSelectE, BSelectE, ZBBSelectE, Funct3E, FlagsE, ALUResultE, IEUAdrE);
 | 
			
		||||
  mux2 #(`XLEN)   altresultmux(ImmExtE, PCLinkE, JumpE, AltResultE);
 | 
			
		||||
  mux2 #(`XLEN)   ieuresultmux(ALUResultE, AltResultE, ALUResultSrcE, IEUResultE);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user