[dv/lc_ctrl] update tb with new lc outputs
Recent LC_CTRL added a few new outputs, this PR added all outputs in
tb.sv and check their value via scb.
Signed-off-by: Cindy Chen <chencindy@google.com>
diff --git a/hw/ip/lc_ctrl/dv/env/lc_ctrl_env_pkg.sv b/hw/ip/lc_ctrl/dv/env/lc_ctrl_env_pkg.sv
index 6e26e70..85f36f2 100644
--- a/hw/ip/lc_ctrl/dv/env/lc_ctrl_env_pkg.sv
+++ b/hw/ip/lc_ctrl/dv/env/lc_ctrl_env_pkg.sv
@@ -30,45 +30,51 @@
lc_ctrl_pkg::lc_tx_e lc_nvm_debug_en_o;
lc_ctrl_pkg::lc_tx_e lc_hw_debug_en_o;
lc_ctrl_pkg::lc_tx_e lc_cpu_en_o;
+ lc_ctrl_pkg::lc_tx_e lc_creator_seed_sw_rw_en_o;
+ lc_ctrl_pkg::lc_tx_e lc_owner_seed_sw_rw_en_o;
+ lc_ctrl_pkg::lc_tx_e lc_seed_hw_rd_en_o;
+ lc_ctrl_pkg::lc_tx_e lc_iso_part_sw_rd_en_o;
+ lc_ctrl_pkg::lc_tx_e lc_iso_part_sw_wr_en_o;
lc_ctrl_pkg::lc_tx_e lc_keymgr_en_o;
lc_ctrl_pkg::lc_tx_e lc_escalate_en_o;
} lc_outputs_t;
const lc_outputs_t EXP_LC_OUTPUTS[NUM_STATES] = {
- // Order: lc_dft_en_o, lc_nvm_debug_en_o, lc_hw_debug_en_o, lc_cpu_en_o, lc_keymgr_en_o,
- // lc_escalate_en_o
// Raw (fixed size array index 0)
- {Off, Off, Off, Off, Off, Off},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off},
// TestUnlock0
- {On, On, On, On, Off, Off},
+ {On, On, On, On, Off, Off, Off, Off, On, Off, Off},
// TestLock0
- {Off, Off, Off, Off, Off, Off},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off},
// TestUnlock1
- {On, On, On, On, Off, Off},
+ {On, On, On, On, Off, Off, Off, Off, On, Off, Off},
// TestLock1
- {Off, Off, Off, Off, Off, Off},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off},
// TestUnlock2
- {On, On, On, On, Off, Off},
+ {On, On, On, On, Off, Off, Off, Off, On, Off, Off},
// TestLock2
- {Off, Off, Off, Off, Off, Off},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off},
// TestUnlock3
- {On, On, On, On, Off, Off},
- // Dev
- {Off, Off, On, On, On, Off},
- // Prod
- {Off, Off, Off, On, On, Off},
- // ProdEnd
- {Off, Off, Off, On, On, Off},
+ {On, On, On, On, Off, Off, Off, Off, On, Off, Off},
+ // Dev: lc_creator_seed_sw_rw_en_o (On if device is not personalized),
+ // lc_seed_hw_rd_en_o (On if device is personalized)
+ {Off, Off, On, On, On, On, On, On, On, On, Off},
+ // Prod: lc_creator_seed_sw_rw_en_o (On if device is not personalized),
+ // lc_seed_hw_rd_en_o (On if device is personalized)
+ {Off, Off, Off, On, On, On, On, On, On, On, Off},
+ // ProdEnd: lc_creator_seed_sw_rw_en_o (On if device is not personalized),
+ // lc_seed_hw_rd_en_o (On if device is personalized)
+ {Off, Off, Off, On, On, On, On, On, On, On, Off},
// Rma
- {On, On, On, On, On, Off},
+ {On, On, On, On, On, On, On, On, On, On, Off},
// Scrap
- {Off, Off, Off, Off, Off, Off},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off},
// PostTrans
- {Off, Off, Off, Off, Off, Off},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off},
// Escalate
- {Off, Off, Off, Off, Off, On},
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, On},
// Invalid
- {Off, Off, Off, Off, Off, Off}
+ {Off, Off, Off, Off, Off, Off, Off, Off, Off, Off, Off}
};
// associative array cannot declare parameter here, so we used const instead
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 db976b8..dd14862 100644
--- a/hw/ip/lc_ctrl/dv/env/lc_ctrl_if.sv
+++ b/hw/ip/lc_ctrl/dv/env/lc_ctrl_if.sv
@@ -7,14 +7,22 @@
import lc_ctrl_pkg::*;
import otp_ctrl_pkg::*;
+ import otp_ctrl_part_pkg::*;
- otp_ctrl_pkg::otp_lc_data_t otp_i;
- lc_ctrl_pkg::lc_tx_t lc_dft_en_o;
- lc_ctrl_pkg::lc_tx_t lc_nvm_debug_en_o;
- lc_ctrl_pkg::lc_tx_t lc_hw_debug_en_o;
- lc_ctrl_pkg::lc_tx_t lc_cpu_en_o;
- lc_ctrl_pkg::lc_tx_t lc_keymgr_en_o;
- lc_ctrl_pkg::lc_tx_t lc_escalate_en_o;
+ otp_ctrl_pkg::otp_lc_data_t otp_i;
+ otp_ctrl_part_pkg::otp_hw_cfg_t otp_hw_cfg_i;
+
+ lc_ctrl_pkg::lc_tx_t lc_dft_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_nvm_debug_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_hw_debug_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_cpu_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_creator_seed_sw_rw_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_owner_seed_sw_rw_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_iso_part_sw_rd_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_iso_part_sw_wr_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_seed_hw_rd_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_keymgr_en_o;
+ lc_ctrl_pkg::lc_tx_t lc_escalate_en_o;
task automatic init(lc_ctrl_pkg::lc_state_e lc_state = LcStRaw,
lc_ctrl_pkg::lc_cnt_e lc_cnt = LcCntRaw);
@@ -27,6 +35,9 @@
otp_i.test_exit_token = 0;
otp_i.rma_token = 0;
otp_i.id_state = LcIdBlank;
+
+ otp_hw_cfg_i.valid = lc_ctrl_pkg::Off;
+ otp_hw_cfg_i.data = 0;
endtask
endinterface
diff --git a/hw/ip/lc_ctrl/dv/env/lc_ctrl_scoreboard.sv b/hw/ip/lc_ctrl/dv/env/lc_ctrl_scoreboard.sv
index 0473aab..dd3362b 100644
--- a/hw/ip/lc_ctrl/dv/env/lc_ctrl_scoreboard.sv
+++ b/hw/ip/lc_ctrl/dv/env/lc_ctrl_scoreboard.sv
@@ -10,7 +10,7 @@
`uvm_component_utils(lc_ctrl_scoreboard)
// local variables
-
+ bit is_personalized = 0;
// TLM agent fifos
// local queues to hold incoming packets pending comparison
@@ -47,6 +47,27 @@
`DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_cpu_en_o, exp_lc_o.lc_cpu_en_o, err_msg)
`DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_keymgr_en_o, exp_lc_o.lc_keymgr_en_o, err_msg)
`DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_escalate_en_o, exp_lc_o.lc_escalate_en_o, err_msg)
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_owner_seed_sw_rw_en_o,
+ exp_lc_o.lc_owner_seed_sw_rw_en_o, err_msg)
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_iso_part_sw_rd_en_o,
+ exp_lc_o.lc_iso_part_sw_rd_en_o, err_msg)
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_iso_part_sw_wr_en_o,
+ exp_lc_o.lc_iso_part_sw_wr_en_o, err_msg)
+
+ // lc_creator_seed_sw_rw_en_o is ON only when device has NOT been personalized or RMA state
+ if ((exp_lc_o.lc_creator_seed_sw_rw_en_o == lc_ctrl_pkg::On && !is_personalized) ||
+ lc_state == DecLcStRma) begin
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_creator_seed_sw_rw_en_o, lc_ctrl_pkg::On, err_msg)
+ end else begin
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_creator_seed_sw_rw_en_o, lc_ctrl_pkg::Off, err_msg)
+ end
+ // lc_seed_hw_rd_en_o is ON only when device has been personalized or RMA state
+ if ((exp_lc_o.lc_seed_hw_rd_en_o == lc_ctrl_pkg::On && is_personalized) ||
+ lc_state == DecLcStRma) begin
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_seed_hw_rd_en_o, lc_ctrl_pkg::On, err_msg)
+ end else begin
+ `DV_CHECK_EQ(cfg.lc_ctrl_vif.lc_seed_hw_rd_en_o, lc_ctrl_pkg::Off, err_msg)
+ end
end
end
endtask
diff --git a/hw/ip/lc_ctrl/dv/tb.sv b/hw/ip/lc_ctrl/dv/tb.sv
index 07a1397..d4abb05 100644
--- a/hw/ip/lc_ctrl/dv/tb.sv
+++ b/hw/ip/lc_ctrl/dv/tb.sv
@@ -35,48 +35,56 @@
// dut
lc_ctrl dut (
- .clk_i (clk ),
- .rst_ni (rst_n ),
+ .clk_i (clk ),
+ .rst_ni (rst_n ),
- .tl_i (tl_if.h2d),
- .tl_o (tl_if.d2h),
- .alert_rx_i (alert_rx ),
- .alert_tx_o (alert_tx ),
+ .tl_i (tl_if.h2d),
+ .tl_o (tl_if.d2h),
+ .alert_rx_i (alert_rx ),
+ .alert_tx_o (alert_tx ),
- .jtag_i (0),
- .jtag_o (),
+ .jtag_i (4'b0),
+ .jtag_o (),
+ .scanmode_i (1'b0 ),
- .esc_wipe_secrets_tx_i ({2'b01}),
- .esc_wipe_secrets_rx_o (),
- .esc_scrap_state_tx_i ({2'b01}),
- .esc_scrap_state_rx_o (),
+ .esc_wipe_secrets_tx_i ({2'b01}),
+ .esc_wipe_secrets_rx_o (),
+ .esc_scrap_state_tx_i ({2'b01}),
+ .esc_scrap_state_rx_o (),
- .pwr_lc_i (pwr_lc[LcPwrInitReq]),
- .pwr_lc_o (pwr_lc[LcPwrDoneRsp:LcPwrIdleRsp]),
+ .pwr_lc_i (pwr_lc[LcPwrInitReq]),
+ .pwr_lc_o (pwr_lc[LcPwrDoneRsp:LcPwrIdleRsp]),
- .lc_otp_program_o (),
- .lc_otp_program_i ('b01),
+ .lc_otp_program_o (),
+ .lc_otp_program_i (2'b01),
- .lc_otp_token_o (),
- .lc_otp_token_i (lc_rsp),
+ .lc_otp_token_o (),
+ .lc_otp_token_i (lc_rsp),
- .otp_lc_data_i (lc_ctrl_if.otp_i),
+ .otp_lc_data_i (lc_ctrl_if.otp_i),
- .lc_dft_en_o (lc_ctrl_if.lc_dft_en_o),
- .lc_nvm_debug_en_o (lc_ctrl_if.lc_nvm_debug_en_o),
- .lc_hw_debug_en_o (lc_ctrl_if.lc_hw_debug_en_o),
- .lc_cpu_en_o (lc_ctrl_if.lc_cpu_en_o),
- .lc_keymgr_en_o (lc_ctrl_if.lc_keymgr_en_o),
- .lc_escalate_en_o (lc_ctrl_if.lc_escalate_en_o),
+ .lc_dft_en_o (lc_ctrl_if.lc_dft_en_o),
+ .lc_nvm_debug_en_o (lc_ctrl_if.lc_nvm_debug_en_o),
+ .lc_hw_debug_en_o (lc_ctrl_if.lc_hw_debug_en_o),
+ .lc_cpu_en_o (lc_ctrl_if.lc_cpu_en_o),
+ .lc_creator_seed_sw_rw_en_o (lc_ctrl_if.lc_creator_seed_sw_rw_en_o),
+ .lc_owner_seed_sw_rw_en_o (lc_ctrl_if.lc_owner_seed_sw_rw_en_o),
+ .lc_iso_part_sw_rd_en_o (lc_ctrl_if.lc_iso_part_sw_rd_en_o),
+ .lc_iso_part_sw_wr_en_o (lc_ctrl_if.lc_iso_part_sw_wr_en_o),
+ .lc_seed_hw_rd_en_o (lc_ctrl_if.lc_seed_hw_rd_en_o),
+ .lc_keymgr_en_o (lc_ctrl_if.lc_keymgr_en_o),
+ .lc_escalate_en_o (lc_ctrl_if.lc_escalate_en_o),
- .lc_clk_byp_req_o (),
- .lc_clk_byp_ack_i (lc_ctrl_pkg::On),
+ .lc_clk_byp_req_o (),
+ .lc_clk_byp_ack_i (lc_ctrl_pkg::On),
- .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_flash_rma_req_o (),
+ .lc_flash_rma_ack_i (lc_ctrl_pkg::Off),
- .otp_hw_cfg_i (0)
+ .lc_keymgr_div_o (),
+
+ .otp_hw_cfg_i (lc_ctrl_if.otp_hw_cfg_i)
);
initial begin