Remove GPIO force statement in DV test bench - Set gpio pins to weakly pulldown will prevent x values in data_in - Some squences such as chip_sw_i2c_host_tx_rx need special handling In //sw/device/lib/testing/pinmux_testutils.c, all 32 gpio inputs are connected with MIO pads through pinmux. Since most MIO pads are undriven, x values will be leaked into u_gpio.data_in. Opentitan only connects 3 sw_straps pins in the same file and since those MIO pads are driven at that point, there won't be x values in u_gpio.data_in Bug: 287479608 Change-Id: I65d0ab924569e3e97d1fd485c7ee8760d68a68d1
diff --git a/hw/top_matcha/dv/env/chip_if.sv b/hw/top_matcha/dv/env/chip_if.sv index 3b8af19..5b576bc 100644 --- a/hw/top_matcha/dv/env/chip_if.sv +++ b/hw/top_matcha/dv/env/chip_if.sv
@@ -45,6 +45,9 @@ `define CPU_HIER `TOP_HIER.u_rv_core_ibex_sec `define CPU_CORE_HIER `CPU_HIER.u_core `define CPU_TL_ADAPT_D_HIER `CPU_HIER.tl_adapter_host_d_ibex +`define SMC_CPU_HIER `TOP_HIER.u_rv_core_ibex_smc +`define SMC_CPU_CORE_HIER `SMC_CPU_HIER.u_core +`define SMC_CPU_TL_ADAPT_D_HIER `SMC_CPU_HIER.tl_adapter_host_d_ibex `define CSRNG_HIER `TOP_HIER.u_csrng `define ENTROPY_SRC_HIER `TOP_HIER.u_entropy_src `define EDN_HIER(i) `TOP_HIER.u_edn``i @@ -401,22 +404,22 @@ // hw/top_matcha/rtl/chip_matcha_verilator.sv and // sw/device/lib/testing/pinmux_testutils.c pins_if #(.Width(NUM_GPIOS), .PullStrength("Weak")) gpios_if( - .pins({mios[top_matcha_pkg::MioPadIoa0], mios[top_matcha_pkg::MioPadIoa1], - mios[top_matcha_pkg::MioPadIoa2], mios[top_matcha_pkg::MioPadIoa3], - mios[top_matcha_pkg::MioPadIoa4], mios[top_matcha_pkg::MioPadIoa5], - mios[top_matcha_pkg::MioPadIoa6], mios[top_matcha_pkg::MioPadIoa7], - mios[top_matcha_pkg::MioPadIoa8], mios[top_matcha_pkg::MioPadIob0], - mios[top_matcha_pkg::MioPadIob1], mios[top_matcha_pkg::MioPadIob2], - mios[top_matcha_pkg::MioPadIob3], mios[top_matcha_pkg::MioPadIob4], - mios[top_matcha_pkg::MioPadIob5], mios[top_matcha_pkg::MioPadIob6], - mios[top_matcha_pkg::MioPadIob7], mios[top_matcha_pkg::MioPadIob8], - mios[top_matcha_pkg::MioPadIob10], mios[top_matcha_pkg::MioPadIob11], - mios[top_matcha_pkg::MioPadIob12], mios[top_matcha_pkg::MioPadIoc6], - mios[top_matcha_pkg::MioPadIoc0], mios[top_matcha_pkg::MioPadIoc1], - mios[top_matcha_pkg::MioPadIoc2], mios[top_matcha_pkg::MioPadIoc7], - mios[top_matcha_pkg::MioPadIoc9], mios[top_matcha_pkg::MioPadIoc5], - mios[top_matcha_pkg::MioPadIor6], mios[top_matcha_pkg::MioPadIor7], - mios[top_matcha_pkg::MioPadIoc8], mios[top_matcha_pkg::MioPadIor10]}) + .pins({mios[top_matcha_pkg::MioPadIor10], mios[top_matcha_pkg::MioPadIoc8], + mios[top_matcha_pkg::MioPadIor7], mios[top_matcha_pkg::MioPadIor6], + mios[top_matcha_pkg::MioPadIoc5], mios[top_matcha_pkg::MioPadIoc9], + mios[top_matcha_pkg::MioPadIoc7], mios[top_matcha_pkg::MioPadIoc2], + mios[top_matcha_pkg::MioPadIoc1], mios[top_matcha_pkg::MioPadIoc0], + mios[top_matcha_pkg::MioPadIoc6], mios[top_matcha_pkg::MioPadIob12], + mios[top_matcha_pkg::MioPadIob11], mios[top_matcha_pkg::MioPadIob10], + mios[top_matcha_pkg::MioPadIob8], mios[top_matcha_pkg::MioPadIob7], + mios[top_matcha_pkg::MioPadIob6], mios[top_matcha_pkg::MioPadIob5], + mios[top_matcha_pkg::MioPadIob4], mios[top_matcha_pkg::MioPadIob3], + mios[top_matcha_pkg::MioPadIob2], mios[top_matcha_pkg::MioPadIob1], + mios[top_matcha_pkg::MioPadIob0], mios[top_matcha_pkg::MioPadIoa8], + mios[top_matcha_pkg::MioPadIoa7], mios[top_matcha_pkg::MioPadIoa6], + mios[top_matcha_pkg::MioPadIoa5], mios[top_matcha_pkg::MioPadIoa4], + mios[top_matcha_pkg::MioPadIoa3], mios[top_matcha_pkg::MioPadIoa2], + mios[top_matcha_pkg::MioPadIoa1], mios[top_matcha_pkg::MioPadIoa0]}) ); // Functional (muxed) interface: JTAG (valid during debug enabled LC state only).
diff --git a/hw/top_matcha/dv/env/seq_lib/chip_sw_base_vseq.sv b/hw/top_matcha/dv/env/seq_lib/chip_sw_base_vseq.sv index f2cc535..264736d 100644 --- a/hw/top_matcha/dv/env/seq_lib/chip_sw_base_vseq.sv +++ b/hw/top_matcha/dv/env/seq_lib/chip_sw_base_vseq.sv
@@ -17,6 +17,11 @@ set_and_release_sw_strap_nonblocking(); // Disable mem checks in scoreboard - it does not factor in memory scrambling. cfg.en_scb_mem_chk = 1'b0; + + // Undriven gpio pins will cause x values in u_gpio.data_in when connected + // with MIO pads in pinmux + // TODO(b/287479608): Add more X checkers and report error immediately + cfg.chip_vif.gpios_if.set_pulldown_en({32{1'b1}}); endtask // Drive sw_strap pins only when the ROM / test ROM code is active
diff --git a/hw/top_matcha/dv/env/seq_lib/chip_sw_i2c_host_tx_rx_vseq.sv b/hw/top_matcha/dv/env/seq_lib/chip_sw_i2c_host_tx_rx_vseq.sv index 7f30698..e2e3d74 100644 --- a/hw/top_matcha/dv/env/seq_lib/chip_sw_i2c_host_tx_rx_vseq.sv +++ b/hw/top_matcha/dv/env/seq_lib/chip_sw_i2c_host_tx_rx_vseq.sv
@@ -38,6 +38,23 @@ cfg.m_i2c_agent_cfgs[i2c_idx].if_mode = Device; // Enbale appropriate interface + case(i2c_idx) + 0: begin + cfg.chip_vif.gpios_if.set_pulldown_en_pin(7, 1'b0); + cfg.chip_vif.gpios_if.set_pulldown_en_pin(8, 1'b0); + end + 1: begin + cfg.chip_vif.gpios_if.set_pulldown_en_pin(18, 1'b0); + end + 2: begin + cfg.chip_vif.gpios_if.set_pulldown_en_pin(19, 1'b0); + cfg.chip_vif.gpios_if.set_pulldown_en_pin(20, 1'b0); + end + default: begin + `uvm_error(`gfn, $sformatf("Unexpected i2c index: %0d", i2c_idx)) + end + endcase + cfg.chip_vif.enable_i2c(.inst_num(i2c_idx), .enable(1)); `uvm_info(`gfn, $sformatf("Full period cycle: %d", clock_period_cycles), UVM_MEDIUM)
diff --git a/hw/top_matcha/dv/tb/tb.sv b/hw/top_matcha/dv/tb/tb.sv index 77cb5c5..555967b 100644 --- a/hw/top_matcha/dv/tb/tb.sv +++ b/hw/top_matcha/dv/tb/tb.sv
@@ -542,9 +542,6 @@ force `SMC_CPU_HIER.u_ibus_trans.rst_ni = 1'b0; force `SMC_CPU_HIER.u_dbus_trans.rst_ni = 1'b0; end - - // force the inputs to gpio to be 0 - force `CHIP_HIER.u_gpio.cio_gpio_i = 32'h00000000; end `include "../autogen/tb__xbar_connect.sv"