[dv/hmac] hmac_done check

Add checkings for hmac_done
Add checkings to enable and disable cycle accurate checking
Re-org some process to make the scb more efficient: only flush and check
when seeing hmac_process
diff --git a/hw/ip/hmac/dv/env/hmac_scoreboard.sv b/hw/ip/hmac/dv/env/hmac_scoreboard.sv
index 736f7c5..96540be 100644
--- a/hw/ip/hmac/dv/env/hmac_scoreboard.sv
+++ b/hw/ip/hmac/dv/env/hmac_scoreboard.sv
@@ -27,9 +27,10 @@
 
   virtual task process_tl_access(tl_seq_item item, tl_channels_e channel = DataChannel);
     uvm_reg csr;
-    bit     do_read_check   = 1'b1;
-    bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = get_normalized_addr(item.a_addr);
+    bit     do_read_check           = 1'b1;
+    bit     do_cycle_accurate_check = 1'b1;
+    bit     write                   = item.is_write();
+    uvm_reg_addr_t csr_addr         = get_normalized_addr(item.a_addr);
 
     super.process_tl_access(item, channel);
     if (is_tl_err_exp || is_tl_unmapped_addr) return;
@@ -76,6 +77,14 @@
           "cmd": begin
             if (sha_en) begin
               {hmac_process, hmac_start} = item.a_data[1:0];
+              if (hmac_process) begin
+                // check if msg all streamed in, could happen during wr msg or trigger process
+                predict_digest(msg_q);
+                update_wr_msg_length(msg_q.size());
+                // any bytes left after hmac_process will be added to the wr_cnt
+                if (msg_q.size() % 4 != 0) incr_wr_and_check_fifo_full();
+                msg_q.delete();
+              end
             end else if (item.a_data[HashStart] == 1) begin
               void'(ral.intr_state.hmac_err.predict(.value(1), .kind(UVM_PREDICT_DIRECT)));
               void'(ral.err_code.predict(.value(SwHashStartWhenShaDisabled),
@@ -105,14 +114,6 @@
           end
         endcase
       end
-      // check if msg all streamed in, could happen during write mem_fifo or trigger hmac_cmd
-      if (hmac_process) begin
-        predict_digest(msg_q);
-        update_wr_msg_length(msg_q.size());
-        // any bytes left after hmac_process will be added to the wr_cnt
-        if (msg_q.size() % 4 != 0) incr_wr_and_check_fifo_full();
-        flush();
-      end
     end
 
     // predict status based on csr read addr channel
@@ -133,7 +134,7 @@
     if (!write) begin
       case (csr.get_name())
         "intr_state": begin
-          // TODO: cycle accurate checking on hmac_done
+          if (!do_cycle_accurate_check) do_read_check = 0;
           if (cfg.en_cov) begin
             hmac_intr_e intr;
             intr = intr.first;
@@ -145,9 +146,15 @@
             end while (intr != intr.first);
           end
           if (item.d_data[HmacDone] == 1) begin
-            do_read_check = 1'b0;
             hmac_wr_cnt = 0;
             hmac_rd_cnt = 0;
+            // here sanity check DUT should only trigger hmac_done when sha is enabled, and
+            // previously triggered hash_process.
+            // future throughput test should check the accurate cycles
+            if (sha_en && hmac_process) begin
+              void'(ral.intr_state.hmac_done.predict(.value(1), .kind(UVM_PREDICT_READ)));
+              hmac_process = 0;
+            end
           end
         end
         "digest0", "digest1", "digest2", "digest3", "digest4", "digest5", "digest6", "digest7":
@@ -162,14 +169,17 @@
             return;
           end
         end
-        "status": if (cfg.en_cov) cov.status_cg.sample(item.d_data, ral.cfg.get_mirrored_value());
+        "status": begin
+          if (!do_cycle_accurate_check) do_read_check = 0;
+          if (cfg.en_cov) cov.status_cg.sample(item.d_data, ral.cfg.get_mirrored_value());
+        end
         "msg_length_lower": begin
           if (cfg.en_cov) begin
             cov.msg_len_cg.sample(item.d_data, ral.cfg.get_mirrored_value());
           end
         end
         "key0", "key1", "key2", "key3", "key4", "key5", "key6", "key7", "cfg", "cmd", "err_code",
-        "intr_enable", "intr_test", "wipe_secret", "msg_length_upper", "intr_state": begin
+        "intr_enable", "intr_test", "wipe_secret", "msg_length_upper": begin
           // Do nothing
         end
         default: begin