diff --git a/src/ariane.sv b/src/ariane.sv
index 0868f7ebc8e796880158d0805b074888a2ab30de..a4c589cc56ffdf9d8caa997e1c1523017c9d87be 100644
--- a/src/ariane.sv
+++ b/src/ariane.sv
@@ -606,6 +606,22 @@ module ariane import ariane_pkg::*; #(
     .*
   );
 
+  // ----------
+  // Verifier
+  // ----------
+  verifier #(
+    .NR_ENTRIES (NR_SB_ENTRIES),
+    .NR_COMMIT_PORTS (NR_COMMIT_PORTS)
+  ) verifier_i (
+    .clk_i,
+    .rst_ni,
+    .flush_i (flush_ctrl_id),
+
+    // CO
+    .commit_instr_i (commit_instr_id_commit),
+    .commit_ack_i (commit_ack)
+  );
+
   // -------------------
   // Cache Subsystem
   // -------------------
diff --git a/src/verifier.sv b/src/verifier.sv
new file mode 100644
index 0000000000000000000000000000000000000000..f41a5584a54efe4aeec3a351c0d2d277dad2ba2e
--- /dev/null
+++ b/src/verifier.sv
@@ -0,0 +1,61 @@
+module verifier #(
+  parameter int unsigned NR_ENTRIES = 8,
+  parameter int unsigned NR_COMMIT_PORTS = 2
+) (
+  input logic clk_i,
+  input logic rst_ni,
+  input logic flush_i,
+
+  // CO
+  input ariane_pkg::scoreboard_entry_t [NR_COMMIT_PORTS-1:0] commit_instr_i,
+  input logic [NR_COMMIT_PORTS-1:0] commit_ack_i
+);
+
+  localparam int unsigned           BITS_ENTRIES = $clog2(NR_ENTRIES);
+
+  // CO
+  logic [NR_COMMIT_PORTS-1:0][BITS_ENTRIES-1:0]          commit_id_n, commit_id_q;
+  logic [NR_COMMIT_PORTS-1:0]       commit_correct;
+  logic [BITS_ENTRIES-1:0]          commit_nr;
+
+  popcount #(
+    .INPUT_WIDTH (NR_COMMIT_PORTS)
+  ) (
+    .data_i (commit_ack_i),
+    .popcount_o (commit_nr)
+  );
+
+  assign commit_id_n[0] = (flush_i) ? '0 : commit_id_q[0] + commit_nr;
+
+  for (genvar i = 1; i < NR_COMMIT_PORTS; i++) begin
+    assign commit_id_n[i] = (flush_i) ? '0 : commit_id_n[0] + i;
+  end
+
+  for (genvar i = 0; i < NR_COMMIT_PORTS; i++) begin
+    assign commit_correct[i] = !(commit_instr_i[i].valid) ||
+      (commit_instr_i[i].valid & commit_instr_i[i].trans_id == commit_id_q[i]);
+  end
+
+  always_ff @(posedge clk_i or negedge rst_ni) begin : regs
+    if (!rst_ni) begin
+      commit_id_q <= '0;
+    end else begin
+      commit_id_q <= commit_id_n;
+    end
+  end
+
+  //pragma translate off
+  `ifndef VERILATOR
+  initial begin
+    assert (NR_ENTRIES == 2**BITS_ENTRIES) else $fatal ("NR_ENTRIES is not a power of 2");
+  end
+
+  for (genvar i = 0; i < NR_COMMIT_PORTS; i++) begin
+    assert property (
+      @(posedge clk_i) disable iff (!rst_ni) commit_ack_i[i] |-> commit_correct[i])
+      else $warning (1,"Invalid commit");
+  end
+  `endif
+  //pragma translate on
+
+endmodule