[csrng/dv] More randomization for cmd sequence generation
Signed-off-by: Steve Nelson <steve.nelson@wdc.com>
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 652f588..28caece 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
@@ -11,7 +11,39 @@
csrng_item cs_item, cs_item_clone, cs_item_q[NUM_HW_APPS][$];
uint cmds_gen, cmds_sent;
bit [csrng_pkg::GENBITS_BUS_WIDTH-1:0] genbits;
- bit uninstantiate;
+
+ function void create_cmds(uint hwapp);
+ bit uninstantiate;
+
+ // Start with instantiate command
+ `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
+ cs_item.acmd == csrng_pkg::INS;
+ )
+ `downcast(cs_item_clone, cs_item.clone());
+ cs_item_q[hwapp].push_back(cs_item_clone);
+
+ // Generate other commands
+ for (int i = 0; i < 10; i++) begin
+ `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
+ cs_item.acmd inside { csrng_pkg::GEN,
+ csrng_pkg::RES,
+ csrng_pkg::UPD
+ };)
+ `downcast(cs_item_clone, cs_item.clone());
+ cs_item_q[hwapp].push_back(cs_item_clone);
+ end
+
+ // If no uninstantiate command, internal state is non-zero
+ `DV_CHECK_STD_RANDOMIZE_FATAL(uninstantiate)
+
+ if (uninstantiate) begin
+ `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
+ cs_item.acmd == csrng_pkg::UNI;
+ )
+ `downcast(cs_item_clone, cs_item.clone());
+ cs_item_q[hwapp].push_back(cs_item_clone);
+ end
+ endfunction
task body();
// TODO: Add/randomize other commands. Use/add prediction for entropy from entropy_src agent.
@@ -21,66 +53,22 @@
create("m_entropy_src_pull_seq");
// Create csrng_cmd host sequences and cs_item
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($sformatf("m_edn_push_seq[%0d]", i));
- cs_item = csrng_item::type_id::create("cs_item");
+ m_edn_push_seq[i] = push_pull_host_seq#(csrng_pkg::CSRNG_CMD_WIDTH)::type_id::create
+ ($sformatf("m_edn_push_seq[%0d]", i));
+ cs_item = csrng_item::type_id::create("cs_item");
end
// Generate queues of csrng commands
- // TODO: Create function for random generation of sequence of commands
for (int i = 0; i < NUM_HW_APPS; i++) begin
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::INS;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
-
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::GEN;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
-
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::RES;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
-
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::GEN;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
-
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::UPD;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
-
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::GEN;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
-
- // Randomize whether to add an uninstantiate command so internal state is non-zero
- `DV_CHECK_STD_RANDOMIZE_FATAL(uninstantiate)
-
- if (uninstantiate) begin
- `DV_CHECK_RANDOMIZE_WITH_FATAL(cs_item,
- cs_item.acmd == csrng_pkg::UNI;
- )
- `downcast(cs_item_clone, cs_item.clone());
- cs_item_q[i].push_back(cs_item_clone);
- end
+ create_cmds(i);
end
// Print cs_items
for (int i = 0; i < NUM_HW_APPS; i++) begin
foreach (cs_item_q[i][j]) begin
cmds_gen += 1;
- `uvm_info(`gfn, $sformatf("cs_item_q[%0d][%0d]: %s", i, j, cs_item_q[i][j].convert2string()), UVM_DEBUG)
+ `uvm_info(`gfn, $sformatf("cs_item_q[%0d][%0d]: %s", i, j, cs_item_q[i][j].convert2string()),
+ UVM_DEBUG)
end
end