【问题标题】:Nice way for accesing interface path访问接口路径的好方法
【发布时间】:2017-04-03 11:09:51
【问题描述】:

请帮助找到一个解决方案,以获得漂亮的代码。

因此,在我的代码中,我必须执行几次强制,因为同一根线是由 tb 和设计的其他部分驱动的。结果我有很多这样的强制声明:

强制 TOP.u_proto_mc_top.gtx_rx_reset = TOP.u_proto_mc_top.u_GTX_RXB.gtxMaster_itf_inst.rstn;

强制 TOP.u_proto_mc_top.gtx_tx_reset = TOP.u_proto_mc_top.u_GTX_RXB.gtxMaster_itf_inst.txstn;

所以我只是一次又一次地复制粘贴相同的界面路径,我的意思是这条路径: TOP.u_proto_mc_top.u_GTX_RXB.gtxMaster_itf_inst

每次我需要强制接口信号时,我都必须复制并粘贴此路径。 这对我来说很难看。 有人可以建议另一种解决方案,因为我不会一次又一次地复制/粘贴界面路径。

谢谢

【问题讨论】:

    标签: system-verilog uvm


    【解决方案1】:

    首先,我会尝试找出为什么您的测试平台的结构需要带有接口的力。更好的规划可能会避免这种情况。

    使用文本宏的快速解决方案。

    `define uTOP TOP.u_proto_mc_top 
    `define GTXMaster `uTOP.u_GTX_RXB.gtxMaster_itf_inst
    force `uTOP.gtx_tx_reset = `GTXMaster.txstn;
    

    【讨论】:

    • 我的层次结构中间有一个 GTX 模块,我的测试台首先通过该 GTX 模块发送一些数据来测试 GTX 链路,然后确保 GTX 链路在它上面运行顶级测试.分配 mc_rx_update = rx_reg_we | rx_update; GTX u_GTX_RXB ( .update (mc_rx_update), .. ) 所以我有一个包含所有 GTX 端口的接口。然后我将该接口绑定到 GTX 模块。在这里,如果我们采用更新信号,一方面它由我的驱动模块驱动,另一方面“mc_rx_update”也在尝试驱动它。大多数“mc_rx_update”是 X。
    • 因此,我在一个网络上获得了 2 个不同的驱动程序,因此出现了 Xs。为了解决这个问题,我正在创建 force_signal 和 release_signal 任务,这将强制“mc_rx_update”到接口端口。
    【解决方案2】:

    您可以使用 uvm_hdl_read() 和 uvm_hdl_force() 代替吗?这些 UVM 内置函数将字符串作为 hdl 路径的输入参数。

    string if_path = "TOP.u_proto_mc_top.u_GTX_RXB.gtxMaster_itf_inst";
    string top_path = "TOP.u_proto_mc_top";
    uvm_hdl_data_t val;
    
    uvm_hdl_read({if_path,".rstn"}, val);
    uvm_hdl_force({top_path, ".gtx_rx_reset", val);
    
    uvm_hdl_read({path,".txstn"}, val);
    uvm_hdl_force({top_path, ".gtx_tx_reset", val);
    

    【讨论】:

    • hmm,这种语法有什么好处? uvm_hdl_force 是否为用户提供任何有用的选项
    • 好处是引号内的 hdl_path 只是一个文本字符串。您可以在运行时构建不同的字符串或绑定到不同的 DUT 层次结构。使用文本宏定义 hdl 路径在编译时是硬编码的,使代码更难重用。
    猜你喜欢
    • 2012-08-18
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2015-11-14
    • 2014-02-20
    • 2013-01-24
    相关资源
    最近更新 更多