blob: 2f0cd2dc1b0cddc07b7975294e0febf0ffc6be9b [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
// misc ports connectivity check
class flash_ctrl_connect_vseq extends flash_ctrl_base_vseq;
`uvm_object_utils(flash_ctrl_connect_vseq)
`uvm_object_new
task body();
jtag_pkg::jtag_req_t jtag_src_req, jtag_dst_req;
jtag_pkg::jtag_rsp_t jtag_src_rsp, jtag_dst_rsp;
string dut_path = "tb.dut";
bit lc_nvm_debug_en;
ast_pkg::ast_obs_ctrl_t obs_src, obs_dst;
bit [7:0] fla_src, fla_dst;
string mystr;
`uvm_info("seq", "connectivity test starts...", UVM_MEDIUM)
// jtag
`DV_CHECK_STD_RANDOMIZE_FATAL(jtag_src_req)
`DV_CHECK_STD_RANDOMIZE_FATAL(jtag_src_rsp)
`uvm_info("seq", $sformatf("src_req:%p src_rsp:%p", jtag_src_req, jtag_src_rsp), UVM_HIGH)
mystr = {dut_path, ".cio_tck_i"};
`DV_CHECK(uvm_hdl_force(mystr, jtag_src_req.tck))
mystr = {dut_path, ".cio_tms_i"};
`DV_CHECK(uvm_hdl_force(mystr, jtag_src_req.tms))
mystr = {dut_path, ".cio_tdi_i"};
`DV_CHECK(uvm_hdl_force(mystr, jtag_src_req.tdi))
mystr = {cfg.seq_cfg.flash_path_str, ".tdo_o"};
`DV_CHECK(uvm_hdl_force(mystr, jtag_src_rsp.tdo))
// tdo_oe : dut.eflash
$assertoff(0, "prim_lc_sync");
lc_nvm_debug_en = $urandom_range(0, 1);
cfg.flash_ctrl_vif.lc_nvm_debug_en = (lc_nvm_debug_en)?
lc_ctrl_pkg::On : get_rand_lc_tx_val(.t_weight(0), .f_weight(1), .other_weight(4));
// takes dealy to propagate lc_nvm_debug_en
cfg.clk_rst_vif.wait_clks(5);
mystr = {cfg.seq_cfg.flash_path_str, ".tck_i"};
`DV_CHECK(uvm_hdl_read(mystr, jtag_dst_req.tck))
mystr = {cfg.seq_cfg.flash_path_str, ".tms_i"};
`DV_CHECK(uvm_hdl_read(mystr, jtag_dst_req.tms))
mystr = {cfg.seq_cfg.flash_path_str, ".tdi_i"};
`DV_CHECK(uvm_hdl_read(mystr, jtag_dst_req.tdi))
mystr = {dut_path, ".cio_tdo_o"};
`DV_CHECK(uvm_hdl_read(mystr, jtag_dst_rsp.tdo))
// Make non-declared port don't care.
jtag_dst_req.trst_n = jtag_src_req.trst_n & lc_nvm_debug_en;
jtag_dst_rsp.tdo_oe = jtag_src_rsp.tdo_oe & lc_nvm_debug_en;
`DV_CHECK_EQ(jtag_dst_req, jtag_src_req & {4{lc_nvm_debug_en}})
`DV_CHECK_EQ(jtag_dst_rsp, jtag_src_rsp & {2{lc_nvm_debug_en}})
`uvm_info("seq", "jtag port check complete", UVM_MEDIUM)
`uvm_info("seq", "Observability port check start", UVM_MEDIUM)
`DV_CHECK_STD_RANDOMIZE_FATAL(obs_src)
`DV_CHECK_STD_RANDOMIZE_FATAL(fla_src)
mystr = {dut_path, ".obs_ctrl_i.obgsl"};
`DV_CHECK(uvm_hdl_force(mystr, obs_src.obgsl))
mystr = {dut_path, ".obs_ctrl_i.obmsl"};
`DV_CHECK(uvm_hdl_force(mystr, obs_src.obmsl))
mystr = {dut_path, ".obs_ctrl_i.obmen"};
`DV_CHECK(uvm_hdl_force(mystr, obs_src.obmen))
mystr = {cfg.seq_cfg.flash_path_str, ".fla_obs_o"};
`DV_CHECK(uvm_hdl_force(mystr, fla_src))
cfg.clk_rst_vif.wait_clks(1);
mystr = {cfg.seq_cfg.flash_path_str, ".obs_ctrl_i.obgsl"};
`DV_CHECK(uvm_hdl_read(mystr, obs_dst.obgsl))
mystr = {cfg.seq_cfg.flash_path_str, ".obs_ctrl_i.obmsl"};
`DV_CHECK(uvm_hdl_read(mystr, obs_dst.obmsl))
mystr = {cfg.seq_cfg.flash_path_str, ".obs_ctrl_i.obmen"};
`DV_CHECK(uvm_hdl_read(mystr, obs_dst.obmen))
mystr = {dut_path, ".fla_obs_o"};
`DV_CHECK(uvm_hdl_read(mystr, fla_dst))
`DV_CHECK_EQ(obs_dst, obs_src)
`DV_CHECK_EQ(fla_dst, fla_src)
`uvm_info("seq", "Observability port check complete", UVM_MEDIUM)
endtask
endclass // flash_ctrl_connect_vseq