diff --git a/src/ieu/bmu/bitmanipalu.sv b/src/ieu/bmu/bitmanipalu.sv index 228b23132..d3094377d 100644 --- a/src/ieu/bmu/bitmanipalu.sv +++ b/src/ieu/bmu/bitmanipalu.sv @@ -80,7 +80,10 @@ module bitmanipalu #(parameter WIDTH=32) ( // ZBC Unit if (`ZBC_SUPPORTED) begin: zbc - zbc #(WIDTH) ZBC(.A, .RevA, .B, .Funct3, .ZBCResult); + logic ZBCSelect; // ZBC instruction + assign ZBCSelect = BSelect == 2'b11; + //assign ZBCSelect = 1'b0; + zbc #(WIDTH) ZBC(.A, .RevA, .B, .ZBCSelect, .Funct3, .ZBCResult); end else assign ZBCResult = 0; // ZBB Unit diff --git a/src/ieu/bmu/zbc.sv b/src/ieu/bmu/zbc.sv index b173a5f63..30f65258f 100644 --- a/src/ieu/bmu/zbc.sv +++ b/src/ieu/bmu/zbc.sv @@ -31,21 +31,23 @@ module zbc #(parameter WIDTH=32) ( input logic [WIDTH-1:0] A, RevA, B, // Operands + input logic ZBCSelect, // ZBC instruction 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] RevB; - logic [WIDTH-1:0] X, Y; + logic [WIDTH-1:0] X, Y, X1; bitreverse #(WIDTH) brB(B, RevB); - mux3 #(WIDTH) xmux({RevA[WIDTH-2:0], {1'b0}}, RevA, A, ~Funct3[1:0], X); - mux2 #(WIDTH) ymux(RevB, B, ~Funct3[1], Y); + mux3 #(WIDTH) xmux1({RevA[WIDTH-2:0], {1'b0}}, RevA, A, ~Funct3[1:0], X1); + mux2 #(WIDTH) xmux(X1, '0, ~ZBCSelect, X); + mux3 #(WIDTH) ymux(RevB, B, '0, {~ZBCSelect, ~Funct3[1]}, Y); clmul #(WIDTH) clm(.X, .Y, .ClmulResult); bitreverse #(WIDTH) brClmulResult(ClmulResult, RevClmulResult); mux2 #(WIDTH) zbcresultmux(ClmulResult, RevClmulResult, Funct3[1], ZBCResult); -endmodule \ No newline at end of file +endmodule