forked from Github_Repos/cvw
		
	Rotate signal now gets generated in bmu ctrl
This commit is contained in:
		
							parent
							
								
									18ab538a5e
								
							
						
					
					
						commit
						6e52113208
					
				@ -37,6 +37,7 @@ module alu #(parameter WIDTH=32) (
 | 
			
		||||
  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
 | 
			
		||||
  input  logic             Rotate,     // Perform Rotate Operation
 | 
			
		||||
  output logic [WIDTH-1:0] ALUResult,     // ALU result
 | 
			
		||||
  output logic [WIDTH-1:0] Sum);       // Sum of operands
 | 
			
		||||
 | 
			
		||||
@ -53,7 +54,6 @@ module alu #(parameter WIDTH=32) (
 | 
			
		||||
  logic             SubArith;                                                               // Performing subtraction or arithmetic right shift
 | 
			
		||||
  logic             ALUOp;                                                                  // 0 for address generation addition or 1 for regular ALU ops
 | 
			
		||||
  logic             Asign, Bsign;                                                           // Sign bits of A, B
 | 
			
		||||
  logic             Rotate;
 | 
			
		||||
  logic [WIDTH:0]   shA;                                                                    // XLEN+1 bit input source to shifter
 | 
			
		||||
  logic [WIDTH-1:0] rotA;                                                                   // XLEN bit input source to shifter
 | 
			
		||||
  logic [1:0]       shASelect;                                                              // select signal for shifter source generation mux 
 | 
			
		||||
@ -98,10 +98,6 @@ module alu #(parameter WIDTH=32) (
 | 
			
		||||
      endcase
 | 
			
		||||
  end else assign CondShiftA = A;
 | 
			
		||||
 | 
			
		||||
  if (`ZBB_SUPPORTED) begin: rotatelogic
 | 
			
		||||
    assign Rotate = BSelect[2] & (ALUSelect == 3'b001); //NOTE: Do we want to move this logic into the Decode Stage?
 | 
			
		||||
  end else assign Rotate = 1'b0;
 | 
			
		||||
 | 
			
		||||
  // Addition
 | 
			
		||||
  assign CondInvB = SubArith ? ~CondMaskB : CondMaskB;
 | 
			
		||||
  assign {Carry, Sum} = CondShiftA + CondInvB + {{(WIDTH-1){1'b0}}, SubArith};
 | 
			
		||||
 | 
			
		||||
@ -49,7 +49,8 @@ module bmuctrl(
 | 
			
		||||
  output logic [3:0]  BSelectE,                // Indicates if ZBA_ZBB_ZBC_ZBS instruction in one-hot encoding
 | 
			
		||||
  output logic [2:0]  ZBBSelectE,              // ZBB mux select signal
 | 
			
		||||
  output logic        BRegWriteE,              // Indicates if it is a R type B instruction in Execute
 | 
			
		||||
  output logic        BComparatorSignedE       // Indicates if comparator signed in Execute Stage
 | 
			
		||||
  output logic        BComparatorSignedE,      // Indicates if comparator signed in Execute Stage
 | 
			
		||||
  output logic        RotateE                  // Indiciates if rotate instruction in Execute Stage
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  logic [6:0] OpD;                             // Opcode in Decode stage
 | 
			
		||||
@ -57,8 +58,9 @@ module bmuctrl(
 | 
			
		||||
  logic [6:0] Funct7D;                         // Funct7 field in Decode stage
 | 
			
		||||
  logic [4:0] Rs2D;                            // Rs2 source register in Decode stage
 | 
			
		||||
  logic       BComparatorSignedD;              // Indicates if comparator signed (max, min instruction) in Decode Stage
 | 
			
		||||
  logic       RotateD;                         // Indicates if rotate instruction in Decode Stage
 | 
			
		||||
 | 
			
		||||
  `define BMUCTRLW 15
 | 
			
		||||
  `define BMUCTRLW 16
 | 
			
		||||
 | 
			
		||||
  logic [`BMUCTRLW-1:0] BMUControlsD;                 // Main B Instructions Decoder control signals
 | 
			
		||||
 | 
			
		||||
@ -72,93 +74,92 @@ module bmuctrl(
 | 
			
		||||
  // Main Instruction Decoder
 | 
			
		||||
  always_comb
 | 
			
		||||
    casez({OpD, Funct7D, Funct3D})
 | 
			
		||||
    // ALUSelect_BSelect_ZBBSelect_BRegWrite_BW64_BALUOp_BSubArithD_IllegalBitmanipInstrD
 | 
			
		||||
    // ALUSelect_BSelect_ZBBSelect_BRegWrite_BW64_BALUOp_BSubArithD_RotateD_IllegalBitmanipInstrD
 | 
			
		||||
      // ZBS
 | 
			
		||||
      17'b0010011_0100100_001:   BMUControlsD = `BMUCTRLW'b111_0001_000_1_0_1_1_0;  // bclri
 | 
			
		||||
      17'b0010011_0100100_001:   BMUControlsD = `BMUCTRLW'b111_0001_000_1_0_1_1_0_0;  // bclri
 | 
			
		||||
      17'b0010011_0100101_001: if (`XLEN == 64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b111_0001_000_1_0_1_1_0;  // bclri (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b111_0001_000_1_0_1_1_0_0;  // bclri (rv64)
 | 
			
		||||
                               else
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0100100_101:   BMUControlsD = `BMUCTRLW'b101_0001_000_1_0_1_1_0;  // bexti
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0100100_101:   BMUControlsD = `BMUCTRLW'b101_0001_000_1_0_1_1_0_0;  // bexti
 | 
			
		||||
      17'b0010011_0100101_101: if (`XLEN == 64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b101_0001_000_1_0_1_1_0;  // bexti (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b101_0001_000_1_0_1_1_0_0;  // bexti (rv64)
 | 
			
		||||
                               else
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0110100_001:   BMUControlsD = `BMUCTRLW'b100_0001_000_1_0_1_0_0;  // binvi
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0110100_001:   BMUControlsD = `BMUCTRLW'b100_0001_000_1_0_1_0_0_0;  // binvi
 | 
			
		||||
      17'b0010011_0110101_001: if (`XLEN == 64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b100_0001_000_1_0_1_0_0;  // binvi (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b100_0001_000_1_0_1_0_0_0;  // binvi (rv64)
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0010100_001:   BMUControlsD = `BMUCTRLW'b110_0001_000_1_0_1_0_0;  // bseti
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0010100_001:   BMUControlsD = `BMUCTRLW'b110_0001_000_1_0_1_0_0_0;  // bseti
 | 
			
		||||
      17'b0010011_0010101_001: if (`XLEN == 64) 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b110_0001_000_1_0_1_0_0;  // bseti (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b110_0001_000_1_0_1_0_0_0;  // bseti (rv64)
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0110011_0100100_001:   BMUControlsD = `BMUCTRLW'b111_0001_000_1_0_1_1_0;  // bclr
 | 
			
		||||
      17'b0110011_0100100_101:   BMUControlsD = `BMUCTRLW'b101_0001_000_1_0_1_1_0;  // bext
 | 
			
		||||
      17'b0110011_0110100_001:   BMUControlsD = `BMUCTRLW'b100_0001_000_1_0_1_0_0;  // binv
 | 
			
		||||
      17'b0110011_0010100_001:   BMUControlsD = `BMUCTRLW'b110_0001_000_1_0_1_0_0;  // bset
 | 
			
		||||
      17'b0?1?011_0?0000?_?01:   BMUControlsD = `BMUCTRLW'b001_0000_000_1_0_1_0_0;  // sra, srai, srl, srli, sll, slli
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0110011_0100100_001:   BMUControlsD = `BMUCTRLW'b111_0001_000_1_0_1_1_0_0;  // bclr
 | 
			
		||||
      17'b0110011_0100100_101:   BMUControlsD = `BMUCTRLW'b101_0001_000_1_0_1_1_0_0;  // bext
 | 
			
		||||
      17'b0110011_0110100_001:   BMUControlsD = `BMUCTRLW'b100_0001_000_1_0_1_0_0_0;  // binv
 | 
			
		||||
      17'b0110011_0010100_001:   BMUControlsD = `BMUCTRLW'b110_0001_000_1_0_1_0_0_0;  // bset
 | 
			
		||||
      17'b0?1?011_0?0000?_?01:   BMUControlsD = `BMUCTRLW'b001_0000_000_1_0_1_0_0_0;  // sra, srai, srl, srli, sll, slli
 | 
			
		||||
      // ZBC
 | 
			
		||||
      17'b0110011_0000101_0??:   BMUControlsD = `BMUCTRLW'b000_0010_000_1_0_1_0_0;  // ZBC instruction
 | 
			
		||||
      17'b0110011_0000101_0??:   BMUControlsD = `BMUCTRLW'b000_0010_000_1_0_1_0_0_0;  // ZBC instruction
 | 
			
		||||
      // ZBA
 | 
			
		||||
      17'b0110011_0010000_010:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_0_1_0_0;  // sh1add
 | 
			
		||||
      17'b0110011_0010000_100:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_0_1_0_0;  // sh2add
 | 
			
		||||
      17'b0110011_0010000_110:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_0_1_0_0;  // sh3add
 | 
			
		||||
      17'b0111011_0010000_010:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0;  // sh1add.uw
 | 
			
		||||
      17'b0111011_0010000_100:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0;  // sh2add.uw
 | 
			
		||||
      17'b0111011_0010000_110:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0;  // sh3add.uw
 | 
			
		||||
      17'b0111011_0000100_000:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0;  // add.uw
 | 
			
		||||
      17'b0011011_000010?_001:   BMUControlsD = `BMUCTRLW'b001_1000_000_1_1_1_0_0;  // slli.uw
 | 
			
		||||
      17'b0110011_0010000_010:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_0_1_0_0_0;  // sh1add
 | 
			
		||||
      17'b0110011_0010000_100:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_0_1_0_0_0;  // sh2add
 | 
			
		||||
      17'b0110011_0010000_110:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_0_1_0_0_0;  // sh3add
 | 
			
		||||
      17'b0111011_0010000_010:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0_0;  // sh1add.uw
 | 
			
		||||
      17'b0111011_0010000_100:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0_0;  // sh2add.uw
 | 
			
		||||
      17'b0111011_0010000_110:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0_0;  // sh3add.uw
 | 
			
		||||
      17'b0111011_0000100_000:   BMUControlsD = `BMUCTRLW'b000_1000_000_1_1_1_0_0_0;  // add.uw
 | 
			
		||||
      17'b0011011_000010?_001:   BMUControlsD = `BMUCTRLW'b001_1000_000_1_1_1_0_0_0;  // slli.uw
 | 
			
		||||
      // ZBB
 | 
			
		||||
      17'b0110011_0110000_001:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_0;  // rol
 | 
			
		||||
      17'b0111011_0110000_001:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_1_1_0_0;  // rolw
 | 
			
		||||
      17'b0110011_0110000_101:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_0;  // ror
 | 
			
		||||
      17'b0111011_0110000_101:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_1_1_0_0;  // rorw
 | 
			
		||||
      17'b0010011_0110000_101:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_0;  // rori (rv32)
 | 
			
		||||
      17'b0110011_0110000_001:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_1_0;  // rol
 | 
			
		||||
      17'b0111011_0110000_001:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_1_1_0_1_0;  // rolw
 | 
			
		||||
      17'b0110011_0110000_101:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_1_0;  // ror
 | 
			
		||||
      17'b0111011_0110000_101:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_1_1_0_1_0;  // rorw
 | 
			
		||||
      17'b0010011_0110000_101:   BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_1_0;  // rori (rv32)
 | 
			
		||||
      17'b0010011_0110001_101: if (`XLEN == 64) 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_0;  // rori (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b001_0100_111_1_0_1_0_1_0;  // rori (rv64)
 | 
			
		||||
                               else
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0011011_0110000_101: if (`XLEN == 64) 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b001_0100_111_1_1_1_0_0;  // roriw 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b001_0100_111_1_1_1_0_1_0;  // roriw 
 | 
			
		||||
                               else
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0110000_001: if (Rs2D[2])
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_100_1_0_1_0_0;  // sign extend instruction
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_100_1_0_1_0_0_0;  // sign extend instruction
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_000_1_0_1_0_0;  // count instruction
 | 
			
		||||
      17'b0011011_0110000_001:   BMUControlsD = `BMUCTRLW'b000_0100_000_1_1_1_0_0;  // count word instruction
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_000_1_0_1_0_0_0;  // count instruction
 | 
			
		||||
      17'b0011011_0110000_001:   BMUControlsD = `BMUCTRLW'b000_0100_000_1_1_1_0_0_0;  // count word instruction
 | 
			
		||||
      17'b0111011_0000100_100: if (`XLEN == 64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_100_1_0_1_0_0;  // zexth (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_100_1_0_1_0_0_0;  // zexth (rv64)
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0110011_0000100_100: if (`XLEN == 32)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_100_1_0_1_0_0;  // zexth (rv32)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_100_1_0_1_0_0_0;  // zexth (rv32)
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0110011_0100000_111:   BMUControlsD = `BMUCTRLW'b111_0100_111_1_0_1_1_0;  // andn
 | 
			
		||||
      17'b0110011_0100000_110:   BMUControlsD = `BMUCTRLW'b110_0100_111_1_0_1_1_0;  // orn
 | 
			
		||||
      17'b0110011_0100000_100:   BMUControlsD = `BMUCTRLW'b100_0100_111_1_0_1_1_0;  // xnor
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0110011_0100000_111:   BMUControlsD = `BMUCTRLW'b111_0100_111_1_0_1_1_0_0;  // andn
 | 
			
		||||
      17'b0110011_0100000_110:   BMUControlsD = `BMUCTRLW'b110_0100_111_1_0_1_1_0_0;  // orn
 | 
			
		||||
      17'b0110011_0100000_100:   BMUControlsD = `BMUCTRLW'b100_0100_111_1_0_1_1_0_0;  // xnor
 | 
			
		||||
      17'b0010011_0110101_101: if (`XLEN == 64) 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_011_1_0_1_0_0;  // rev8 (rv64)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_011_1_0_1_0_0_0;  // rev8 (rv64)
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0110100_101: if (`XLEN == 32) 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_011_1_0_1_0_0;  // rev8 (rv32)
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0100_011_1_0_1_0_0_0;  // rev8 (rv32)
 | 
			
		||||
                               else 
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0010100_101:   BMUControlsD = `BMUCTRLW'b000_0100_011_1_0_1_0_0;  // orc.b
 | 
			
		||||
      17'b0110011_0000101_110:   BMUControlsD = `BMUCTRLW'b000_0100_101_1_0_1_0_0;  // max
 | 
			
		||||
      17'b0110011_0000101_111:   BMUControlsD = `BMUCTRLW'b000_0100_101_1_0_1_0_0;  // maxu
 | 
			
		||||
      17'b0110011_0000101_100:   BMUControlsD = `BMUCTRLW'b000_0100_110_1_0_1_0_0;  // min
 | 
			
		||||
      17'b0110011_0000101_101:   BMUControlsD = `BMUCTRLW'b000_0100_110_1_0_1_0_0;  // minu
 | 
			
		||||
                                 
 | 
			
		||||
      default:                   BMUControlsD = {Funct3D, {11'b0}, {1'b1}};        // not B instruction or shift
 | 
			
		||||
                                 BMUControlsD = `BMUCTRLW'b000_0000_000_0_0_0_0_0_1;  // illegal instruction
 | 
			
		||||
      17'b0010011_0010100_101:   BMUControlsD = `BMUCTRLW'b000_0100_011_1_0_1_0_0_0;  // orc.b
 | 
			
		||||
      17'b0110011_0000101_110:   BMUControlsD = `BMUCTRLW'b000_0100_101_1_0_1_0_0_0;  // max
 | 
			
		||||
      17'b0110011_0000101_111:   BMUControlsD = `BMUCTRLW'b000_0100_101_1_0_1_0_0_0;  // maxu
 | 
			
		||||
      17'b0110011_0000101_100:   BMUControlsD = `BMUCTRLW'b000_0100_110_1_0_1_0_0_0;  // min
 | 
			
		||||
      17'b0110011_0000101_101:   BMUControlsD = `BMUCTRLW'b000_0100_110_1_0_1_0_0_0;  // minu
 | 
			
		||||
      default:                   BMUControlsD = {Funct3D, {12'b0}, {1'b1}};        // not B instruction or shift
 | 
			
		||||
    endcase
 | 
			
		||||
 | 
			
		||||
  // Unpack Control Signals
 | 
			
		||||
  assign {ALUSelectD,BSelectD,ZBBSelectD, BRegWriteD, BW64D, BALUOpD, BSubArithD, IllegalBitmanipInstrD} = BMUControlsD;
 | 
			
		||||
  assign {ALUSelectD,BSelectD,ZBBSelectD, BRegWriteD, BW64D, BALUOpD, BSubArithD, RotateD, IllegalBitmanipInstrD} = BMUControlsD;
 | 
			
		||||
 | 
			
		||||
  // Comparator should perform signed comparison when min/max instruction. We have overlap in funct3 with some branch instructions so we use opcode to differentiate betwen min/max and branches
 | 
			
		||||
  assign BComparatorSignedD = (Funct3D[2]^Funct3D[0]) & ~OpD[6];
 | 
			
		||||
@ -166,5 +167,5 @@ module bmuctrl(
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
  // BMU Execute stage pipieline control register
 | 
			
		||||
  flopenrc#(12) controlregBMU(clk, reset, FlushE, ~StallE, {ALUSelectD, BSelectD, ZBBSelectD, BRegWriteD, BComparatorSignedD}, {ALUSelectE, BSelectE, ZBBSelectE, BRegWriteE, BComparatorSignedE});
 | 
			
		||||
  flopenrc#(13) controlregBMU(clk, reset, FlushE, ~StallE, {ALUSelectD, BSelectD, ZBBSelectD, BRegWriteD, BComparatorSignedD, RotateD}, {ALUSelectE, BSelectE, ZBBSelectE, BRegWriteE, BComparatorSignedE, RotateE});
 | 
			
		||||
endmodule
 | 
			
		||||
@ -60,6 +60,7 @@ module controller(
 | 
			
		||||
  output logic        BranchSignedE,           // Branch comparison operands are signed (if it's a branch)
 | 
			
		||||
  output logic [3:0]  BSelectE,                // One-Hot encoding of if it's ZBA_ZBB_ZBC_ZBS instruction
 | 
			
		||||
  output logic [2:0]  ZBBSelectE,              // ZBB mux select signal in Execute stage
 | 
			
		||||
  output logic        RotateE,                 // Indicates if rotate instruction in Execute Stage
 | 
			
		||||
  // Memory stage control signals
 | 
			
		||||
  input  logic        StallM, FlushM,          // Stall, flush Memory stage
 | 
			
		||||
  output logic [1:0]  MemRWM,                  // Mem read/write: MemRWM[1] = 1 for read, MemRWM[0] = 1 for write 
 | 
			
		||||
@ -130,7 +131,6 @@ module controller(
 | 
			
		||||
  logic        BSubArithD;                     // TRUE for B-type ext, clr, andn, orn, xnor
 | 
			
		||||
  logic        BComparatorSignedE;             // Indicates if max, min (signed comarison) instruction in Execute Stage
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Extract fields
 | 
			
		||||
  assign OpD = InstrD[6:0];
 | 
			
		||||
  assign Funct3D = InstrD[14:12];
 | 
			
		||||
@ -213,9 +213,6 @@ module controller(
 | 
			
		||||
  assign SFenceVmaD = PrivilegedD & (InstrD[31:25] ==  7'b0001001);
 | 
			
		||||
  assign FenceD = SFenceVmaD | FenceXD; // possible sfence.vma or fence.i
 | 
			
		||||
  
 | 
			
		||||
  //NOTE: Move the B conditional logic into bctrl
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // ALU Decoding is lazy, only using func7[5] to distinguish add/sub and srl/sra
 | 
			
		||||
  assign sltuD = (Funct3D == 3'b011); 
 | 
			
		||||
@ -226,7 +223,7 @@ module controller(
 | 
			
		||||
 | 
			
		||||
  // BITMANIP Configuration Block
 | 
			
		||||
  if (`ZBS_SUPPORTED | `ZBA_SUPPORTED | `ZBB_SUPPORTED | `ZBC_SUPPORTED) begin: bitmanipi //change the conditional expression to OR any Z supported flags
 | 
			
		||||
    bmuctrl bmuctrl(.clk, .reset, .StallD, .FlushD, .InstrD, .ALUSelectD, .BSelectD, .ZBBSelectD, .BRegWriteD, .BW64D, .BALUOpD, .BSubArithD, .IllegalBitmanipInstrD, .StallE, .FlushE, .ALUSelectE, .BSelectE, .ZBBSelectE, .BRegWriteE, .BComparatorSignedE);
 | 
			
		||||
    bmuctrl bmuctrl(.clk, .reset, .StallD, .FlushD, .InstrD, .ALUSelectD, .BSelectD, .ZBBSelectD, .BRegWriteD, .BW64D, .BALUOpD, .BSubArithD, .IllegalBitmanipInstrD, .StallE, .FlushE, .ALUSelectE, .BSelectE, .ZBBSelectE, .BRegWriteE, .BComparatorSignedE, .RotateE);
 | 
			
		||||
    if (`ZBA_SUPPORTED) begin
 | 
			
		||||
      // ALU Decoding is more comprehensive when ZBA is supported. slt and slti conflicts with sh1add, sh1add.uw
 | 
			
		||||
      assign sltD = (Funct3D == 3'b010 & (~(Funct7D[4]) | ~OpD[5])) ;
 | 
			
		||||
@ -245,6 +242,7 @@ module controller(
 | 
			
		||||
    assign BRegWriteE = 1'b0;
 | 
			
		||||
    assign BSubArithD = 1'b0;
 | 
			
		||||
    assign BComparatorSignedE = 1'b0;
 | 
			
		||||
    assign RotateE = 1'b0;
 | 
			
		||||
 | 
			
		||||
    assign sltD = (Funct3D == 3'b010);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,7 @@ module datapath (
 | 
			
		||||
  input  logic             BranchSignedE,           // Branch comparison operands are signed (if it's a branch)
 | 
			
		||||
  input  logic [3:0]       BSelectE,                // One hot encoding of ZBA_ZBB_ZBC_ZBS instruction
 | 
			
		||||
  input  logic [2:0]       ZBBSelectE,              // ZBB mux select signal
 | 
			
		||||
  input  logic             RotateE,                 // Indicates if Rotate instruction in Execute Stage
 | 
			
		||||
  output logic [1:0]       FlagsE,                  // Comparison flags ({eq, lt})
 | 
			
		||||
  output logic [`XLEN-1:0] IEUAdrE,                 // Address computed by ALU
 | 
			
		||||
  output logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE, // ALU sources before the mux chooses between them and PCE to put in srcA/B
 | 
			
		||||
@ -112,7 +113,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, FlagsE, ALUResultE, IEUAdrE);
 | 
			
		||||
  alu   #(`XLEN)  alu(SrcAE, SrcBE, ALUControlE, ALUSelectE, BSelectE, ZBBSelectE, Funct3E, FlagsE, RotateE, ALUResultE, IEUAdrE);
 | 
			
		||||
  mux2 #(`XLEN)   altresultmux(ImmExtE, PCLinkE, JumpE, AltResultE);
 | 
			
		||||
  mux2 #(`XLEN)   ieuresultmux(ALUResultE, AltResultE, ALUResultSrcE, IEUResultE);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,8 @@ module ieu (
 | 
			
		||||
  logic       FWriteIntM;                                    // FPU writing to integer register file
 | 
			
		||||
  logic       IntDivW;                                       // Integer divide instruction
 | 
			
		||||
  logic [3:0] BSelectE;                                      // Indicates if ZBA_ZBB_ZBC_ZBS instruction in one-hot encoding
 | 
			
		||||
  logic [2:0] ZBBSelectE;
 | 
			
		||||
  logic [2:0] ZBBSelectE;                                    // ZBB Result Select Signal in Execute Stage
 | 
			
		||||
  logic       RotateE;                                       // Indicates if Rotate Instruction in Execute Stage
 | 
			
		||||
 | 
			
		||||
  // Forwarding signals
 | 
			
		||||
  logic [4:0] Rs1D, Rs2D, Rs1E, Rs2E;                        // Source and destination registers
 | 
			
		||||
@ -100,7 +101,7 @@ controller c(
 | 
			
		||||
    .clk, .reset, .StallD, .FlushD, .InstrD, .ImmSrcD,
 | 
			
		||||
    .IllegalIEUFPUInstrD, .IllegalBaseInstrD, .StallE, .FlushE, .FlagsE, .FWriteIntE,
 | 
			
		||||
    .PCSrcE, .ALUControlE, .ALUSrcAE, .ALUSrcBE, .ALUResultSrcE, .ALUSelectE, .MemReadE, .CSRReadE, 
 | 
			
		||||
    .Funct3E, .IntDivE, .MDUE, .W64E, .BranchD, .BranchE, .JumpD, .JumpE, .SCE, .BranchSignedE, .BSelectE, .ZBBSelectE, .StallM, .FlushM, .MemRWM,
 | 
			
		||||
    .Funct3E, .IntDivE, .MDUE, .W64E, .BranchD, .BranchE, .JumpD, .JumpE, .SCE, .BranchSignedE, .BSelectE, .ZBBSelectE, .RotateE, .StallM, .FlushM, .MemRWM,
 | 
			
		||||
    .CSRReadM, .CSRWriteM, .PrivilegedM, .AtomicM, .Funct3M,
 | 
			
		||||
    .RegWriteM, .InvalidateICacheM, .FlushDCacheM, .InstrValidM, .InstrValidE, .InstrValidD, .FWriteIntM,
 | 
			
		||||
    .StallW, .FlushW, .RegWriteW, .IntDivW, .ResultSrcW, .CSRWriteFenceM, .FenceM, .StoreStallD);
 | 
			
		||||
@ -108,7 +109,7 @@ controller c(
 | 
			
		||||
  datapath   dp(
 | 
			
		||||
    .clk, .reset, .ImmSrcD, .InstrD, .StallE, .FlushE, .ForwardAE, .ForwardBE,
 | 
			
		||||
    .ALUControlE, .Funct3E, .ALUSrcAE, .ALUSrcBE, .ALUResultSrcE, .ALUSelectE, .JumpE, .BranchSignedE, 
 | 
			
		||||
    .PCE, .PCLinkE, .FlagsE, .IEUAdrE, .ForwardedSrcAE, .ForwardedSrcBE, .BSelectE, .ZBBSelectE,
 | 
			
		||||
    .PCE, .PCLinkE, .FlagsE, .IEUAdrE, .ForwardedSrcAE, .ForwardedSrcBE, .BSelectE, .ZBBSelectE, .RotateE,
 | 
			
		||||
    .StallM, .FlushM, .FWriteIntM, .FIntResM, .SrcAM, .WriteDataM, .FCvtIntW,
 | 
			
		||||
    .StallW, .FlushW, .RegWriteW, .IntDivW, .SquashSCW, .ResultSrcW, .ReadDataW, .FCvtIntResW,
 | 
			
		||||
    .CSRReadValW, .MDUResultW, .FIntDivResultW, .Rs1D, .Rs2D, .Rs1E, .Rs2E, .RdE, .RdM, .RdW);             
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user