[csrng/dv] Verify lc_hw_debug_en and cs_aes_halt

Signed-off-by: Steve Nelson <steve.nelson@wdc.com>
diff --git a/hw/ip/csrng/dv/env/csrng_env.sv b/hw/ip/csrng/dv/env/csrng_env.sv
index 9afa3af..a878ac0 100644
--- a/hw/ip/csrng/dv/env/csrng_env.sv
+++ b/hw/ip/csrng/dv/env/csrng_env.sv
@@ -10,8 +10,12 @@
   );
   `uvm_component_utils(csrng_env)
 
-  push_pull_agent#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH))  m_entropy_src_agent;
-  csrng_agent   m_edn_agent[NUM_HW_APPS];
+  push_pull_agent#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH))
+      m_entropy_src_agent;
+  push_pull_agent#(.HostDataWidth(1))
+      m_aes_halt_agent;
+  csrng_agent
+      m_edn_agent[NUM_HW_APPS];
 
   `uvm_component_new
 
@@ -27,6 +31,14 @@
     cfg.m_entropy_src_agent_cfg.if_mode    = dv_utils_pkg::Device;
     cfg.m_entropy_src_agent_cfg.en_cov     = cfg.en_cov;
 
+    m_aes_halt_agent = push_pull_agent#(.HostDataWidth(1))
+                       ::type_id::create("m_aes_halt_agent", this);
+    uvm_config_db#(push_pull_agent_cfg#(.HostDataWidth(1)))
+        ::set(this, "m_aes_halt_agent*", "cfg", cfg.m_aes_halt_agent_cfg);
+    cfg.m_aes_halt_agent_cfg.agent_type = push_pull_agent_pkg::PullAgent;
+    cfg.m_aes_halt_agent_cfg.if_mode    = dv_utils_pkg::Host;
+    cfg.m_aes_halt_agent_cfg.en_cov     = cfg.en_cov;
+
     for (int i = 0; i < NUM_HW_APPS; i++) begin
       string edn_agent_name = $sformatf("m_edn_agent[%0d]", i);
       m_edn_agent[i] = csrng_agent::type_id::create(edn_agent_name, this);
@@ -36,10 +48,15 @@
       cfg.m_edn_agent_cfg[i].en_cov  = cfg.en_cov;
     end
 
-    if (!uvm_config_db#(virtual pins_if#(8))::get(this, "", "otp_en_cs_sw_app_read_vif",
+    if (!uvm_config_db#(virtual pins_if#(MuBi8Width))::get(this, "", "otp_en_cs_sw_app_read_vif",
         cfg.otp_en_cs_sw_app_read_vif)) begin
       `uvm_fatal(get_full_name(), "failed to get otp_en_cs_sw_app_read_vif from uvm_config_db")
     end
+
+    if (!uvm_config_db#(virtual pins_if#(MuBi4Width))::get(this, "", "lc_hw_debug_en_vif",
+        cfg.lc_hw_debug_en_vif)) begin
+      `uvm_fatal(get_full_name(), "failed to get lc_hw_debug_en_vif from uvm_config_db")
+    end
   endfunction
 
   function void connect_phase(uvm_phase phase);
@@ -53,6 +70,8 @@
     if (cfg.is_active) begin
       if (cfg.m_entropy_src_agent_cfg.is_active)
         virtual_sequencer.entropy_src_sequencer_h = m_entropy_src_agent.sequencer;
+      if (cfg.m_aes_halt_agent_cfg.is_active)
+        virtual_sequencer.aes_halt_sequencer_h = m_aes_halt_agent.sequencer;
       for (int i = 0; i < NUM_HW_APPS; i++) begin
         if (cfg.m_edn_agent_cfg[i].is_active)
           virtual_sequencer.edn_sequencer_h[i] = m_edn_agent[i].sequencer;
diff --git a/hw/ip/csrng/dv/env/csrng_env_cfg.sv b/hw/ip/csrng/dv/env/csrng_env_cfg.sv
index fd39a64..13ab7cf 100644
--- a/hw/ip/csrng/dv/env/csrng_env_cfg.sv
+++ b/hw/ip/csrng/dv/env/csrng_env_cfg.sv
@@ -11,19 +11,22 @@
 
   // ext component cfgs
   rand push_pull_agent_cfg#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH))
-       m_entropy_src_agent_cfg;
+                                                 m_entropy_src_agent_cfg;
+  rand push_pull_agent_cfg#(.HostDataWidth(1))   m_aes_halt_agent_cfg;
+  rand csrng_agent_cfg                           m_edn_agent_cfg[NUM_HW_APPS];
 
-  rand csrng_agent_cfg   m_edn_agent_cfg[NUM_HW_APPS];
-
-  virtual pins_if#(8)    otp_en_cs_sw_app_read_vif;
+  virtual pins_if#(MuBi8Width)   otp_en_cs_sw_app_read_vif;
+  virtual pins_if#(MuBi4Width)   lc_hw_debug_en_vif;
 
   // Knobs & Weights
-  uint   otp_en_cs_sw_app_read_pct, regwen_pct,
+  uint   otp_en_cs_sw_app_read_pct, lc_hw_debug_en_pct, regwen_pct,
          enable_pct, sw_app_enable_pct, read_int_state_pct,
-         check_int_state_pct, num_cmds_min, num_cmds_max;
+         check_int_state_pct, num_cmds_min, num_cmds_max, aes_halt_pct,
+         min_aes_halt_clks, max_aes_halt_clks;
 
-  rand bit       check_int_state, regwen, hw_app[NUM_HW_APPS], sw_app;
+  rand bit       check_int_state, regwen, hw_app[NUM_HW_APPS], sw_app, aes_halt;
   rand mubi4_t   enable, sw_app_enable, read_int_state;
+  rand lc_tx_t   lc_hw_debug_en;
   rand mubi8_t   otp_en_cs_sw_app_read;
 
   // Variables (+1 is for the SW APP)
@@ -32,9 +35,12 @@
   bit [csrng_env_pkg::BLOCK_LEN-1:0]     v[NUM_HW_APPS + 1];
   bit [csrng_env_pkg::RSD_CTR_LEN-1:0]   reseed_counter[NUM_HW_APPS + 1];
 
-  constraint otp_en_cs_sw_app_read_c {otp_en_cs_sw_app_read dist {
-                                      MuBi8True  :/ otp_en_cs_sw_app_read_pct,
-                                      MuBi8False :/ (100 - otp_en_cs_sw_app_read_pct) };}
+  constraint otp_en_cs_sw_app_read_c { otp_en_cs_sw_app_read dist {
+                                       MuBi8True  :/ otp_en_cs_sw_app_read_pct,
+                                       MuBi8False :/ (100 - otp_en_cs_sw_app_read_pct) };}
+
+  constraint lc_hw_debug_en_c { `DV_LC_TX_DIST(lc_hw_debug_en, lc_hw_debug_en_pct,
+                                (100 - lc_hw_debug_en_pct) / 2,  (100 - lc_hw_debug_en_pct) / 2)}
 
   constraint regwen_c { regwen dist {
                         1 :/ regwen_pct,
@@ -56,6 +62,10 @@
                                  1 :/ check_int_state_pct,
                                  0 :/ (100 - check_int_state_pct) };}
 
+  constraint aes_halt_c { aes_halt dist {
+                          1 :/ aes_halt_pct,
+                          0 :/ (100 - aes_halt_pct) };}
+
   virtual function void initialize(bit [31:0] csr_base_addr = '1);
     list_of_alerts = csrng_env_pkg::LIST_OF_ALERTS;
     tl_intg_alert_name = "fatal_alert";
@@ -65,6 +75,9 @@
     m_entropy_src_agent_cfg = push_pull_agent_cfg#(.HostDataWidth(entropy_src_pkg::
                               FIPS_CSRNG_BUS_WIDTH))::type_id::create("m_entropy_src_agent_cfg");
 
+    m_aes_halt_agent_cfg    = push_pull_agent_cfg#(.HostDataWidth(1))::type_id::create
+                              ("m_aes_halt_agent_cfg");
+
     for (int i = 0; i < NUM_HW_APPS; i++) begin
       m_edn_agent_cfg[i] = csrng_agent_cfg::type_id::create($sformatf("m_edn_agent_cfg[%0d]", i));
     end
@@ -136,37 +149,45 @@
   virtual function string convert2string();
     string str = "";
     str = {str, "\n"};
-    str = {str,  $sformatf("\n\t |************** csrng_env_cfg *****************| \t")};
-    str = {str,  $sformatf("\n\t |***** otp_en_cs_sw_app_read     : 0x%4h *****| \t",
-           otp_en_cs_sw_app_read)};
-    str = {str,  $sformatf("\n\t |***** enable                    : 0x%4h *****| \t",
-           enable)};
-    str = {str,  $sformatf("\n\t |***** sw_app_enable             : 0x%4h *****| \t",
-           sw_app_enable)};
-    str = {str,  $sformatf("\n\t |***** read_int_state            : 0x%4h *****| \t",
-           read_int_state)};
-    str = {str,  $sformatf("\n\t |***** regwen                    :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |**************** csrng_env_cfg *******************| \t")};
+    str = {str,  $sformatf("\n\t |***** otp_en_cs_sw_app_read     : %10s *****| \t",
+           otp_en_cs_sw_app_read.name())};
+    str = {str,  $sformatf("\n\t |***** lc_hw_debug_en            : %10s *****| \t",
+           lc_hw_debug_en.name())};
+    str = {str,  $sformatf("\n\t |***** enable                    : %10s *****| \t",
+           enable.name())};
+    str = {str,  $sformatf("\n\t |***** sw_app_enable             : %10s *****| \t",
+           sw_app_enable.name())};
+    str = {str,  $sformatf("\n\t |***** read_int_state            : %10s *****| \t",
+           read_int_state.name())};
+    str = {str,  $sformatf("\n\t |***** regwen                    : %10d *****| \t",
            regwen)};
-    str = {str,  $sformatf("\n\t |***** check_int_state           :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** check_int_state           : %10d *****| \t",
            check_int_state)};
-    str = {str,  $sformatf("\n\t |-------------- knobs -------------------------| \t")};
-    str = {str,  $sformatf("\n\t |***** otp_en_cs_sw_app_read_pct :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |---------------- knobs ---------------------------| \t")};
+    str = {str,  $sformatf("\n\t |***** otp_en_cs_sw_app_read_pct : %10d *****| \t",
            otp_en_cs_sw_app_read_pct) };
-    str = {str,  $sformatf("\n\t |***** regwen_pct                :   %4d *****| \t",
-           regwen_pct)};
-    str = {str,  $sformatf("\n\t |***** enable_pct                :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** lc_hw_debug_en_pct        : %10d *****| \t",
+           lc_hw_debug_en_pct) };
+    str = {str,  $sformatf("\n\t |***** enable_pct                : %10d *****| \t",
            enable_pct)};
-    str = {str,  $sformatf("\n\t |***** sw_app_enable_pct         :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** sw_app_enable_pct         : %10d *****| \t",
            sw_app_enable_pct)};
-    str = {str,  $sformatf("\n\t |***** read_int_state_pct        :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** read_int_state_pct        : %10d *****| \t",
            read_int_state_pct)};
-    str = {str,  $sformatf("\n\t |***** check_int_state_pct       :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** regwen_pct                : %10d *****| \t",
+           regwen_pct)};
+    str = {str,  $sformatf("\n\t |***** check_int_state_pct       : %10d *****| \t",
            check_int_state_pct)};
-    str = {str,  $sformatf("\n\t |***** num_cmds_min              :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** num_cmds_min              : %10d *****| \t",
            num_cmds_min)};
-    str = {str,  $sformatf("\n\t |***** num_cmds_max              :   %4d *****| \t",
+    str = {str,  $sformatf("\n\t |***** num_cmds_max              : %10d *****| \t",
            num_cmds_max)};
-    str = {str,  $sformatf("\n\t |**********************************************| \t")};
+    str = {str,  $sformatf("\n\t |***** min_aes_halt_clks         : %10d *****| \t",
+           min_aes_halt_clks)};
+    str = {str,  $sformatf("\n\t |***** max_aes_halt_clks         : %10d *****| \t",
+           max_aes_halt_clks)};
+    str = {str,  $sformatf("\n\t |**************************************************| \t")};
     str = {str, "\n"};
     return str;
   endfunction
diff --git a/hw/ip/csrng/dv/env/csrng_env_pkg.sv b/hw/ip/csrng/dv/env/csrng_env_pkg.sv
index 8f50c55..de1a607 100644
--- a/hw/ip/csrng/dv/env/csrng_env_pkg.sv
+++ b/hw/ip/csrng/dv/env/csrng_env_pkg.sv
@@ -18,6 +18,7 @@
   import prim_mubi_pkg::*;
   import entropy_src_pkg::*;
   import csrng_pkg::*;
+  import lc_ctrl_pkg::*;
 
   // macro includes
   `include "uvm_macros.svh"
@@ -34,6 +35,8 @@
   parameter uint     BLOCK_LEN        = 128;
   parameter uint     CTR_LEN          = 32;
   parameter uint     RSD_CTR_LEN      = 32;
+  parameter uint     LC_HW_DEBUG_EN_ON_DATA      = 123456789;
+  parameter uint     LC_HW_DEBUG_EN_OFF_DATA     = 987654321;
 
   // types
   typedef enum int {
diff --git a/hw/ip/csrng/dv/env/csrng_scoreboard.sv b/hw/ip/csrng/dv/env/csrng_scoreboard.sv
index 125b7c2..f92ba23 100644
--- a/hw/ip/csrng/dv/env/csrng_scoreboard.sv
+++ b/hw/ip/csrng/dv/env/csrng_scoreboard.sv
@@ -368,6 +368,12 @@
     `DV_CHECK_FATAL(uvm_hdl_check_path(cmd_arb_idx_q_path))
     forever begin
       entropy_src_fifo.get(es_item);
+      if (cfg.lc_hw_debug_en == On) begin
+        es_item.d_data = es_item.d_data ^ LC_HW_DEBUG_EN_ON_DATA;
+      end
+      else begin
+        es_item.d_data = es_item.d_data ^ LC_HW_DEBUG_EN_OFF_DATA;
+      end
       // Need to access rtl signal to determine which APP won arbitration
       `DV_CHECK(uvm_hdl_read(cmd_arb_idx_q_path, cmd_arb_idx))
       case (cmd_arb_idx)
diff --git a/hw/ip/csrng/dv/env/csrng_virtual_sequencer.sv b/hw/ip/csrng/dv/env/csrng_virtual_sequencer.sv
index e729d0d..02225bd 100644
--- a/hw/ip/csrng/dv/env/csrng_virtual_sequencer.sv
+++ b/hw/ip/csrng/dv/env/csrng_virtual_sequencer.sv
@@ -9,9 +9,9 @@
   `uvm_component_utils(csrng_virtual_sequencer)
 
   push_pull_sequencer#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH))
-    entropy_src_sequencer_h;
-
-  csrng_sequencer   edn_sequencer_h[NUM_HW_APPS];
+      entropy_src_sequencer_h;
+  push_pull_sequencer#(.HostDataWidth(1))   aes_halt_sequencer_h;
+  csrng_sequencer                           edn_sequencer_h[NUM_HW_APPS];
 
   `uvm_component_new
 
diff --git a/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv b/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv
index 1d72ec6..853b8cf 100644
--- a/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv
+++ b/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv
@@ -13,12 +13,13 @@
 
   bit                    do_csrng_init = 1'b1;
   bit [TL_DW-1:0]        rdata;
-
   virtual csrng_cov_if   cov_vif;
 
-
-  push_pull_device_seq#(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH)   m_entropy_src_pull_seq;
-  push_pull_host_seq#(csrng_pkg::CSRNG_CMD_WIDTH)                m_edn_push_seq[NUM_HW_APPS];
+  push_pull_device_seq#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH))
+      m_entropy_src_pull_seq;
+  push_pull_host_seq#(.HostDataWidth(csrng_pkg::CSRNG_CMD_WIDTH))
+      m_edn_push_seq[NUM_HW_APPS];
+  push_pull_host_seq#(.HostDataWidth(1))   m_aes_halt_pull_seq;
 
   virtual task body();
     if (!uvm_config_db#(virtual csrng_cov_if)::get(null, "*.env" , "csrng_cov_if", cov_vif)) begin
@@ -30,6 +31,7 @@
 
   virtual task dut_init(string reset_kind = "HARD");
     cfg.otp_en_cs_sw_app_read_vif.drive(.val(cfg.otp_en_cs_sw_app_read));
+    cfg.lc_hw_debug_en_vif.drive(.val(cfg.lc_hw_debug_en));
 
     super.dut_init(reset_kind);
 
@@ -52,13 +54,13 @@
     csr_update(.csr(ral.ctrl));
   endtask
 
-  task automatic wait_cmd_req_done();
+  task wait_cmd_req_done();
     csr_spinwait(.ptr(ral.intr_state.cs_cmd_req_done), .exp_data(1'b1));
     csr_rd_check(.ptr(ral.sw_cmd_sts.cmd_sts), .compare_value(1'b0));
     check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
   endtask
 
-  task automatic send_cmd_req(uint app, csrng_item cs_item);
+  task send_cmd_req(uint app, csrng_item cs_item);
     bit [csrng_pkg::CSRNG_CMD_WIDTH-1:0]   cmd;
     // Gen cmd_req
     cmd = {cs_item.glen, cs_item.flags, cs_item.clen, 1'b0, cs_item.acmd};
diff --git a/hw/ip/csrng/dv/env/seq_lib/csrng_cmds_vseq.sv b/hw/ip/csrng/dv/env/seq_lib/csrng_cmds_vseq.sv
index 354c703..4f5a96b 100644
--- a/hw/ip/csrng/dv/env/seq_lib/csrng_cmds_vseq.sv
+++ b/hw/ip/csrng/dv/env/seq_lib/csrng_cmds_vseq.sv
@@ -7,7 +7,7 @@
   `uvm_object_new
 
   csrng_item   cs_item, cs_item_q[NUM_HW_APPS + 1][$];
-  uint         num_cmds, cmds_gen, cmds_sent;
+  uint         num_cmds, cmds_gen, cmds_sent, aes_halt_clks;
   bit          uninstantiate[NUM_HW_APPS + 1];
 
   function void gen_seed(uint app);
@@ -70,6 +70,8 @@
     // Create entropy_src sequence
     m_entropy_src_pull_seq = push_pull_device_seq#(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH)::
         type_id::create("m_entropy_src_pull_seq");
+    // Create aes_halt sequence
+    m_aes_halt_pull_seq = push_pull_host_seq#(1)::type_id::create("m_aes_halt_pull_seq");
     // Create edn host sequences
     for (int i = 0; i < NUM_HW_APPS; i++) begin
       m_edn_push_seq[i] = push_pull_host_seq#(csrng_pkg::CSRNG_CMD_WIDTH)::type_id::create
@@ -108,7 +110,17 @@
         join_none;
       end
 
-      wait (cmds_sent == cmds_gen);
+      do begin
+        `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(aes_halt_clks, aes_halt_clks inside
+            { [cfg.min_aes_halt_clks:cfg.max_aes_halt_clks] };)
+        `uvm_info(`gfn, $sformatf("aes_halt_clks = %0d, cmds_sent = %0d, cmds_gen = %0d",
+                  aes_halt_clks, cmds_sent, cmds_gen), UVM_DEBUG)
+        cfg.clk_rst_vif.wait_clks(aes_halt_clks);
+        if (cfg.aes_halt) begin
+          m_aes_halt_pull_seq.start(p_sequencer.aes_halt_sequencer_h);
+        end
+      end
+      while (cmds_sent < cmds_gen);
     join
 
     // Check internal state, then uninstantiate if not already
diff --git a/hw/ip/csrng/dv/tb.sv b/hw/ip/csrng/dv/tb.sv
index 8324d4a..bfbacc1 100644
--- a/hw/ip/csrng/dv/tb.sv
+++ b/hw/ip/csrng/dv/tb.sv
@@ -8,52 +8,59 @@
   import dv_utils_pkg::*;
   import csrng_env_pkg::*;
   import csrng_test_pkg::*;
+  import prim_mubi_pkg::*;
 
   // macro includes
   `include "uvm_macros.svh"
   `include "dv_macros.svh"
 
-  wire clk, rst_n, devmode;
-  wire intr_cmd_req_done;
-  wire intr_entropy_req;
-  wire intr_hw_inst_exc;
-  wire intr_cs_fatal_err;
-  wire [NUM_MAX_INTERRUPTS-1:0] interrupts;
-  wire [7:0]                    otp_en_cs_sw_app_read;
-  csrng_pkg::csrng_req_t [NUM_HW_APPS-1:0] csrng_cmd_req;
-  csrng_pkg::csrng_rsp_t [NUM_HW_APPS-1:0] csrng_cmd_rsp;
+  wire   clk, rst_n, devmode;
+  wire   intr_cmd_req_done;
+  wire   intr_entropy_req;
+  wire   intr_hw_inst_exc;
+  wire   intr_cs_fatal_err;
+  wire[NUM_MAX_INTERRUPTS-1:0]              interrupts;
+  wire[MuBi8Width - 1:0]                    otp_en_cs_sw_app_read;
+  wire[MuBi4Width - 1:0]                    lc_hw_debug_en;
+  csrng_pkg::csrng_req_t[NUM_HW_APPS-1:0]   csrng_cmd_req;
+  csrng_pkg::csrng_rsp_t[NUM_HW_APPS-1:0]   csrng_cmd_rsp;
 
   // interfaces
   clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
   pins_if#(NUM_MAX_INTERRUPTS) intr_if(interrupts);
   pins_if#(1) devmode_if(devmode);
-  pins_if#(8) otp_en_cs_sw_app_read_if(otp_en_cs_sw_app_read);
+  pins_if#(MuBi8Width) otp_en_cs_sw_app_read_if(otp_en_cs_sw_app_read);
+  pins_if#(MuBi4Width) lc_hw_debug_en_if(lc_hw_debug_en);
   tl_if tl_if(.clk(clk), .rst_n(rst_n));
   csrng_if  csrng_if[NUM_HW_APPS](.clk(clk), .rst_n(rst_n));
   push_pull_if#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH))
       entropy_src_if(.clk(clk), .rst_n(rst_n));
+  push_pull_if#(.HostDataWidth(1))   aes_halt_if(.clk(clk), .rst_n(rst_n));
 
   `DV_ALERT_IF_CONNECT
 
   // dut
-  csrng#(.NHwApps(NUM_HW_APPS)) dut (
+  csrng#(.NHwApps(NUM_HW_APPS),
+         .RndCnstCsKeymgrDivNonProduction(LC_HW_DEBUG_EN_ON_DATA),
+         .RndCnstCsKeymgrDivProduction(LC_HW_DEBUG_EN_OFF_DATA))
+  dut (
     .clk_i                      (clk      ),
     .rst_ni                     (rst_n    ),
 
     .tl_i                       (tl_if.h2d),
     .tl_o                       (tl_if.d2h),
 
-    .otp_en_csrng_sw_app_read_i (prim_mubi_pkg::mubi8_t'(otp_en_cs_sw_app_read)),
+    .otp_en_csrng_sw_app_read_i (otp_en_cs_sw_app_read),
 
-    .lc_hw_debug_en_i           (lc_ctrl_pkg::On),
+    .lc_hw_debug_en_i           (lc_hw_debug_en),
 
     .entropy_src_hw_if_o        (entropy_src_if.req),
     .entropy_src_hw_if_i        ({entropy_src_if.ack, entropy_src_if.d_data[entropy_src_pkg::
                                   CSRNG_BUS_WIDTH-1:0], entropy_src_if.d_data[entropy_src_pkg::
                                   CSRNG_BUS_WIDTH]}),
 
-    .cs_aes_halt_i              (1'b0),
-    .cs_aes_halt_o              (),
+    .cs_aes_halt_i              (aes_halt_if.req),
+    .cs_aes_halt_o              (aes_halt_if.ack),
 
     .csrng_cmd_i                (csrng_cmd_req),
     .csrng_cmd_o                (csrng_cmd_rsp),
@@ -80,6 +87,8 @@
   assign interrupts[EntropyReq] = intr_entropy_req;
   assign interrupts[HwInstExc]  = intr_hw_inst_exc;
   assign interrupts[FifoErr]    = intr_cs_fatal_err;
+  // No data
+  assign aes_halt_if.d_data = '0;
 
   initial begin
     // Drive clk and rst_n from clk_if
@@ -87,11 +96,15 @@
     uvm_config_db#(virtual clk_rst_if)::set(null, "*.env", "clk_rst_vif", clk_rst_if);
     uvm_config_db#(intr_vif)::set(null, "*.env", "intr_vif", intr_if);
     uvm_config_db#(devmode_vif)::set(null, "*.env", "devmode_vif", devmode_if);
-    uvm_config_db#(virtual pins_if#(8))::set(null, "*.env", "otp_en_cs_sw_app_read_vif",
+    uvm_config_db#(virtual pins_if#(MuBi8Width))::set(null, "*.env", "otp_en_cs_sw_app_read_vif",
         otp_en_cs_sw_app_read_if);
+    uvm_config_db#(virtual pins_if#(MuBi4Width))::set(null, "*.env", "lc_hw_debug_en_vif",
+        lc_hw_debug_en_if);
     uvm_config_db#(virtual tl_if)::set(null, "*.env.m_tl_agent*", "vif", tl_if);
     uvm_config_db#(virtual push_pull_if#(.HostDataWidth(entropy_src_pkg::FIPS_CSRNG_BUS_WIDTH)))::
-      set(null, "*.env.m_entropy_src_agent*", "vif", entropy_src_if);
+        set(null, "*.env.m_entropy_src_agent*", "vif", entropy_src_if);
+    uvm_config_db#(virtual push_pull_if#(.HostDataWidth(1)))::set
+        (null, "*.env.m_aes_halt_agent*", "vif", aes_halt_if);
     uvm_config_db#(virtual csrng_cov_if)::set(null, "*.env", "csrng_cov_if", dut.u_csrng_cov_if );
     $timeformat(-12, 0, " ps", 12);
     run_test();
diff --git a/hw/ip/csrng/dv/tests/csrng_base_test.sv b/hw/ip/csrng/dv/tests/csrng_base_test.sv
index 258401f..f2f1e10 100644
--- a/hw/ip/csrng/dv/tests/csrng_base_test.sv
+++ b/hw/ip/csrng/dv/tests/csrng_base_test.sv
@@ -25,6 +25,7 @@
 
   virtual function void configure_env();
     cfg.otp_en_cs_sw_app_read_pct = 90;
+    cfg.lc_hw_debug_en_pct        = 50;
     cfg.regwen_pct                = 100;
     cfg.enable_pct                = 100;
     cfg.sw_app_enable_pct         = 90;
diff --git a/hw/ip/csrng/dv/tests/csrng_cmds_test.sv b/hw/ip/csrng/dv/tests/csrng_cmds_test.sv
index 4a22b07..8f6bb78 100644
--- a/hw/ip/csrng/dv/tests/csrng_cmds_test.sv
+++ b/hw/ip/csrng/dv/tests/csrng_cmds_test.sv
@@ -10,8 +10,11 @@
   function void configure_env();
     super.configure_env();
 
-    cfg.num_cmds_min = 0;
-    cfg.num_cmds_max = 20;
+    cfg.num_cmds_min      = 0;
+    cfg.num_cmds_max      = 20;
+    cfg.aes_halt_pct      = 80;
+    cfg.min_aes_halt_clks = 400;
+    cfg.max_aes_halt_clks = 600;
 
     `DV_CHECK_RANDOMIZE_FATAL(cfg)
     `uvm_info(`gfn, $sformatf("%s", cfg.convert2string()), UVM_LOW)