Simplified 3:1 mux to 2:1 mux when only Zbkc is supported and clmulr is not needed

This commit is contained in:
David Harris 2024-06-10 02:34:35 -07:00
parent 5dfde808f0
commit 8b887755c9
2 changed files with 23 additions and 15 deletions

View File

@ -93,7 +93,7 @@ module bitmanipalu import cvw::*; #(parameter cvw_t P) (
// ZBC and ZBKCUnit // ZBC and ZBKCUnit
if (P.ZBC_SUPPORTED | P.ZBKC_SUPPORTED) begin: zbc if (P.ZBC_SUPPORTED | P.ZBKC_SUPPORTED) begin: zbc
zbc #(P.XLEN) ZBC(.A(ABMU), .RevA, .B(BBMU), .Funct3, .ZBCResult); zbc #(P) ZBC(.A(ABMU), .RevA, .B(BBMU), .Funct3, .ZBCResult);
end else assign ZBCResult = '0; end else assign ZBCResult = '0;
// ZBB Unit // ZBB Unit

View File

@ -28,23 +28,31 @@
// and limitations under the License. // and limitations under the License.
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
module zbc #(parameter WIDTH=32) ( module zbc import cvw::*; #(parameter cvw_t P) (
input logic [WIDTH-1:0] A, RevA, B, // Operands input logic [P.XLEN-1:0] A, RevA, B, // Operands
input logic [2:0] Funct3, // Indicates operation to perform input logic [2:0] Funct3, // Indicates operation to perform
output logic [WIDTH-1:0] ZBCResult); // ZBC result output logic [P.XLEN-1:0] ZBCResult); // ZBC result
logic [WIDTH-1:0] ClmulResult, RevClmulResult; logic [P.XLEN-1:0] ClmulResult, RevClmulResult;
logic [WIDTH-1:0] RevB; logic [P.XLEN-1:0] RevB;
logic [WIDTH-1:0] X, Y; logic [P.XLEN-1:0] X, Y;
bitreverse #(WIDTH) brB(B, RevB); bitreverse #(P.XLEN) brB(B, RevB);
mux3 #(WIDTH) xmux({RevA[WIDTH-2:0], {1'b0}}, RevA, A, ~Funct3[1:0], X); // choose X = A for clmul, Rev(A) << 1 for clmulh, Rev(A) for clmulr
mux2 #(WIDTH) ymux(RevB, B, ~Funct3[1], Y); // unshifted Rev(A) source is only needed for clmulr in ZBC, not in ZBKC
if (P.ZBC_SUPPORTED)
mux3 #(P.XLEN) xmux({RevA[P.XLEN-2:0], {1'b0}}, RevA, A, ~Funct3[1:0], X);
else
mux2 #(P.XLEN) xmux(A, {RevA[P.XLEN-2:0], {1'b0}}, Funct3[1], X);
clmul #(WIDTH) clm(.X, .Y, .ClmulResult); // choose X = B for clmul, Rev(B) for clmulH
mux2 #(P.XLEN) ymux(B, RevB, Funct3[1], Y);
bitreverse #(WIDTH) brClmulResult(ClmulResult, RevClmulResult);
mux2 #(WIDTH) zbcresultmux(ClmulResult, RevClmulResult, Funct3[1], ZBCResult); // carry free multiplier
clmul #(P.XLEN) clm(.X, .Y, .ClmulResult);
// choose result = rev(X @ Y) for clmulh/clmulr
bitreverse #(P.XLEN) brClmulResult(ClmulResult, RevClmulResult);
mux2 #(P.XLEN) zbcresultmux(ClmulResult, RevClmulResult, Funct3[1], ZBCResult);
endmodule endmodule