2017-04-03 77 views
0

请帮助找到一个解决方案,以获得漂亮的代码。访问界面路径的好方法

所以在我的代码中,我必须做几次强制,因为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

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

感谢

回答

1

首先我会尝试找出为什么你的测试平台的结构需要一个接口的力量。更好的计划可能会避免这种情况。

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

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

我在层次结构的中间GTX模块,在由通过GTX模块发送一些数据,确保GTX链接上之后第一次测试GTX链接我的试验台运行顶层测试。 assign 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. – haykp

+0

因此,我在单个网络上获得2个不同的驱动程序,因此出现了Xs。 为了解决这个问题,我正在创建force_signal和release_signal任务,这将强制“mc_rx_update”到接口端口。 – haykp

1

您可以使用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); 
+0

嗯,这个语法有什么好处? uvm_hdl_force为用户 – haykp

+0

提供任何有用的选项好处是报价中的hdl_path只是一个文本字符串。您可以在运行时构建不同的字符串或绑定到不同的DUT层次结构。使用文本宏定义hdl路径在编译时被硬编码,使得代码难以重用。 – hevangel