假设我在主端口中有一个带有AXI总线的DUT(例如l2缓存),并且我创建了一个类AXI_transfer,它从sequence_item扩展,100个有趣的测试场景序列和一个uvm驱动程序。现在,DUT的总线协议已从AXI更改为AHB。需要修改的Testbench组件是sequence_item和驱动程序(因为它们取决于协议)。现在,我不喜欢为AHB重新开发序列,因为它们是事务级别的方案。相反,我想重用与AXI_transfer项目相关的所有序列。最好的方法是什么?
我的想法是定义一个从sequence_item扩展的base_transfer,并从此base_transfer扩展AXI_transfer和AHB_transfer。另外,我将所有序列修改为使用此base_transfer类型进行参数化。现在,在我的uvm测试中,我可以 base_transfer :: type_id :: set_type_override(AXI_transfer :: get_type()); 如果我需要使用AXI_transfer或 base_transfer :: type_id :: set_type_override(AHB_transfer :: get_type()); 如果我需要使用AHB_transfer。对于驱动程序,我需要开发两个驱动程序-一个用于AXI,另一个用于AHB。
您认为这行得通吗?如果不是,建议使用其他什么方法?
答案 0 :(得分:0)
总的来说,我相信您会寻求分层的方法。您的上层只是发送和接收抽象流量。由协议的较低层来处理协议的细节。
这正是uvm_register_adapter使用的方法。看到类似这样的内容:http://cluelogic.com/2012/10/uvm-tutorial-for-candy-lovers-register-abstraction
实际上,是什么导致您为一个接口设置了一百种不同的序列?导致您创建其他序列的事物很可能会在协议之间转换时造成困难。您的AXI / ACE当然会使用内存屏障,但是如何在AHB接口上创建它们呢?