[dv/lc_ctrl] add rma and clk_byp response

This PR adds rsp sequence to rma and clk_byp requests.
The response includes an error bit that can cause error cases in
response. The error case will be used in later sequence.

Signed-off-by: Cindy Chen <chencindy@google.com>
diff --git a/hw/ip/lc_ctrl/dv/env/lc_ctrl_if.sv b/hw/ip/lc_ctrl/dv/env/lc_ctrl_if.sv
index a25fe2a..e728315 100644
--- a/hw/ip/lc_ctrl/dv/env/lc_ctrl_if.sv
+++ b/hw/ip/lc_ctrl/dv/env/lc_ctrl_if.sv
@@ -25,10 +25,18 @@
   lc_ctrl_pkg::lc_tx_t lc_escalate_en_o;
   lc_ctrl_pkg::lc_tx_t lc_check_byp_en_o;
 
-  lc_ctrl_pkg::lc_keymgr_div_t lc_keymgr_div_o;
+  lc_ctrl_pkg::lc_tx_t clk_byp_req_o;
+  lc_ctrl_pkg::lc_tx_t clk_byp_ack_i;
+  lc_ctrl_pkg::lc_tx_t flash_rma_req_o;
+  lc_ctrl_pkg::lc_tx_t flash_rma_ack_i;
+
+  lc_ctrl_pkg::lc_keymgr_div_t     keymgr_div_o;
+  lc_ctrl_pkg::lc_flash_rma_seed_t flash_rma_seed_o;
 
   task automatic init(lc_ctrl_pkg::lc_state_e lc_state = LcStRaw,
-                      lc_ctrl_pkg::lc_cnt_e   lc_cnt = LcCntRaw);
+                      lc_ctrl_pkg::lc_cnt_e   lc_cnt = LcCntRaw,
+                      lc_ctrl_pkg::lc_tx_t    clk_byp_ack = lc_ctrl_pkg::Off,
+                      lc_ctrl_pkg::lc_tx_t    flash_rma_ack = lc_ctrl_pkg::Off);
     otp_i.valid = 1;
     otp_i.state = lc_state;
     otp_i.count = lc_cnt;
@@ -41,6 +49,17 @@
 
     otp_hw_cfg_i.valid = lc_ctrl_pkg::Off;
     otp_hw_cfg_i.data = 0;
+
+    clk_byp_ack_i = clk_byp_ack;
+    flash_rma_ack_i = flash_rma_ack;
+  endtask
+
+  task automatic set_clk_byp_ack(lc_ctrl_pkg::lc_tx_t val);
+    clk_byp_ack_i = val;
+  endtask
+
+  task automatic set_flash_rma_ack(lc_ctrl_pkg::lc_tx_t val);
+    flash_rma_ack_i = val;
   endtask
 
 endinterface
diff --git a/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_base_vseq.sv b/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_base_vseq.sv
index 9552239..343d48a 100644
--- a/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_base_vseq.sv
+++ b/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_base_vseq.sv
@@ -58,6 +58,44 @@
     super.read_and_check_all_csrs_after_reset();
   endtask
 
+  virtual task run_clk_byp_rsp_nonblocking(bit has_err = 0);
+    fork
+      forever begin
+        lc_ctrl_pkg::lc_tx_t rsp;
+        wait(cfg.lc_ctrl_vif.clk_byp_req_o == lc_ctrl_pkg::On);
+        rsp = (has_err) ? $urandom_range(0, 1) ? lc_ctrl_pkg::On : lc_ctrl_pkg::Off :
+                          lc_ctrl_pkg::On;
+        cfg.clk_rst_vif.wait_clks($urandom_range(0, 20));
+        cfg.lc_ctrl_vif.set_clk_byp_ack(rsp);
+
+        wait (cfg.lc_ctrl_vif.clk_byp_req_o != lc_ctrl_pkg::On);
+        rsp = (has_err) ? $urandom_range(0, 1) ? lc_ctrl_pkg::On : lc_ctrl_pkg::Off :
+                          lc_ctrl_pkg::Off;
+        cfg.clk_rst_vif.wait_clks($urandom_range(0, 20));
+        cfg.lc_ctrl_vif.set_clk_byp_ack(rsp);
+      end
+    join_none
+  endtask
+
+  virtual task run_flash_rma_rsp_nonblocking(bit has_err = 0);
+    fork
+      forever begin
+        lc_ctrl_pkg::lc_tx_t rsp;
+        wait(cfg.lc_ctrl_vif.flash_rma_req_o == lc_ctrl_pkg::On);
+        rsp = (has_err) ? $urandom_range(0, 1) ? lc_ctrl_pkg::On : lc_ctrl_pkg::Off :
+                          lc_ctrl_pkg::On;
+        cfg.clk_rst_vif.wait_clks($urandom_range(0, 20));
+        cfg.lc_ctrl_vif.set_flash_rma_ack(rsp);
+
+        wait (cfg.lc_ctrl_vif.flash_rma_req_o != lc_ctrl_pkg::On);
+        rsp = (has_err) ? $urandom_range(0, 1) ? lc_ctrl_pkg::On : lc_ctrl_pkg::Off :
+                          lc_ctrl_pkg::Off;
+        cfg.clk_rst_vif.wait_clks($urandom_range(0, 20));
+        cfg.lc_ctrl_vif.set_flash_rma_ack(rsp);
+      end
+    join_none
+  endtask
+
   virtual task sw_transition_req(bit [TL_DW-1:0] next_lc_state, bit [TL_DW*3-1:0] token_val);
     csr_wr(ral.claim_transition_if, CLAIM_TRANS_VAL);
     csr_wr(ral.transition_target, next_lc_state);
diff --git a/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_smoke_vseq.sv b/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_smoke_vseq.sv
index efb92db..1a1f56e 100644
--- a/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_smoke_vseq.sv
+++ b/hw/ip/lc_ctrl/dv/env/seq_lib/lc_ctrl_smoke_vseq.sv
@@ -8,13 +8,23 @@
 
   `uvm_object_new
 
+  rand bit clk_byp_error_rsp;
+  rand bit flash_rma_error_rsp;
   dec_lc_state_e next_lc_state;
 
   constraint lc_cnt_c {
     lc_state != LcStRaw -> lc_cnt != LcCntRaw;
   }
 
+  constraint no_err_rsps_c {
+    clk_byp_error_rsp   == 0;
+    flash_rma_error_rsp == 0;
+  }
+
   task body();
+    run_clk_byp_rsp_nonblocking(clk_byp_error_rsp);
+    run_flash_rma_rsp_nonblocking(flash_rma_error_rsp);
+
     for (int i = 1; i <= num_trans; i++) begin
       if (i != 1) dut_init();
       `uvm_info(`gfn, $sformatf("starting seq %0d/%0d, init LC_state is %0s, LC_cnt is %0s",
@@ -43,8 +53,7 @@
   // need to randomize here because associative array's index cannot be a rand input in constraint
   virtual function void randomize_next_lc_state(dec_lc_state_e curr_lc_state);
     `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(next_lc_state,
-        // TODO: temp constraint for no DecLcStRma
-        next_lc_state inside {VALID_NEXT_STATES[curr_lc_state]}; next_lc_state != DecLcStRma;)
+        next_lc_state inside {VALID_NEXT_STATES[curr_lc_state]};)
   endfunction
 
 endclass : lc_ctrl_smoke_vseq
diff --git a/hw/ip/lc_ctrl/dv/tb.sv b/hw/ip/lc_ctrl/dv/tb.sv
index 351cfed..818aeaa 100644
--- a/hw/ip/lc_ctrl/dv/tb.sv
+++ b/hw/ip/lc_ctrl/dv/tb.sv
@@ -84,14 +84,14 @@
     .lc_escalate_en_o           (lc_ctrl_if.lc_escalate_en_o),
     .lc_check_byp_en_o          (lc_ctrl_if.lc_check_byp_en_o),
 
-    .lc_clk_byp_req_o           (),
-    .lc_clk_byp_ack_i           (lc_ctrl_pkg::On),
+    .lc_clk_byp_req_o           (lc_ctrl_if.clk_byp_req_o),
+    .lc_clk_byp_ack_i           (lc_ctrl_if.clk_byp_ack_i),
 
-    .lc_flash_rma_seed_o        (),
-    .lc_flash_rma_req_o         (),
-    .lc_flash_rma_ack_i         (lc_ctrl_pkg::Off),
+    .lc_flash_rma_seed_o        (lc_ctrl_if.flash_rma_seed_o),
+    .lc_flash_rma_req_o         (lc_ctrl_if.flash_rma_req_o),
+    .lc_flash_rma_ack_i         (lc_ctrl_if.flash_rma_ack_i),
 
-    .lc_keymgr_div_o            (lc_ctrl_if.lc_keymgr_div_o),
+    .lc_keymgr_div_o            (lc_ctrl_if.keymgr_div_o),
 
     .otp_hw_cfg_i               (lc_ctrl_if.otp_hw_cfg_i)
   );