[otbn] Don't flop `done_o` output from otbn_core

The `done_o` output flops into top-level register/interrupt primitives
so there's no need to flop it internally.

Signed-off-by: Greg Chadwick <gac@lowrisc.org>
diff --git a/hw/ip/otbn/dv/verilator/otbn_top_sim.sv b/hw/ip/otbn/dv/verilator/otbn_top_sim.sv
index 9414c0e..decac66 100644
--- a/hw/ip/otbn/dv/verilator/otbn_top_sim.sv
+++ b/hw/ip/otbn/dv/verilator/otbn_top_sim.sv
@@ -18,7 +18,7 @@
   localparam int ImemAddrWidth = prim_util_pkg::vbits(ImemSizeByte);
   localparam int DmemAddrWidth = prim_util_pkg::vbits(DmemSizeByte);
 
-  logic otbn_done;
+  logic otbn_done_d, otbn_done_q;
   logic otbn_start;
   logic otbn_start_done;
 
@@ -49,7 +49,7 @@
     .rst_ni        ( IO_RST_N      ),
 
     .start_i       ( otbn_start    ),
-    .done_o        ( otbn_done     ),
+    .done_o        ( otbn_done_d   ),
 
     .start_addr_i  ( ImemStartAddr ),
 
@@ -73,11 +73,13 @@
   bind otbn_core otbn_trace_intf #(.ImemAddrWidth, .DmemAddrWidth) i_otbn_trace_intf (.*);
   bind otbn_core otbn_tracer u_otbn_tracer(.*, .otbn_trace(i_otbn_trace_intf));
 
-  // Pulse otbn_start for 1 cycle immediately out of reset
+  // Pulse otbn_start for 1 cycle immediately out of reset.
+  // Flop `done_o` from otbn_core to match up with model done signal.
   always @(posedge IO_CLK or negedge IO_RST_N) begin
     if(!IO_RST_N) begin
       otbn_start      <= 1'b0;
       otbn_start_done <= 1'b0;
+      otbn_done_q     <= 1'b0;
     end else begin
       if (!otbn_start_done) begin
         otbn_start      <= 1'b1;
@@ -85,6 +87,8 @@
       end else if (otbn_start) begin
         otbn_start <= 1'b0;
       end
+
+      otbn_done_q <= otbn_done_d;
     end
   end
 
@@ -155,7 +159,7 @@
     if (!IO_RST_N) begin
       finish_counter <= 2'd0;
     end else begin
-      if (otbn_done) begin
+      if (otbn_done_q) begin
         finish_counter <= 2'd1;
       end
 
@@ -209,9 +213,9 @@
       done_mismatch_latched <= 1'b0;
       model_err_latched     <= 1'b0;
     end else begin
-      if (otbn_done != otbn_model_done) begin
-        $display("ERROR: At time %0t, otbn_done != otbn_model_done (%0d != %0d).",
-                 $time, otbn_done, otbn_model_done);
+      if (otbn_done_q != otbn_model_done) begin
+        $display("ERROR: At time %0t, otbn_done_q != otbn_model_done (%0d != %0d).",
+                 $time, otbn_done_q, otbn_model_done);
         done_mismatch_latched <= 1'b1;
       end
       model_err_latched <= model_err_latched | otbn_model_err;
diff --git a/hw/ip/otbn/rtl/otbn_controller.sv b/hw/ip/otbn/rtl/otbn_controller.sv
index 289c224..7af857e 100644
--- a/hw/ip/otbn/rtl/otbn_controller.sv
+++ b/hw/ip/otbn/rtl/otbn_controller.sv
@@ -100,9 +100,6 @@
   output logic                        ispr_bignum_wr_en_o,
   input  logic [WLEN-1:0]             ispr_rdata_i
 );
-
-  logic done_d, done_q;
-
   otbn_state_e state_q, state_d;
 
   logic stall;
@@ -158,17 +155,7 @@
   assign mem_stall = lsu_load_req_o;
 
   assign stall = mem_stall;
-  assign done_d = insn_valid_i && insn_dec_shared_i.ecall_insn;
-
-  always_ff @(posedge clk_i or negedge rst_ni) begin
-    if (!rst_ni) begin
-      done_q <= 1'b0;
-    end else begin
-      done_q <= done_d;
-    end
-  end
-
-  assign done_o = done_q;
+  assign done_o = insn_valid_i && insn_dec_shared_i.ecall_insn;
 
   // Branch taken when there is a valid branch instruction and comparison passes or a valid jump
   // instruction (which is always taken)
@@ -198,7 +185,7 @@
       OtbnStateRun: begin
         insn_fetch_req_valid_o = 1'b1;
 
-        if (done_d) begin
+        if (done_o) begin
           state_d                = OtbnStateHalt;
           insn_fetch_req_valid_o = 1'b0;
         end else begin