From 64d7f778da2d53cce078e5d22e9e9ee2946d79b5 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 11 Mar 2024 01:01:20 -0700 Subject: [PATCH] AES64 simplification --- src/ieu/bmu/bitmanipalu.sv | 6 ++++-- src/ieu/bmu/bmuctrl.sv | 8 ++++---- src/ieu/kmu/zkn64.sv | 30 +++++++----------------------- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/ieu/bmu/bitmanipalu.sv b/src/ieu/bmu/bitmanipalu.sv index bf6914b88..d751b0905 100644 --- a/src/ieu/bmu/bitmanipalu.sv +++ b/src/ieu/bmu/bitmanipalu.sv @@ -117,8 +117,10 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) ( if (P.ZKND_SUPPORTED) aes32d aes32d(.bs(Funct7[6:5]), .rs1(ABMU), .rs2(BBMU), .finalround(ZBBSelect[2]), .result(ZKNDResult)); if (P.ZKNE_SUPPORTED) aes32e aes32e(.bs(Funct7[6:5]), .rs1(ABMU), .rs2(BBMU), .finalround(ZBBSelect[2]), .result(ZKNEResult)); end else - if (P.ZKND_SUPPORTED | P.ZKNE_SUPPORTED) - zkn64 #(P) ZKND64(.A(ABMU), .B(BBMU), .Funct7, .round(Rs2E[3:0]), .ZKNSelect(ZBBSelect[3:0]), .ZKNDResult, .ZKNEResult); // *** simplify to only one output + if (P.ZKND_SUPPORTED | P.ZKNE_SUPPORTED) begin + zkn64 #(P) ZKN64(.A(ABMU), .B(BBMU), .Funct7, .round(Rs2E[3:0]), .ZKNSelect(ZBBSelect[3:0]), .ZKNResult(ZKNDResult)); + assign ZKNEResult = ZKNDResult; + end /* // ZKND Unit diff --git a/src/ieu/bmu/bmuctrl.sv b/src/ieu/bmu/bmuctrl.sv index 936c26a54..3dd0d5718 100644 --- a/src/ieu/bmu/bmuctrl.sv +++ b/src/ieu/bmu/bmuctrl.sv @@ -235,16 +235,16 @@ module bmuctrl import cvw::*; #(parameter cvw_t P) ( endcase else if (P.XLEN==64) casez({OpD, Funct7D, Funct3D}) - 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_0000_1_0_0_1_0_0_0_0_0; // aes64esm - encrypt mid round + 17'b0110011_0011001_000: BMUControlsD = `BMUCTRLW'b000_1000_0101_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 endcase end if ((P.ZKND_SUPPORTED | P.ZKNE_SUPPORTED) & P.XLEN == 64) begin // ZKND and ZKNE shared instructions casez({OpD, Funct7D, Funct3D}) 17'b0010011_0011000_001: if (Rs2D[4] == 1'b1) - 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_0010_1_0_0_1_0_0_0_0_0; // aes64ks2 - key schedule istr2 + BMUControlsD = `BMUCTRLW'b000_0111_0010_1_0_0_1_0_0_0_0_0; // aes64ks1i - key schedule istr1 + 17'b0110011_0111111_000: BMUControlsD = `BMUCTRLW'b000_0111_0011_1_0_0_1_0_0_0_0_0; // aes64ks2 - key schedule istr2 endcase end diff --git a/src/ieu/kmu/zkn64.sv b/src/ieu/kmu/zkn64.sv index 0cc2238f6..8cc1ab47f 100644 --- a/src/ieu/kmu/zkn64.sv +++ b/src/ieu/kmu/zkn64.sv @@ -28,17 +28,13 @@ module zkn64 import cvw::*; #(parameter cvw_t P) ( input logic [63:0] A, B, - input logic [6:0] Funct7, - input logic [3:0] round, - input logic [3:0] ZKNSelect, - output logic [63:0] ZKNDResult, ZKNEResult + input logic [6:0] Funct7, + input logic [3:0] round, + input logic [3:0] ZKNSelect, + output logic [63:0] ZKNResult ); -// zknd64 #(64) ZKND64(.A, .B, .Funct7, .round, .ZKNDSelect(ZKNSelect[3:0]), .ZKNDResult); // *** strip out parameter unneded -// zkne64 #(64) ZKNE64(.A, .B, .Funct7, .round, .ZKNESelect(ZKNSelect[2:0]), .ZKNEResult); - - - logic [63:0] aes64dRes, aes64eRes, aes64imRes, aes64ks1iRes, aes64ks2Res; + logic [63:0] aes64dRes, aes64eRes, aes64ks1iRes, aes64ks2Res; if (P.ZKND_SUPPORTED) // ZKND supports aes64ds, aes64dsm, aes64im aes64d aes64d(.rs1(A), .rs2(B), .finalround(ZKNSelect[2]), .aes64im(ZKNSelect[3]), .result(aes64dRes)); // decode AES @@ -49,18 +45,6 @@ module zkn64 import cvw::*; #(parameter cvw_t P) ( aes64ks1i aes64ks1i(.round, .rs1(A), .result(aes64ks1iRes)); aes64ks2 aes64ks2(.rs2(B), .rs1(A), .result(aes64ks2Res)); - mux3 #(64) zkndmux(aes64dRes, aes64ks1iRes, aes64ks2Res, ZKNSelect[1:0], ZKNDResult); - mux3 #(64) zknemux(aes64eRes, aes64ks1iRes, aes64ks2Res, ZKNSelect[1:0], ZKNEResult); - -/* - logic [63:0] aes64eRes, aes64ks1iRes, aes64ks2Res; - - // RV64 - aes64ks1i aes64ks1i(.round, .rs1(A), .result(aes64ks1iRes)); - aes64ks2 aes64ks2(.rs2(B), .rs1(A), .result(aes64ks2Res)); - - // 010 is a placeholder to match the select of ZKND's AES64KS1I since they share some instruction - mux4 #(WIDTH) zknemux(aes64eRes, aes64dRes, aes64ks1iRes, aes64ks2Res, ZKNESelect[1:0], ZKNEResult); -*/ - + // Choose among decrypt, encrypt, key schedule 1, key schedule 2 results + mux4 #(64) zkndmux(aes64dRes, aes64eRes, aes64ks1iRes, aes64ks2Res, ZKNSelect[1:0], ZKNResult); endmodule