diff --git a/src/ieu/bmu/zbc.sv b/src/ieu/bmu/zbc.sv
index 74b2f64b6..fc4b17b76 100644
--- a/src/ieu/bmu/zbc.sv
+++ b/src/ieu/bmu/zbc.sv
@@ -30,39 +30,22 @@
 `include "wally-config.vh"
 
 module zbc #(parameter WIDTH=32) (
-  input  logic [WIDTH-1:0] A, B,       // Operands
-  input  logic [2:0]       Funct3,     // Indicates operation to perform
-  output logic [WIDTH-1:0] ZBCResult); // ZBC result
+  input  logic [WIDTH-1:0] A, RevA, B,       // Operands
+  input  logic [2:0]       Funct3,           // Indicates operation to perform
+  output logic [WIDTH-1:0] ZBCResult);       // ZBC result
 
   logic [WIDTH-1:0] ClmulResult, RevClmulResult;
-  logic [WIDTH-1:0] RevA, RevB;
+  logic [WIDTH-1:0] RevB;
   logic [WIDTH-1:0] x,y;
+  logic [1:0] select;
+
+  assign select = ~Funct3[1:0];
 
-  bitreverse #(WIDTH) brA(.a(A), .b(RevA));
   bitreverse #(WIDTH) brB(.a(B), .b(RevB));
    
-  // zbc input select mux
-  always_comb begin
-    casez (Funct3[1:0])
-      2'b01: begin //clmul
-        x = A;
-        y = B;
-      end
-      2'b11: begin //clmulh
-        x = {RevA[WIDTH-2:0], {1'b0}};
-        y = {{1'b0}, RevB[WIDTH-2:0]};
-      end
-      2'b10: begin //clmulr
-        x = RevA;
-        y = RevB;
-      end
-      default: begin
-        x = 0;
-        y = 0;
-      end
-    endcase
-    
-  end
+
+  mux3 #(WIDTH) xmux({RevA[WIDTH-2:0], {1'b0}}, RevA, A, select, x);
+  mux3 #(WIDTH) ymux({{1'b0},RevB[WIDTH-2:0]}, RevB, B,  select, y);
   clmul #(WIDTH) clm(.A(x), .B(y), .ClmulResult(ClmulResult));
   bitreverse  #(WIDTH) brClmulResult(.a(ClmulResult), .b(RevClmulResult));