[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)