[edn/dv] Verify auto_req_mode

Signed-off-by: Steve Nelson <steve.nelson@wdc.com>
diff --git a/hw/dv/sv/csrng_agent/csrng_device_driver.sv b/hw/dv/sv/csrng_agent/csrng_device_driver.sv
index d4c78bf..185e264 100644
--- a/hw/dv/sv/csrng_agent/csrng_device_driver.sv
+++ b/hw/dv/sv/csrng_agent/csrng_device_driver.sv
@@ -13,7 +13,6 @@
     super.run_phase(phase);
   endtask
 
-  // TODO: drive_trans
   virtual task reset_signals();
     cfg.vif.cmd_rsp_int.csrng_rsp_ack <= 1'b0;
     cfg.vif.cmd_rsp_int.csrng_rsp_sts <= 1'b0;
diff --git a/hw/dv/sv/csrng_agent/csrng_monitor.sv b/hw/dv/sv/csrng_agent/csrng_monitor.sv
index 8086af9..6d177a9 100644
--- a/hw/dv/sv/csrng_agent/csrng_monitor.sv
+++ b/hw/dv/sv/csrng_agent/csrng_monitor.sv
@@ -59,6 +59,7 @@
     forever begin
       for (int i = 0; i <= cs_item.clen; i++) begin
         csrng_cmd_fifo.get(item);
+        `uvm_info(`gfn, $sformatf("Received cs_item: %s", item.convert2string()), UVM_HIGH)
         if (i == 0) begin
           cs_item.acmd  = acmd_e'(item.h_data[3:0]);
           cs_item.clen  = item.h_data[7:4];
@@ -77,7 +78,7 @@
         end
       end
       cfg.vif.wait_cmd_ack();
-      `uvm_info(`gfn, $sformatf("Captured cs_item: %s", cs_item.convert2string()), UVM_HIGH)
+      `uvm_info(`gfn, $sformatf("Writing analysis_port: %s", cs_item.convert2string()), UVM_HIGH)
       analysis_port.write(cs_item);
     end
   endtask
@@ -100,7 +101,8 @@
         cs_item.acmd = acmd_e'(cfg.vif.mon_cb.cmd_req.csrng_req_bus[3:0]);
         if (cs_item.acmd == csrng_pkg::GEN)
           cs_item.glen = cfg.vif.mon_cb.cmd_req.csrng_req_bus[30:12];
-        `uvm_info(`gfn, $sformatf("Captured item: %s", cs_item.convert2string()), UVM_HIGH)
+        `uvm_info(`gfn, $sformatf("Writing req_analysis_port: %s", cs_item.convert2string()),
+             UVM_HIGH)
         req_analysis_port.write(cs_item);
         // After picking up a request, wait until a response is sent before
         // detecting another request, as this is not a pipelined protocol.
diff --git a/hw/ip/edn/dv/env/edn_env_cfg.sv b/hw/ip/edn/dv/env/edn_env_cfg.sv
index 5a66f82..9cc0140 100644
--- a/hw/ip/edn/dv/env/edn_env_cfg.sv
+++ b/hw/ip/edn/dv/env/edn_env_cfg.sv
@@ -19,27 +19,43 @@
   `uvm_object_new
 
   // Knobs & Weights
-  uint   enable_pct, boot_req_mode_pct, auto_req_mode_pct;
+  uint   enable_pct, boot_req_mode_pct, auto_req_mode_pct,
+         min_num_boot_genbits, max_num_boot_genbits,
+         min_num_requests, max_num_requests,
+         min_num_reqs_between_reseeds, max_num_reqs_between_reseeds;
 
   rand mubi4_t   enable, boot_req_mode, auto_req_mode;
-  rand uint      num_endpoints;
+  rand uint      num_endpoints, num_boot_genbits, num_reqs_between_reseeds;
   rand bit [csrng_pkg::CSRNG_CMD_WIDTH - 1:0]   boot_ins_cmd, boot_gen_cmd;
 
   // Constraints
   // TODO: utilize suggestions in PR9535 to generate "other" values when testing alerts
   constraint enable_c {enable dist {
-                       MuBi4True  :/ enable_pct,
-                       MuBi4False :/ (100 - enable_pct) };}
-  constraint boot_req_mode_c {boot_req_mode dist {
-                              MuBi4True  :/ boot_req_mode_pct,
-                              MuBi4False :/ (100 - boot_req_mode_pct) };}
-  constraint auto_req_mode_c {auto_req_mode dist {
-                              MuBi4True  :/ auto_req_mode_pct,
-                              MuBi4False :/ (100 - auto_req_mode_pct) };}
+    MuBi4True  :/ enable_pct,
+    MuBi4False :/ (100 - enable_pct) };}
+
   constraint num_endpoints_c {num_endpoints dist {
-                              MIN_NUM_ENDPOINTS :/ 40,
-                              MAX_NUM_ENDPOINTS :/ 40,
-                              [MIN_NUM_ENDPOINTS + 1:MAX_NUM_ENDPOINTS - 1] :/ 20 };}
+    MIN_NUM_ENDPOINTS :/ 40,
+    MAX_NUM_ENDPOINTS :/ 40,
+    [MIN_NUM_ENDPOINTS + 1:MAX_NUM_ENDPOINTS - 1] :/ 20 };}
+
+  constraint req_mode_c {{boot_req_mode, auto_req_mode} dist {
+    {MuBi4True, MuBi4False}  :/ boot_req_mode_pct,
+    {MuBi4False, MuBi4True}  :/ auto_req_mode_pct,
+    {MuBi4False, MuBi4False} :/ (100 - boot_req_mode_pct - auto_req_mode_pct) };
+
+    if (boot_req_mode == MuBi4True) {
+      num_boot_genbits inside { [min_num_boot_genbits:max_num_boot_genbits] };
+    }
+    else {
+      num_boot_genbits == 0;}
+
+    if (auto_req_mode == MuBi4True) {
+      num_reqs_between_reseeds inside {
+          [min_num_reqs_between_reseeds:max_num_reqs_between_reseeds] };
+    }
+    else {
+      num_reqs_between_reseeds == 0;}}
 
   virtual function void initialize(bit [31:0] csr_base_addr = '1);
     list_of_alerts = edn_env_pkg::LIST_OF_ALERTS;
@@ -67,17 +83,37 @@
   virtual function string convert2string();
     string str = "";
     str = {str, "\n"};
-    str = {str,  $sformatf("\n\t |************** edn_env_cfg ****************| \t")              };
-    str = {str,  $sformatf("\n\t |***** enable             : %10d *****| \t", enable)            };
-    str = {str,  $sformatf("\n\t |***** boot_req_mode      : %10d *****| \t", boot_req_mode)     };
-    str = {str,  $sformatf("\n\t |***** auto_req_mode      : %10d *****| \t", auto_req_mode)     };
-    str = {str,  $sformatf("\n\t |***** num_endpoints      : %10d *****| \t", num_endpoints)     };
-    str = {str,  $sformatf("\n\t |---------- knobs --------------------------| \t")              };
-    str = {str,  $sformatf("\n\t |***** enable_pct         : %10d *****| \t", enable_pct)        };
-    str = {str,  $sformatf("\n\t |***** boot_req_mode_pct  : %10d *****| \t", boot_req_mode_pct) };
-    str = {str,  $sformatf("\n\t |***** auto_req_mode_pct  : %10d *****| \t", auto_req_mode_pct) };
-    str = {str,  $sformatf("\n\t |***** MAX_NUM_ENDPOINTS  : %10d *****| \t", MAX_NUM_ENDPOINTS) };
-    str = {str,  $sformatf("\n\t |*******************************************| \t")              };
+    str = {str,  $sformatf("\n\t |******************* edn_env_cfg *********************| \t")};
+    str = {str,  $sformatf("\n\t |***** enable                       : %10s *****| \t",
+        enable.name())};
+    str = {str,  $sformatf("\n\t |***** boot_req_mode                : %10s *****| \t",
+        boot_req_mode.name())};
+    str = {str,  $sformatf("\n\t |***** auto_req_mode                : %10s *****| \t",
+        auto_req_mode.name())};
+    str = {str,  $sformatf("\n\t |***** num_endpoints                : %10d *****| \t",
+        num_endpoints)};
+    str = {str,  $sformatf("\n\t |***** num_boot_genbits             : %10d *****| \t",
+        num_boot_genbits)};
+    str = {str,  $sformatf("\n\t |***** num_reqs_between_reseeds     : %10d *****| \t",
+        num_reqs_between_reseeds)};
+    str = {str,  $sformatf("\n\t |------------------- knobs ---------------------------| \t")};
+    str = {str,  $sformatf("\n\t |***** enable_pct                   : %10d *****| \t",
+        enable_pct)};
+    str = {str,  $sformatf("\n\t |***** boot_req_mode_pct            : %10d *****| \t",
+        boot_req_mode_pct)};
+    str = {str,  $sformatf("\n\t |***** auto_req_mode_pct            : %10d *****| \t",
+        auto_req_mode_pct)};
+    str = {str,  $sformatf("\n\t |***** MAX_NUM_ENDPOINTS            : %10d *****| \t",
+        MAX_NUM_ENDPOINTS)};
+    str = {str,  $sformatf("\n\t |***** min_num_boot_genbits         : %10d *****| \t",
+        min_num_boot_genbits)};
+    str = {str,  $sformatf("\n\t |***** max_num_boot_genbits         : %10d *****| \t",
+        max_num_boot_genbits)};
+    str = {str,  $sformatf("\n\t |***** min_num_reqs_between_reseeds : %10d *****| \t",
+        min_num_boot_genbits)};
+    str = {str,  $sformatf("\n\t |***** max_num_reqs_between_reseeds : %10d *****| \t",
+        max_num_boot_genbits)};
+    str = {str,  $sformatf("\n\t |*****************************************************| \t")};
     str = {str, "\n"};
     return str;
   endfunction
diff --git a/hw/ip/edn/dv/env/edn_env_pkg.sv b/hw/ip/edn/dv/env/edn_env_pkg.sv
index 94c4a6e..67f6d48 100644
--- a/hw/ip/edn/dv/env/edn_env_pkg.sv
+++ b/hw/ip/edn/dv/env/edn_env_pkg.sv
@@ -24,8 +24,7 @@
   // parameters
   parameter uint     MIN_NUM_ENDPOINTS = 1;
   parameter uint     MAX_NUM_ENDPOINTS = 7;
-  parameter uint     MIN_NUM_REQUESTS  = 4;
-  parameter uint     MAX_NUM_REQUESTS  = 32;
+  parameter uint     MIN_GLEN = 1;
   parameter string   LIST_OF_ALERTS[]  = {"recov_alert","fatal_alert"};
   parameter uint     NUM_ALERTS        = 2;
 
diff --git a/hw/ip/edn/dv/env/edn_scoreboard.sv b/hw/ip/edn/dv/env/edn_scoreboard.sv
index a89c67b..39170f8 100644
--- a/hw/ip/edn/dv/env/edn_scoreboard.sv
+++ b/hw/ip/edn/dv/env/edn_scoreboard.sv
@@ -111,6 +111,12 @@
       end
       "sum_sts": begin
       end
+      "generate_cmd": begin
+      end
+      "reseed_cmd": begin
+      end
+      "max_num_reqs_between_reseeds": begin
+      end
       default: begin
         `uvm_fatal(`gfn, $sformatf("invalid csr: %0s", csr.get_full_name()))
       end
diff --git a/hw/ip/edn/dv/env/seq_lib/edn_base_vseq.sv b/hw/ip/edn/dv/env/seq_lib/edn_base_vseq.sv
index 015d2b3..e9354df 100644
--- a/hw/ip/edn/dv/env/seq_lib/edn_base_vseq.sv
+++ b/hw/ip/edn/dv/env/seq_lib/edn_base_vseq.sv
@@ -9,14 +9,11 @@
     .VIRTUAL_SEQUENCER_T (edn_virtual_sequencer)
   );
   `uvm_object_utils(edn_base_vseq)
-
   `uvm_object_new
 
   bit do_edn_init = 1'b1;
   bit [csrng_pkg::GENBITS_BUS_WIDTH - 1:0]      genbits;
   bit [entropy_src_pkg::FIPS_BUS_WIDTH - 1:0]   fips;
-  bit [3:0]                                     acmd, clen, flags;
-  bit [17:0]                                    glen;
 
   virtual edn_cov_if   cov_vif;
 
@@ -42,8 +39,6 @@
     csrng_device_seq   m_dev_seq;
 
     m_dev_seq = csrng_device_seq::type_id::create("m_dev_seq");
-    `uvm_info(`gfn, "Start csrng_device sequence", UVM_DEBUG)
-
     fork
       m_dev_seq.start(p_sequencer.csrng_sequencer_h);
     join_none
@@ -51,12 +46,11 @@
 
   virtual task edn_init(string reset_kind = "HARD");
     if (cfg.boot_req_mode == MuBi4True) begin
-      // TODO: Randomize boot_ins_cmd/boot_gen_cmd
-      cfg.boot_ins_cmd = 32'h1;
-      csr_wr(.ptr(ral.boot_ins_cmd), .value(cfg.boot_ins_cmd));
-      cfg.boot_gen_cmd = 32'h1003;
-      csr_wr(.ptr(ral.boot_gen_cmd), .value(cfg.boot_gen_cmd));
+      wr_cmd(.cmd_type("boot_ins"), .acmd(csrng_pkg::INS), .clen(0), .flags(0), .glen(0));
+      wr_cmd(.cmd_type("boot_gen"), .acmd(csrng_pkg::GEN), .clen(0), .flags(0),
+             .glen(cfg.num_boot_genbits));
     end
+
     // Enable edn, set modes
     ral.ctrl.edn_enable.set(cfg.enable);
     ral.ctrl.boot_req_mode.set(cfg.boot_req_mode);
@@ -69,4 +63,26 @@
     // TODO
   endtask
 
+  virtual task wr_cmd(string cmd_type, csrng_pkg::acmd_e acmd,
+                      bit[3:0] clen, bit[3:0] flags, bit[17:0] glen);
+    case (cmd_type)
+      "boot_ins": csr_wr(.ptr(ral.boot_ins_cmd), .value({glen, flags, clen, 1'b0, acmd}));
+      "boot_gen": csr_wr(.ptr(ral.boot_gen_cmd), .value({glen, flags, clen, 1'b0, acmd}));
+      "generate": csr_wr(.ptr(ral.generate_cmd), .value({glen, flags, clen, 1'b0, acmd}));
+      "reseed"  : csr_wr(.ptr(ral.reseed_cmd), .value({glen, flags, clen, 1'b0, acmd}));
+      "sw"      : begin
+                    csr_spinwait(.ptr(ral.sw_cmd_sts.cmd_rdy), .exp_data(1'b1));
+                    csr_wr(.ptr(ral.sw_cmd_req), .value({glen, flags, clen, 1'b0, acmd}));
+                    wait_cmd_req_done();
+                  end
+      default   : `uvm_fatal(`gfn, $sformatf("Invalid cmd_type: %0s", cmd_type))
+    endcase
+  endtask
+
+  virtual task wait_cmd_req_done();
+    // Expect/Clear interrupt bit
+    csr_spinwait(.ptr(ral.intr_state.edn_cmd_req_done), .exp_data(1'b1));
+    check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
+  endtask
+
 endclass : edn_base_vseq
diff --git a/hw/ip/edn/dv/env/seq_lib/edn_genbits_vseq.sv b/hw/ip/edn/dv/env/seq_lib/edn_genbits_vseq.sv
index 1cb769c..8cfc0fe 100644
--- a/hw/ip/edn/dv/env/seq_lib/edn_genbits_vseq.sv
+++ b/hw/ip/edn/dv/env/seq_lib/edn_genbits_vseq.sv
@@ -4,41 +4,17 @@
 
 class edn_genbits_vseq extends edn_base_vseq;
   `uvm_object_utils(edn_genbits_vseq)
-
   `uvm_object_new
 
-  push_pull_host_seq#(edn_pkg::FIPS_ENDPOINT_BUS_WIDTH)   m_endpoint_pull_seq[MAX_NUM_ENDPOINTS];
+  push_pull_host_seq#(edn_pkg::FIPS_ENDPOINT_BUS_WIDTH)
+      m_endpoint_pull_seq[MAX_NUM_ENDPOINTS];
 
-  uint   boot_requester, num_requesters, num_requests, num_requests_q[$], endpoint_q[$];
+  uint   num_requesters, num_requests, num_genbits, endpoint_q[$];
 
   task body();
     super.body();
 
-    // TODO: Test auto_req_mode
-    `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(boot_requester,
-                                       boot_requester inside { [0:cfg.num_endpoints - 1] };)
-    m_endpoint_pull_seq[boot_requester] = push_pull_host_seq#(edn_pkg::FIPS_ENDPOINT_BUS_WIDTH)::
-        type_id::create($sformatf("m_endpoint_pull_seq[%0d]", boot_requester));
-
-    // Verify boot_req_mode cmds, continue after disable
-    if (cfg.boot_req_mode == MuBi4True) begin
-      m_endpoint_pull_seq[boot_requester].num_trans =
-          csrng_pkg::GENBITS_BUS_WIDTH/ENDPOINT_BUS_WIDTH;
-      m_endpoint_pull_seq[boot_requester].start(p_sequencer.endpoint_sequencer_h[boot_requester]);
-    end
-
-    // Wait for cmd_rdy
-    csr_spinwait(.ptr(ral.sw_cmd_sts.cmd_rdy), .exp_data(1'b1));
-
-    // Create/Send INS cmd
-    acmd  = csrng_pkg::INS;
-    csr_wr(.ptr(ral.sw_cmd_req), .value({glen, flags, clen, acmd}));
-
-    // Expect/Clear interrupt bit
-    csr_spinwait(.ptr(ral.intr_state.edn_cmd_req_done), .exp_data(1'b1));
-    check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
-
-    // Determine which endpoints requesting
+    // Determine which endpoints are requesting
     for (int i = 0; i < cfg.num_endpoints; i++) begin
       endpoint_q.push_back(i);
     end
@@ -47,34 +23,25 @@
                                        num_requesters inside { [1:cfg.num_endpoints] };)
     endpoint_q = endpoint_q[0:num_requesters - 1];
 
-    // Calculate num_requests -> glen
     for (int i = 0; i < num_requesters; i++) begin
+      // Calculate num_requests -> glen
       `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(num_requests,
                                          num_requests inside
-                                             { [MIN_NUM_REQUESTS:MAX_NUM_REQUESTS] };
+                                             { [cfg.min_num_requests:cfg.max_num_requests] };
                                          num_requests % 4 == 0;)
-      num_requests_q.push_back(num_requests);
-      glen += num_requests/4;
-    end
+      num_genbits += num_requests/4;
 
-    // Load genbits_agent
-    for (int i = 0; i < glen; i++) begin
-      `DV_CHECK_STD_RANDOMIZE_FATAL(fips)
-      `DV_CHECK_STD_RANDOMIZE_FATAL(genbits)
-      cfg.m_csrng_agent_cfg.m_genbits_push_agent_cfg.add_h_user_data({fips, genbits});
-    end
+      if ((i == 0) && (cfg.boot_req_mode == MuBi4True)) begin
+        // TODO: Not hard-coded 4
+        num_requests += cfg.num_boot_genbits * 4;
+      end
 
-    // Create/configure endpoint_pull sequences
-    for (int i = 0; i < num_requesters; i++) begin
+      // Create/Configure endpoint_pull_seq
       m_endpoint_pull_seq[endpoint_q[i]] = push_pull_host_seq#(FIPS_ENDPOINT_BUS_WIDTH)::
           type_id::create($sformatf("m_endpoint_pull_seq[%0d]", endpoint_q[i]));
-      m_endpoint_pull_seq[endpoint_q[i]].num_trans = num_requests_q[i];
+      m_endpoint_pull_seq[endpoint_q[i]].num_trans = num_requests;
     end
 
-    // Create/Send GEN cmd
-    acmd  = csrng_pkg::GEN;
-    csr_wr(.ptr(ral.sw_cmd_req), .value({glen, flags, clen, acmd}));
-
     // Start endpoint_pull sequences
     for (int i = 0; i < num_requesters; i++) begin
       automatic int j = i;
@@ -86,9 +53,30 @@
       join_none;
     end
 
-    // Expect/Clear interrupt bit
-    csr_spinwait(.ptr(ral.intr_state.edn_cmd_req_done), .exp_data(1'b1));
-    check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
+    if (cfg.auto_req_mode == MuBi4True) begin
+      // TODO: Doesn't test functionality of max_num_reqs_between_reseeds register
+      csr_wr(.ptr(ral.max_num_reqs_between_reseeds), .value(cfg.num_reqs_between_reseeds));
+      wr_cmd(.cmd_type("reseed"), .acmd(csrng_pkg::RES), .clen(0), .flags(0), .glen(0));
+      wr_cmd(.cmd_type("generate"), .acmd(csrng_pkg::GEN), .clen(0), .flags(4'hF),
+             // .glen(MIN_GLEN));
+             .glen(num_genbits));
+    end
+
+    // TODO: Make num_requests not 4*num_genbits
+    if (cfg.boot_req_mode != MuBi4True) begin
+      // Send instantiate cmd
+      wr_cmd(.cmd_type("sw"), .acmd(csrng_pkg::INS), .clen(0), .flags(4'hF), .glen(0));
+    end
+
+    if (cfg.auto_req_mode != MuBi4True) begin
+      // Send generate cmd
+      wr_cmd(.cmd_type("sw"), .acmd(csrng_pkg::GEN), .clen(0), .flags(1), .glen(num_genbits));
+    end
+
+    if (cfg.auto_req_mode == MuBi4True) begin
+      ral.ctrl.auto_req_mode.set(MuBi4False);
+      csr_update(.csr(ral.ctrl));
+    end
   endtask
 
 endclass
diff --git a/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv b/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv
index 71f220e..f755006 100644
--- a/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv
+++ b/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv
@@ -12,64 +12,23 @@
   task body();
     super.body();
 
+    // Create single endpoint sequence
     m_endpoint_pull_seq[0] = push_pull_host_seq#(edn_pkg::FIPS_ENDPOINT_BUS_WIDTH)::type_id::
         create("m_endpoint_pull_seq[0]");
 
-    // Verify boot_req_mode cmds, continue after disable
-    if (cfg.boot_req_mode == MuBi4True) begin
-      m_endpoint_pull_seq[0].num_trans = csrng_pkg::GENBITS_BUS_WIDTH/ENDPOINT_BUS_WIDTH;
-      m_endpoint_pull_seq[0].start(p_sequencer.endpoint_sequencer_h[0]);
-    end
-
-    // Wait for cmd_rdy
-    csr_spinwait(.ptr(ral.sw_cmd_sts.cmd_rdy), .exp_data(1'b1));
-
-    // Create/Send INS cmd
-    acmd  = csrng_pkg::INS;
-    flags = 'h1;
-    glen  = 'h0;
-    csr_wr(.ptr(ral.sw_cmd_req), .value({glen, flags, clen, acmd}));
-
-    // Expect/Clear interrupt bit
-    csr_spinwait(.ptr(ral.intr_state.edn_cmd_req_done), .exp_data(1'b1));
-    check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
-
-    // Load genbits_agent
-    `DV_CHECK_STD_RANDOMIZE_FATAL(fips)
-    `DV_CHECK_STD_RANDOMIZE_FATAL(genbits)
-    `uvm_info(`gfn, $sformatf("{fips, genbits} = %0h", {fips, genbits}), UVM_DEBUG)
-    cfg.m_csrng_agent_cfg.m_genbits_push_agent_cfg.add_h_user_data({fips, genbits});
-
-    // Wait for cmd_rdy
-    csr_spinwait(.ptr(ral.sw_cmd_sts.cmd_rdy), .exp_data(1'b1));
-
-    // Create/Send GEN cmd
-    acmd  = csrng_pkg::GEN;
-    flags = 'h0;
-    glen  = 'h1;
-    csr_wr(.ptr(ral.sw_cmd_req), .value({glen, flags, clen, acmd}));
+    // Send instantiate cmd
+    wr_cmd(.cmd_type("sw"), .acmd(csrng_pkg::INS), .clen(0), .flags(0), .glen(0));
 
     // Request data
     m_endpoint_pull_seq[0] = push_pull_host_seq#(edn_pkg::FIPS_ENDPOINT_BUS_WIDTH)::type_id::
         create("m_endpoint_pull_seq[0]");
     m_endpoint_pull_seq[0].num_trans = csrng_pkg::GENBITS_BUS_WIDTH/ENDPOINT_BUS_WIDTH;
-    m_endpoint_pull_seq[0].start(p_sequencer.endpoint_sequencer_h[0]);
+    fork
+      m_endpoint_pull_seq[0].start(p_sequencer.endpoint_sequencer_h[0]);
+    join_none
 
-    // Expect/Clear interrupt bit
-    csr_spinwait(.ptr(ral.intr_state.edn_cmd_req_done), .exp_data(1'b1));
-    check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
-
-    // Create/Send GEN cmd
-    acmd  = csrng_pkg::UNI;
-    clen  = 'h0;
-    flags = 'h0;
-    glen  = 'h0;
-    csr_wr(.ptr(ral.sw_cmd_req), .value({glen, flags, clen, acmd}));
-
-    // Expect/Clear interrupt bit
-    csr_spinwait(.ptr(ral.intr_state.edn_cmd_req_done), .exp_data(1'b1));
-    check_interrupts(.interrupts((1 << CmdReqDone)), .check_set(1'b1));
-
+    // Send generate cmd
+    wr_cmd(.cmd_type("sw"), .acmd(csrng_pkg::GEN), .clen(0), .flags(0), .glen(1));
   endtask
 
 endclass
diff --git a/hw/ip/edn/dv/tests/edn_base_test.sv b/hw/ip/edn/dv/tests/edn_base_test.sv
index 29d69a1..47768ae 100644
--- a/hw/ip/edn/dv/tests/edn_base_test.sv
+++ b/hw/ip/edn/dv/tests/edn_base_test.sv
@@ -24,9 +24,7 @@
   // the run_phase; as such, nothing more needs to be done
 
   virtual function void configure_env();
-    cfg.enable_pct        = 100;
-    // TODO: Set percentage after PR#10339
-    cfg.boot_req_mode_pct = 0;
+    cfg.enable_pct = 100;
 
     cfg.m_csrng_agent_cfg.cmd_ack_zero_delays = 0; // Can't handle cmd ack too soon after req
     cfg.m_csrng_agent_cfg.min_cmd_ack_dly     = 4;
diff --git a/hw/ip/edn/dv/tests/edn_genbits_test.sv b/hw/ip/edn/dv/tests/edn_genbits_test.sv
index 74e8d73..62c73fd 100644
--- a/hw/ip/edn/dv/tests/edn_genbits_test.sv
+++ b/hw/ip/edn/dv/tests/edn_genbits_test.sv
@@ -10,6 +10,15 @@
   function void configure_env();
     super.configure_env();
 
+    cfg.boot_req_mode_pct = 30;
+    cfg.auto_req_mode_pct = 30;
+    cfg.min_num_boot_genbits = 1;
+    cfg.max_num_boot_genbits = 4;
+    cfg.min_num_reqs_between_reseeds = 1;
+    cfg.max_num_reqs_between_reseeds = 1;
+    cfg.min_num_requests = 4;
+    cfg.max_num_requests = 16;
+
     `DV_CHECK_RANDOMIZE_FATAL(cfg)
     `uvm_info(`gfn, $sformatf("%s", cfg.convert2string()), UVM_HIGH)
   endfunction