From b2c3439a5eaa7e18a279c10e47b44620fc0e6e25 Mon Sep 17 00:00:00 2001 From: Caleb Whitehead Date: Mon, 21 Aug 2023 21:45:35 +0000 Subject: [PATCH] Merged PR 119732: ROM regression timeout fix Updated ROM with image that correctly handles the SHA Accel Lock init, resolves timeout in regressions. Added TRNG support to ROM UVM test, with regression flows for INTERNAL/EXTERNAL TRNG modes. Related work items: #529197 --- ...liptra_top_nightly_directed_regression.yml | 4 +- .../test_suites/fw_test_rom/fw_test_rom | Bin 81920 -> 93900 bytes .../test_suites/fw_test_rom/fw_test_rom_fw | Bin 10644 -> 13708 bytes .../uvmf_caliptra_top/config/compile.yml | 41 ++++++++++++++++++ .../src/caliptra_top_rom_sequence.svh | 16 +++++++ .../caliptra_top/tb/testbench/hdl_top.sv | 29 ++++++++++++- .../soc_ifc_env_reset_sequence_base.svh | 33 +++++++++++++- .../soc_ifc_env_rom_bringup_sequence.svh | 32 ++++++++++++++ .../soc_ifc_env_mbox_rom_fw_sequence.svh | 2 +- .../soc_ifc_env_trng_write_data_sequence.svh | 27 +++++++++--- .../soc_ifc_env_pkg/src/soc_ifc_predictor.svh | 4 +- .../src/soc_ifc_ctrl_rom_poweron_sequence.svh | 2 +- 12 files changed, 176 insertions(+), 14 deletions(-) diff --git a/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml b/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml index bf6df5c6c..5baa312a8 100644 --- a/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml +++ b/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml @@ -7,8 +7,8 @@ contents: path: "" config: params: - # 24 hours to help diagnose timeout problem for this test - timeout: 1440 + # 12 hours + timeout: 720 weight: 100 generations: 1 formats: diff --git a/src/integration/test_suites/fw_test_rom/fw_test_rom b/src/integration/test_suites/fw_test_rom/fw_test_rom index ff0ea7a15b98b8d56194a5632b15e6e9f858c47a..7bf33b11cd25d5124e03b28923430347ef8cc1d0 100644 GIT binary patch literal 93900 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

13WX?s|`d=`{lG6 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≷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 delta 6441 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 diff --git a/src/integration/uvmf_caliptra_top/config/compile.yml b/src/integration/uvmf_caliptra_top/config/compile.yml index 1a022de2a..a6eaa74e2 100644 --- a/src/integration/uvmf_caliptra_top/config/compile.yml +++ b/src/integration/uvmf_caliptra_top/config/compile.yml @@ -78,3 +78,44 @@ global: - '-sv_lib libapb3_IN_SystemVerilog_VCS_full' # Report "MVC_ERROR" as "UVM_ERROR" - '+QVIP_UVM_REPORTING' +--- +provides: [uvmf_caliptra_top_itrng] +schema_version: 2.4.0 +requires: + - uvmf_caliptra_top +targets: + tb: + tops: + - hdl_top + - hvl_top + sim: + pre_exec: | + echo "[PRE-EXEC] Copying SHA512 Vectors to $(pwd)" + cp ${COMPILE_ROOT}/../tb/vectors/SHA*.rsp . + $TOOLS/scripts/run_test_makefile +global: + tool: + vcs: + default: + - '-assert svaext' + - +define+CLP_ASSERT_ON + - '-noinherit_timescale=1ns/1ps' + - '+define+CALIPTRA_INTERNAL_TRNG' + # Suppress a warning due to calling $fgets as task instead of function + # i.e. discarding the return value. This is in auto-generated code. + - '+warn=noRVOSFD' + # Suppress NOTE about repeated package imports within the same + # package (each .svh file included in the auto-generated UVM _pkg.sv + # files imports the same dependencies) + - '-suppress=SV-LCM-PPWI' + elab: + # Suppress warnings about too few port connections - auto-generated interfaces + # declare all signals as inout, but are driven at a lower layer than the + # instantiation, so they will always flag this + - '-suppress=TFIPC' + sim: + - '-sv_root $QUESTA_MVC_HOME/questa_mvc_core/linux_x86_64_gcc-6.2.0_vcs' + - '-sv_lib libahb_IN_SystemVerilog_VCS_full' + - '-sv_lib libapb3_IN_SystemVerilog_VCS_full' + # Report "MVC_ERROR" as "UVM_ERROR" + - '+QVIP_UVM_REPORTING' diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh index 237d56ff4..9182b23a6 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh @@ -30,6 +30,7 @@ class caliptra_top_rom_sequence extends caliptra_top_bench_sequence_base; `uvm_object_utils( caliptra_top_rom_sequence ); rand soc_ifc_env_rom_bringup_sequence_t soc_ifc_env_bringup_seq; + rand soc_ifc_env_trng_write_data_sequence_t soc_ifc_env_trng_write_data_seq; rand soc_ifc_env_mbox_rom_fw_sequence_t soc_ifc_env_mbox_rom_seq; rand soc_ifc_env_sequence_base_t soc_ifc_env_seq_ii[]; // Local handle to register model for convenience @@ -94,6 +95,21 @@ class caliptra_top_rom_sequence extends caliptra_top_bench_sequence_base; `uvm_info("CALIPTRA_TOP_BRINGUP", "SoC completed poweron and observed reset deassertion to system", UVM_LOW) +`ifndef CALIPTRA_INTERNAL_TRNG + `uvm_info("CALIPTRA_TOP_ROM_TEST", "Initiating TRNG responder sequence in an infinite loop to handle ROM TRNG requests", UVM_LOW) + fork + forever begin + soc_ifc_env_trng_write_data_seq = soc_ifc_env_trng_write_data_sequence_t::type_id::create("soc_ifc_env_trng_write_data_seq"); + soc_ifc_env_trng_write_data_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + if (!soc_ifc_env_trng_write_data_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_ROM_TEST", $sformatf("caliptra_top_rom_sequence::body() - %s randomization failed", soc_ifc_env_trng_write_data_seq.get_type_name())); + soc_ifc_env_trng_write_data_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + end + join_none +`else + `uvm_info("CALIPTRA_TOP_ROM_TEST", "Not initiating TRNG responder sequence to handle ROM TRNG requests because INTERNAL TRNG is enabled", UVM_LOW) +`endif + run_firmware_init(soc_ifc_env_mbox_rom_seq); // After firmware init, wait for generic_output_wires write to 0xFF diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv index 4776b1352..6ad20d141 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv @@ -121,6 +121,10 @@ import uvmf_base_pkg_hdl::*; logic [`CALIPTRA_IMEM_ADDR_WIDTH-1:0] imem_addr; logic [`CALIPTRA_IMEM_DATA_WIDTH-1:0] imem_rdata; + logic etrng_req; + logic [3:0] itrng_data; + logic itrng_valid; + //device lifecycle security_state_t security_state_stub_inactive; @@ -234,10 +238,17 @@ import uvmf_base_pkg_hdl::*; .cptra_error_fatal (soc_ifc_subenv_soc_ifc_status_agent_bus.cptra_error_fatal), .cptra_error_non_fatal(soc_ifc_subenv_soc_ifc_status_agent_bus.cptra_error_non_fatal), // External TRNG +`ifdef CALIPTRA_INTERNAL_TRNG + .etrng_req (etrng_req), + // Internal TRNG + .itrng_data (itrng_data ), + .itrng_valid (itrng_valid), +`else .etrng_req (soc_ifc_subenv_soc_ifc_status_agent_bus.trng_req), // Internal TRNG - .itrng_data (4'h0), // TODO - .itrng_valid (1'b0), // TODO + .itrng_data (4'h0), + .itrng_valid (1'b0), +`endif .generic_input_wires (soc_ifc_subenv_soc_ifc_ctrl_agent_bus.generic_input_wires), .generic_output_wires(soc_ifc_subenv_soc_ifc_status_agent_bus.generic_output_wires), @@ -310,6 +321,20 @@ import uvmf_base_pkg_hdl::*; assign soc_ifc_subenv_mbox_sram_agent_bus.mbox_sram_req = mbox_sram_req; assign mbox_sram_resp = soc_ifc_subenv_mbox_sram_agent_bus.mbox_sram_resp; +`ifdef CALIPTRA_INTERNAL_TRNG + //=========================================================================- + // Physical RNG used for Internal TRNG + //=========================================================================- + physical_rng physical_rng_i ( + .clk (clk), + .enable (etrng_req), + .data (itrng_data), + .valid (itrng_valid) + ); + + assign soc_ifc_subenv_soc_ifc_status_agent_bus.trng_req = 1'b0; +`endif + //=========================================================================- // Services for SRAM exports, STDOUT, etc //=========================================================================- diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh index 54de45f7d..5253bd642 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh @@ -42,13 +42,18 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI rand uvm_reg_data_t uds_seed_rand [12]; rand uvm_reg_data_t field_entropy_rand [32]; + rand uvm_reg_data_t owner_pk_hash_rand [12]; + rand uvm_reg_data_t key_manifest_pk_hash_rand [12]; rand uvm_reg_data_t idevid_cert_attr_rand [24]; rand uvm_reg_data_t soc_stepping_id_rand; rand struct packed { bit uds; bit field_entropy; + bit [0:11] key_manifest_pk_hash; + bit [0:11] owner_pk_hash; bit soc_stepping_id; bit [0:23] idevid_cert_attr; + bit lms_verify; } fuses_to_set; @@ -107,7 +112,7 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI if (!fuse_ready) `uvm_info("SOC_IFC_RST", "Received status transition while waiting for Mailbox ready_for_fuses, ready_for_fuses still not set", UVM_MEDIUM) else - `uvm_info("SOC_IFC_RST", "Fuse ready, initiating fuse download", UVM_LOW) + `uvm_info("SOC_IFC_RST", $sformatf("Fuse ready, initiating fuse download with fuses_to_set: [%p]", this.fuses_to_set), UVM_LOW) end // Write UDS @@ -128,6 +133,24 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI end end + // Key Manifest PK Hash (Vendor) + foreach (this.fuses_to_set.key_manifest_pk_hash[ii]) begin + if (this.fuses_to_set.key_manifest_pk_hash[ii]) begin + `uvm_info("SOC_IFC_RST", $sformatf("Writing Key Manifest PK Hash [%d] to fuse bank with value 0x%0x", ii, key_manifest_pk_hash_rand[ii]), UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_key_manifest_pk_hash[ii].write(sts, key_manifest_pk_hash_rand[ii], UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", $sformatf("Failed when writing to Key Manifest PK Hash [%d]", ii)) + end + end + + // Owner PK Hash + foreach (this.fuses_to_set.owner_pk_hash[ii]) begin + if (this.fuses_to_set.owner_pk_hash[ii]) begin + `uvm_info("SOC_IFC_RST", $sformatf("Writing Owner PK Hash [%d] to fuse bank with value 0x%0x", ii, owner_pk_hash_rand[ii]), UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_owner_pk_hash[ii].write(sts, owner_pk_hash_rand[ii], UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", $sformatf("Failed when writing to Owner PK Hash [%d]", ii)) + end + end + // Write SoC Stepping ID if (this.fuses_to_set.soc_stepping_id) begin `uvm_info("SOC_IFC_RST", "Writing SOC Stepping ID to fuse bank", UVM_LOW) @@ -144,6 +167,14 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI end end + // Write LMS Verify Bit + if (this.fuses_to_set.lms_verify) begin + uvm_reg_data_t lms_verify_data = 1 << reg_model.soc_ifc_reg_rm.fuse_lms_verify.lms_verify.get_lsb_pos(); + `uvm_info("SOC_IFC_RST", "Writing LMS Verify=1 to fuse bank", UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_lms_verify.write(sts, lms_verify_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", "Failed when writing to lms_verify") + end + // Set Fuse Done reg_model.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); `uvm_info("SOC_IFC_RST", $sformatf("Fuse download completed, status: %p", sts), UVM_MEDIUM) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh index f20646097..ac1f522f8 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh @@ -33,11 +33,43 @@ class soc_ifc_env_rom_bringup_sequence extends soc_ifc_env_reset_sequence_base; typedef soc_ifc_ctrl_rom_poweron_sequence soc_ifc_ctrl_agent_poweron_sequence_t; + // Decide which fuses to initialize constraint always_set_uds_c { this.fuses_to_set.uds == 1'b1; } constraint always_set_fe_c { this.fuses_to_set.field_entropy == 1'b1; } + // Roughly once per week, assuming the nightly Directed regression isn't running every day (since it is triggered by a PR) + constraint infrequently_set_lms_verify_c { this.fuses_to_set.lms_verify dist {0 :/ 4, 1 :/ 1}; } + constraint always_set_key_manifest_pk_hash_c { this.fuses_to_set.key_manifest_pk_hash == {12{1'b1}}; } + constraint always_set_owner_pk_hash_c { this.fuses_to_set.owner_pk_hash == {12{1'b1}}; } constraint always_set_idevid_c { this.fuses_to_set.idevid_cert_attr[0] == 1'b1; this.fuses_to_set.idevid_cert_attr[6] == 1'b1; this.fuses_to_set.idevid_cert_attr[7] == 1'b1; } + // Configure the values to set to initialized fuses + constraint key_manifest_pk_hash_values_c { key_manifest_pk_hash_rand[0] == 32'h6DC8DE16; + key_manifest_pk_hash_rand[1] == 32'hD559D129; + key_manifest_pk_hash_rand[2] == 32'h7BAB1E43; + key_manifest_pk_hash_rand[3] == 32'hEBD7C533; + key_manifest_pk_hash_rand[4] == 32'hDFE57001; + key_manifest_pk_hash_rand[5] == 32'h1AA56220; + key_manifest_pk_hash_rand[6] == 32'h0F66AD6D; + key_manifest_pk_hash_rand[7] == 32'h87051086; + key_manifest_pk_hash_rand[8] == 32'hC785E930; + key_manifest_pk_hash_rand[9] == 32'hD3D947B4; + key_manifest_pk_hash_rand[10] == 32'h7495822E; + key_manifest_pk_hash_rand[11] == 32'hCB643FF1; + solve this.fuses_to_set before this.key_manifest_pk_hash_rand; } + constraint owner_pk_hash_values_c { owner_pk_hash_rand[0] == 32'hF58D4920; + owner_pk_hash_rand[1] == 32'hBA65DA44; + owner_pk_hash_rand[2] == 32'hB0F728BC; + owner_pk_hash_rand[3] == 32'hFB893202; + owner_pk_hash_rand[4] == 32'hCFAAA942; + owner_pk_hash_rand[5] == 32'hBC66A0C0; + owner_pk_hash_rand[6] == 32'h007A2CE2; + owner_pk_hash_rand[7] == 32'h29A8E08F; + owner_pk_hash_rand[8] == 32'h9E8EEBAE; + owner_pk_hash_rand[9] == 32'hB36E9CC0; + owner_pk_hash_rand[10] == 32'h962E4B7A; + owner_pk_hash_rand[11] == 32'h50214999; + solve this.fuses_to_set before this.owner_pk_hash_rand; } constraint idevid_values_c { idevid_cert_attr_rand[0] == '0; /* SHA1 */ idevid_cert_attr_rand[6] == 32'hFFFF_FFFF; /* UEID LSWord */ idevid_cert_attr_rand[7] == 32'hFFFF_FFFF; /* MSWord */} diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh index e50e215b6..5e265b325 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh @@ -36,7 +36,7 @@ class soc_ifc_env_mbox_rom_fw_sequence extends soc_ifc_env_mbox_sequence_base; // This shouldn't be randomized, specify it constraint mbox_cmd_c { mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_ROM_FW_UPD); } - constraint mbox_dlen_c { mbox_op_rand.dlen == 10644; } + constraint mbox_dlen_c { mbox_op_rand.dlen == 13708; } // Response data is only non-zero if a response is requested, and also must // be small enough to fit in the mailbox // Firmware team encodes commands differently from this environment; response diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh index d2acca98a..5f4a8b35e 100755 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh @@ -31,6 +31,7 @@ class soc_ifc_env_trng_write_data_sequence extends soc_ifc_env_sequence_base #(. rand bit trng_write_done; rand bit [3:0] trng_num_dwords; + int sts_rsp_count; bit trng_data_req; bit [apb5_master_0_params::PAUSER_WIDTH-1:0] trng_valid_user; @@ -69,15 +70,24 @@ class soc_ifc_env_trng_write_data_sequence extends soc_ifc_env_sequence_base #(. virtual task body(); + sts_rsp_count = 0; + + fork + forever begin + @(soc_ifc_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + end + join_none + soc_ifc_env_trng_setup(); - `uvm_info("TRNG_REQ_SEQ", $sformatf("Responding to TRNG_DATA_REQ with %0d dwords", trng_num_dwords), UVM_DEBUG) if (this.trng_data_req == 1'b0) soc_ifc_env_trng_poll_data_req(); if (this.trng_data_req) begin + `uvm_info("TRNG_REQ_SEQ", $sformatf("Responding to TRNG_DATA_REQ with %0d dwords", trng_num_dwords), UVM_FULL) soc_ifc_env_trng_write_data(); soc_ifc_env_trng_write_done(); soc_ifc_env_trng_wait_idle(); end + `uvm_info("TRNG_REQ_SEQ", "TRNG write data sequence completed", UVM_HIGH) endtask @@ -108,6 +118,7 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_setup(); // Assign user and use throughout sequence apb_user_obj.set_addr_user(trng_valid_user); + `uvm_info("TRNG_REQ_SEQ", $sformatf("trng_valid_user initialized to value 0x%x", trng_valid_user), UVM_HIGH) endtask @@ -120,10 +131,15 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_poll_data_req(); soc_ifc_env_trng_check_data_req(data_req); while (data_req == 1'b0) begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); - soc_ifc_env_trng_check_data_req(data_req); + wait (sts_rsp_count != 0); + data_req = soc_ifc_status_agent_rsp_seq.rsp.trng_req_pending; + sts_rsp_count = 0; end + soc_ifc_env_trng_check_data_req(data_req); + if (!data_req) + `uvm_error("TRNG_REQ_SEQ", "Got status transaction with trng_req_pending, but read from CPTRA_TRNG_STATUS.DATA_REQ returned 0!") this.trng_data_req = data_req; + `uvm_info("TRNG_REQ_SEQ", $sformatf("Got status transaction with trng_req_pending, read from CPTRA_TRNG_STATUS.DATA_REQ returned %d", data_req), UVM_MEDIUM) endtask //========================================== @@ -152,7 +168,7 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_write_data(); uvm_reg_data_t data; for (ii = 0; ii < this.trng_num_dwords; ii++) begin if (!std::randomize(data)) `uvm_error("TRNG_REQ_SEQ", "Failed to randomize data") - `uvm_info("TRNG_REQ_SEQ", $sformatf("Sending TRNG_DATA[%0d]: 0x%0x", ii, data), UVM_DEBUG) + `uvm_info("TRNG_REQ_SEQ", $sformatf("Sending TRNG_DATA[%0d]: 0x%0x", ii, data), UVM_HIGH) reg_model.soc_ifc_reg_rm.CPTRA_TRNG_DATA[ii].write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed (TRNG_DATA)") @@ -165,7 +181,7 @@ endtask //========================================== task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_write_done(); uvm_status_e reg_sts; - `uvm_info("TRNG_REQ_SEQ", "Sending TRNG_DONE", UVM_DEBUG) + `uvm_info("TRNG_REQ_SEQ", "Sending TRNG_DONE", UVM_MEDIUM) reg_model.soc_ifc_reg_rm.CPTRA_TRNG_STATUS.write(reg_sts, uvm_reg_data_t'(trng_write_done) << reg_model.soc_ifc_reg_rm.CPTRA_TRNG_STATUS.DATA_WR_DONE.get_lsb_pos(), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed (TRNG_DONE)") @@ -191,4 +207,5 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_wait_idle(); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed (CPTRA_TRNG_STATUS)") end + `uvm_info("TRNG_REQ_SEQ", "Observed TRNG_DONE cleared to 0", UVM_HIGH) endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh index eaa985651..58f674c27 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh @@ -1263,7 +1263,7 @@ class soc_ifc_predictor #( "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0]", "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1]": begin if (ahb_txn.RnW == AHB_WRITE) begin - `uvm_info("PRED_AHB", {"Detected write to ", axs_reg.get_name()," register on AHB interface"}, UVM_MEDIUM); + `uvm_info("PRED_AHB", {"Write to ",axs_reg.get_name()," register on AHB interface has no side-effect"}, UVM_HIGH) // TODO end end "CPTRA_WDT_TIMER2_EN": begin @@ -1282,7 +1282,7 @@ class soc_ifc_predictor #( "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0]", "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1]": begin if (ahb_txn.RnW == AHB_WRITE) begin - `uvm_info("PRED_AHB", {"Detected write to ",axs_reg.get_name()," register on AHB interface"}, UVM_LOW) // TODO + `uvm_info("PRED_AHB", {"Write to ",axs_reg.get_name()," register on AHB interface has no side-effect"}, UVM_HIGH) // TODO end end "CPTRA_WDT_STATUS": begin diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh index 215317411..841c92a7b 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh @@ -48,7 +48,7 @@ class soc_ifc_ctrl_rom_poweron_sequence req=soc_ifc_ctrl_transaction::type_id::create("pwr_req"); start_item(req); // Randomize the transaction (must be DEVICE_UNPROVISIONED for ROM bringup) - if(!req.randomize() with {security_state.device_lifecycle == DEVICE_UNPROVISIONED;}) + if(!req.randomize() with {security_state.device_lifecycle != DEVICE_UNPROVISIONED;}) `uvm_fatal("SOC_IFC_CTRL_RST", "soc_ifc_ctrl_reset_sequence_base::body()-soc_ifc_ctrl_transaction randomization failed") req.set_pwrgood = 1'b0; req.assert_rst = 1'b1; // active-low assertion