forked from Github_Repos/cvw
		
	Moved W64 truncation after result mux
This commit is contained in:
		
							parent
							
								
									23c6b6370f
								
							
						
					
					
						commit
						ebcffcdebd
					
				@ -32,7 +32,7 @@ module alu #(parameter WIDTH=32) (
 | 
				
			|||||||
  output logic [WIDTH-1:0] Result,
 | 
					  output logic [WIDTH-1:0] Result,
 | 
				
			||||||
  output logic [WIDTH-1:0] Sum);
 | 
					  output logic [WIDTH-1:0] Sum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [WIDTH-1:0] CondInvB, SumTrunc, Shift, SLT, SLTU, bor;
 | 
					  logic [WIDTH-1:0] CondInvB, Shift, SLT, SLTU, FullResult;
 | 
				
			||||||
  logic        Right;
 | 
					  logic        Right;
 | 
				
			||||||
  logic        Carry, Neg;
 | 
					  logic        Carry, Neg;
 | 
				
			||||||
  logic        LT, LTU;
 | 
					  logic        LT, LTU;
 | 
				
			||||||
@ -50,17 +50,7 @@ module alu #(parameter WIDTH=32) (
 | 
				
			|||||||
  assign CondInvB = SubArith ? ~B : B;
 | 
					  assign CondInvB = SubArith ? ~B : B;
 | 
				
			||||||
  assign {Carry, Sum} = A + CondInvB + {{(WIDTH-1){1'b0}}, SubArith};
 | 
					  assign {Carry, Sum} = A + CondInvB + {{(WIDTH-1){1'b0}}, SubArith};
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // support W-type RV64I ADDW/SUBW/ADDIW that sign-extend 32-bit result to 64 bits
 | 
					 | 
				
			||||||
  generate
 | 
					 | 
				
			||||||
    if (WIDTH==64)
 | 
					 | 
				
			||||||
      assign SumTrunc = W64 ? {{32{Sum[31]}}, Sum[31:0]} : Sum;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      assign SumTrunc = Sum;
 | 
					 | 
				
			||||||
  endgenerate
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  // Shifts
 | 
					  // Shifts
 | 
				
			||||||
  // assign arith = alucontrol[3]; // sra
 | 
					 | 
				
			||||||
  // assign w64 = alucontrol[4];
 | 
					 | 
				
			||||||
  assign Right = (Funct3[2:0] == 3'b101); // sra or srl
 | 
					  assign Right = (Funct3[2:0] == 3'b101); // sra or srl
 | 
				
			||||||
  shifter sh(A, B[5:0], Right, SubArith, W64, Shift);
 | 
					  shifter sh(A, B[5:0], Right, SubArith, W64, Shift);
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
@ -80,14 +70,20 @@ module alu #(parameter WIDTH=32) (
 | 
				
			|||||||
  assign ALUFunct = Funct3 & {3{ALUOp}}; // Force ALUFunct to 0 to Add when ALUOp = 0
 | 
					  assign ALUFunct = Funct3 & {3{ALUOp}}; // Force ALUFunct to 0 to Add when ALUOp = 0
 | 
				
			||||||
  always_comb
 | 
					  always_comb
 | 
				
			||||||
    case (ALUFunct)
 | 
					    case (ALUFunct)
 | 
				
			||||||
      3'b000: Result = SumTrunc;  // add or sub
 | 
					      3'b000: FullResult = Sum;       // add or sub
 | 
				
			||||||
      3'b001: Result = Shift;     // sll
 | 
					      3'b001: FullResult = Shift;     // sll
 | 
				
			||||||
      3'b010: Result = SLT;       // slt
 | 
					      3'b010: FullResult = SLT;       // slt
 | 
				
			||||||
      3'b011: Result = SLTU;      // sltu
 | 
					      3'b011: FullResult = SLTU;      // sltu
 | 
				
			||||||
      3'b100: Result = A ^ B;     // xor
 | 
					      3'b100: FullResult = A ^ B;     // xor
 | 
				
			||||||
      3'b101: Result = Shift;     // sra or srl
 | 
					      3'b101: FullResult = Shift;     // sra or srl
 | 
				
			||||||
      3'b110: Result = A | B;     // or 
 | 
					      3'b110: FullResult = A | B;     // or 
 | 
				
			||||||
      3'b111: Result = A & B;     // and
 | 
					      3'b111: FullResult = A & B;     // and
 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // support W-type RV64I ADDW/SUBW/ADDIW/Shifts that sign-extend 32-bit result to 64 bits
 | 
				
			||||||
 | 
					  generate
 | 
				
			||||||
 | 
					    if (WIDTH==64)  assign Result = W64 ? {{32{FullResult[31]}}, FullResult[31:0]} : FullResult;
 | 
				
			||||||
 | 
					    else            assign Result = FullResult;
 | 
				
			||||||
 | 
					  endgenerate
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -136,9 +136,7 @@ module datapath (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // handle Store Conditional result if atomic extension supported
 | 
					  // handle Store Conditional result if atomic extension supported
 | 
				
			||||||
  generate
 | 
					  generate
 | 
				
			||||||
    if (`A_SUPPORTED)
 | 
					    if (`A_SUPPORTED) assign SCResultW = {{(`XLEN-1){1'b0}}, SquashSCW};
 | 
				
			||||||
      assign SCResultW = {{(`XLEN-1){1'b0}}, SquashSCW};
 | 
					    else              assign SCResultW = 0;
 | 
				
			||||||
    else 
 | 
					 | 
				
			||||||
      assign SCResultW = 0;
 | 
					 | 
				
			||||||
  endgenerate
 | 
					  endgenerate
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user