mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Simplified muxing for AES64
This commit is contained in:
		
							parent
							
								
									d22306ab9f
								
							
						
					
					
						commit
						7ee3145fc1
					
				@ -114,13 +114,13 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // ZKND Unit
 | 
					  // ZKND Unit
 | 
				
			||||||
  if (P.ZKND_SUPPORTED) begin: zknd
 | 
					  if (P.ZKND_SUPPORTED) begin: zknd
 | 
				
			||||||
    if (P.XLEN == 32) aes32d aes32d(.bs(Funct7[6:5]), .rs1(ABMU), .rs2(BBMU), .finalround(~ZBBSelect[0]), .result(ZKNDResult));
 | 
					    if (P.XLEN == 32) aes32d aes32d(.bs(Funct7[6:5]), .rs1(ABMU), .rs2(BBMU), .finalround(ZBBSelect[2]), .result(ZKNDResult));
 | 
				
			||||||
    else              zknd64 #(P.XLEN) ZKND64(.A(ABMU), .B(BBMU), .Funct7, .RNUM(Rs2E[3:0]), .ZKNDSelect(ZBBSelect[2:0]), .ZKNDResult);
 | 
					    else              zknd64 #(P.XLEN) ZKND64(.A(ABMU), .B(BBMU), .Funct7, .RNUM(Rs2E[3:0]), .ZKNDSelect(ZBBSelect[2:0]), .ZKNDResult);
 | 
				
			||||||
  end else assign ZKNDResult = 0;
 | 
					  end else assign ZKNDResult = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // ZKNE Unit
 | 
					  // ZKNE Unit
 | 
				
			||||||
  if (P.ZKNE_SUPPORTED) begin: zkne
 | 
					  if (P.ZKNE_SUPPORTED) begin: zkne
 | 
				
			||||||
    if (P.XLEN == 32) aes32e aes32e(.bs(Funct7[6:5]), .rs1(ABMU), .rs2(BBMU), .finalround(~ZBBSelect[0]), .result(ZKNEResult));
 | 
					    if (P.XLEN == 32) aes32e aes32e(.bs(Funct7[6:5]), .rs1(ABMU), .rs2(BBMU), .finalround(ZBBSelect[2]), .result(ZKNEResult));
 | 
				
			||||||
    else              zkne64 #(P.XLEN) ZKNE64(.A(ABMU), .B(BBMU), .Funct7, .RNUM(Rs2E[3:0]), .ZKNESelect(ZBBSelect[2:0]), .ZKNEResult);
 | 
					    else              zkne64 #(P.XLEN) ZKNE64(.A(ABMU), .B(BBMU), .Funct7, .RNUM(Rs2E[3:0]), .ZKNESelect(ZBBSelect[2:0]), .ZKNEResult);
 | 
				
			||||||
  end else assign ZKNEResult = 0;
 | 
					  end else assign ZKNEResult = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -215,36 +215,36 @@ module bmuctrl import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
    if (P.ZKND_SUPPORTED) begin //ZKND
 | 
					    if (P.ZKND_SUPPORTED) begin //ZKND
 | 
				
			||||||
      if (P.XLEN==32)
 | 
					      if (P.XLEN==32)
 | 
				
			||||||
        casez({OpD, Funct7D, Funct3D})
 | 
					        casez({OpD, Funct7D, Funct3D})
 | 
				
			||||||
          17'b0110011_??10101_000: BMUControlsD = `BMUCTRLW'b000_0111_0000_1_0_0_1_0_0_0_0_0;  // aes32dsi - final round decrypt
 | 
					          17'b0110011_??10101_000: BMUControlsD = `BMUCTRLW'b000_0111_0100_1_0_0_1_0_0_0_0_0;  // aes32dsi - final round decrypt
 | 
				
			||||||
          17'b0110011_??10111_000: BMUControlsD = `BMUCTRLW'b000_0111_0001_1_0_0_1_0_0_0_0_0;  // aes32dsmi - mid round decrypt
 | 
					          17'b0110011_??10111_000: BMUControlsD = `BMUCTRLW'b000_0111_0000_1_0_0_1_0_0_0_0_0;  // aes32dsmi - mid round decrypt
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
      else if (P.XLEN==64)
 | 
					      else if (P.XLEN==64)
 | 
				
			||||||
        casez({OpD, Funct7D, Funct3D})
 | 
					        casez({OpD, Funct7D, Funct3D})
 | 
				
			||||||
          17'b0110011_0011101_000: BMUControlsD = `BMUCTRLW'b000_0111_0000_1_0_0_1_0_0_0_0_0;  // aes64ds - decrypt final round
 | 
					          17'b0110011_0011101_000: BMUControlsD = `BMUCTRLW'b000_0111_0100_1_0_0_1_0_0_0_0_0;  // aes64ds - decrypt final round
 | 
				
			||||||
          17'b0110011_0011111_000: BMUControlsD = `BMUCTRLW'b000_0111_0001_1_0_0_1_0_0_0_0_0;  // aes64dsm - decrypt mid round
 | 
					          17'b0110011_0011111_000: BMUControlsD = `BMUCTRLW'b000_0111_0000_1_0_0_1_0_0_0_0_0;  // aes64dsm - decrypt mid round
 | 
				
			||||||
          17'b0010011_0011000_001: if (Rs2D == 5'b00000)
 | 
					          17'b0010011_0011000_001: if (Rs2D == 5'b00000)
 | 
				
			||||||
                                   BMUControlsD = `BMUCTRLW'b000_0111_0010_1_1_0_1_0_0_0_0_0;  // aes64im - decrypt keyschdule mixcolumns
 | 
					                                   BMUControlsD = `BMUCTRLW'b000_0111_0011_1_1_0_1_0_0_0_0_0;  // aes64im - decrypt keyschdule mixcolumns
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (P.ZKNE_SUPPORTED) begin //ZKNE
 | 
					    if (P.ZKNE_SUPPORTED) begin //ZKNE
 | 
				
			||||||
      if (P.XLEN==32)
 | 
					      if (P.XLEN==32)
 | 
				
			||||||
        casez({OpD, Funct7D, Funct3D})
 | 
					        casez({OpD, Funct7D, Funct3D})
 | 
				
			||||||
          17'b0110011_??10001_000: BMUControlsD = `BMUCTRLW'b000_1000_0000_1_0_0_1_0_0_0_0_0;  // aes32esi - final round encrypt
 | 
					          17'b0110011_??10001_000: BMUControlsD = `BMUCTRLW'b000_1000_0100_1_0_0_1_0_0_0_0_0;  // aes32esi - final round encrypt
 | 
				
			||||||
          17'b0110011_??10011_000: BMUControlsD = `BMUCTRLW'b000_1000_0001_1_0_0_1_0_0_0_0_0;  // aes32esmi - mid round encrypt
 | 
					          17'b0110011_??10011_000: BMUControlsD = `BMUCTRLW'b000_1000_0000_1_0_0_1_0_0_0_0_0;  // aes32esmi - mid round encrypt
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
      else if (P.XLEN==64)
 | 
					      else if (P.XLEN==64)
 | 
				
			||||||
        casez({OpD, Funct7D, Funct3D})
 | 
					        casez({OpD, Funct7D, Funct3D})
 | 
				
			||||||
          17'b0110011_0011001_000: BMUControlsD = `BMUCTRLW'b000_1000_0000_1_0_0_1_0_0_0_0_0;  // aes64es - encrypt final round
 | 
					          17'b0110011_0011001_000: BMUControlsD = `BMUCTRLW'b000_1000_0100_1_0_0_1_0_0_0_0_0;  // aes64es - encrypt final round
 | 
				
			||||||
          17'b0110011_0011011_000: BMUControlsD = `BMUCTRLW'b000_1000_0001_1_0_0_1_0_0_0_0_0;  // aes64esm - encrypt mid round
 | 
					          17'b0110011_0011011_000: BMUControlsD = `BMUCTRLW'b000_1000_0000_1_0_0_1_0_0_0_0_0;  // aes64esm - encrypt mid round
 | 
				
			||||||
        endcase
 | 
					        endcase
 | 
				
			||||||
    end  
 | 
					    end  
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if ((P.ZKND_SUPPORTED | P.ZKNE_SUPPORTED) & P.XLEN == 64) begin // ZKND and ZKNE shared instructions
 | 
					    if ((P.ZKND_SUPPORTED | P.ZKNE_SUPPORTED) & P.XLEN == 64) begin // ZKND and ZKNE shared instructions
 | 
				
			||||||
      casez({OpD, Funct7D, Funct3D})
 | 
					      casez({OpD, Funct7D, Funct3D})
 | 
				
			||||||
        17'b0010011_0011000_001: if (Rs2D[4] == 1'b1)
 | 
					        17'b0010011_0011000_001: if (Rs2D[4] == 1'b1)
 | 
				
			||||||
                                   BMUControlsD = `BMUCTRLW'b000_0111_0011_1_0_0_1_0_0_0_0_0;  // aes64ks1i - key schedule istr1 ... Don't know why this works here only ... P.XLEN is not 64 bits?
 | 
					                                   BMUControlsD = `BMUCTRLW'b000_0111_0001_1_0_0_1_0_0_0_0_0;  // aes64ks1i - key schedule istr1 ... Don't know why this works here only ... P.XLEN is not 64 bits?
 | 
				
			||||||
          17'b0110011_0111111_000: BMUControlsD = `BMUCTRLW'b000_0111_0100_1_0_0_1_0_0_0_0_0;  // aes64ks2 - key schedule istr2
 | 
					          17'b0110011_0111111_000: BMUControlsD = `BMUCTRLW'b000_0111_0010_1_0_0_1_0_0_0_0_0;  // aes64ks2 - key schedule istr2
 | 
				
			||||||
      endcase
 | 
					      endcase
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -37,10 +37,10 @@ module zknd64 #(parameter WIDTH=32) (
 | 
				
			|||||||
   logic [63:0] 	     aes64dRes, aes64imRes, aes64ks1iRes, aes64ks2Res;
 | 
					   logic [63:0] 	     aes64dRes, aes64imRes, aes64ks1iRes, aes64ks2Res;
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   // RV64
 | 
					   // RV64
 | 
				
			||||||
   aes64d    aes64d(.rs1(A), .rs2(B), .finalround(~ZKNDSelect[0]), .result(aes64dRes)); // decode AES
 | 
					   aes64d    aes64d(.rs1(A), .rs2(B), .finalround(ZKNDSelect[2]), .result(aes64dRes)); // decode AES
 | 
				
			||||||
   aes64im   aes64im(.rs1(A), .DataOut(aes64imRes));
 | 
					   aes64im   aes64im(.rs1(A), .DataOut(aes64imRes));
 | 
				
			||||||
   aes64ks1i aes64ks1i(.roundnum(RNUM), .rs1(A), .rd(aes64ks1iRes));
 | 
					   aes64ks1i aes64ks1i(.roundnum(RNUM), .rs1(A), .rd(aes64ks1iRes));
 | 
				
			||||||
   aes64ks2  aes64ks2(.rs2(B), .rs1(A), .rd(aes64ks2Res));
 | 
					   aes64ks2  aes64ks2(.rs2(B), .rs1(A), .rd(aes64ks2Res));
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   mux5 #(WIDTH) zkndmux(aes64dRes, aes64dRes, aes64imRes, aes64ks1iRes, aes64ks2Res, ZKNDSelect, ZKNDResult);
 | 
					   mux4 #(WIDTH) zkndmux(aes64dRes, aes64ks1iRes, aes64ks2Res, aes64imRes, ZKNDSelect[1:0], ZKNDResult);
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
				
			|||||||
@ -37,10 +37,10 @@ module zkne64 #(parameter WIDTH=32) (
 | 
				
			|||||||
   logic [63:0] 	     aes64eRes, aes64ks1iRes, aes64ks2Res;
 | 
					   logic [63:0] 	     aes64eRes, aes64ks1iRes, aes64ks2Res;
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   // RV64
 | 
					   // RV64
 | 
				
			||||||
   aes64e    aes64e(.rs1(A), .rs2(B), .finalround(~ZKNESelect[0]), .result(aes64eRes));
 | 
					   aes64e    aes64e(.rs1(A), .rs2(B), .finalround(ZKNESelect[2]), .result(aes64eRes));
 | 
				
			||||||
   aes64ks1i aes64ks1i(.roundnum(RNUM), .rs1(A), .rd(aes64ks1iRes));
 | 
					   aes64ks1i aes64ks1i(.roundnum(RNUM), .rs1(A), .rd(aes64ks1iRes));
 | 
				
			||||||
   aes64ks2  aes64ks2(.rs2(B), .rs1(A), .rd(aes64ks2Res));
 | 
					   aes64ks2  aes64ks2(.rs2(B), .rs1(A), .rd(aes64ks2Res));
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   // 010 is a placeholder to match the select of ZKND's AES64KS1I since they share some instruction
 | 
					   // 010 is a placeholder to match the select of ZKND's AES64KS1I since they share some instruction
 | 
				
			||||||
   mux5 #(WIDTH) zknemux(aes64eRes, aes64eRes, 64'b0, aes64ks1iRes, aes64ks2Res, ZKNESelect, ZKNEResult);   
 | 
					   mux3 #(WIDTH) zknemux(aes64eRes, aes64ks1iRes, aes64ks2Res, ZKNESelect[1:0], ZKNEResult);   
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user