在我的Testbench中,我有一个需要驱动的接口。该接口可以在两种不同的模式下驱动,每种模式都有自己的驱动协议和事务类型。
到目前为止,我已经分别设计了两个uvm_agents。现在,我需要一种方法来交换其中一种或另一种,这取决于我正在运行的测试用例。我还想以最符合UVM哲学的方式来做这件事。
我能想到的最好的方法是:在我的uvm_env中,从测试中获取一个uvm_db_config参数,该参数要么是"ModeA“,要么是"ModeB",并在此基础上适当地将代理的is_active设置为"UVM_ACTIVE”和"UVM_PASSIVE“。
我想对这种方法提出意见。
我建议的一种方法是保留一个通用的uvm_agent,并根据配置实例化uvm_driver/uvm_driver。不太确定这种方法,因为它看起来凌乱。
发布于 2014-05-28 08:46:15
我也建议,像都铎一样,只使用一种代理人。但是,我将使用继承,声明一个base_driver和一个base_sequencer (可能具有来自ModeA或ModeB驱动程序和/或排序器的通用功能),而ModeA和ModeB单元将扩展这些基本驱动程序。然后,在代理中,并在每个测试的uvm_config_db集中使用一个标志,您可以在实例化其中一个或另一个:
基地司机:
class my_proj_base_driver extends uvm_driver#(my_proj_tr);
[...]ModeA驱动程序:
class my_proj_ModeA_driver extends my_proj_base_driver;
[...]ModeB驱动程序:
class my_proj_ModeB_driver extends my_proj_base_driver;
[...]在代理人中:
[...]
my_proj_base_driver driver;
bit modeAorB // 0 for A, 1 for B
[...]
if (!uvm_config_db#(bit)::get(this,"","modeAorB", modeAorB))
`uvm_fatal("NOMODE","No mode set for this agent")
if(!modeAorB)
driver = my_proj_ModeA_driver::type_id::create(.name("driver"), .parent(this));
else
driver = my_proj_ModeB_driver::type_id::create(.name("driver"), .parent(this));排序器也是一样。
发布于 2014-05-28 08:09:47
我希望每个模式都有一个公共代理类和一个具体的类,然后根据我正在运行的测试执行类型重写。通过这种方式,很明显只有一个代理处理该接口(而不是2,当它根本不被使用时,其中一个被设置为被动)。一个代理类实例化一组驱动程序/排序器,另一个代理类实例化其他代理。这样,您只需设置一种类型覆盖(代理),而不是2(在驱动程序和排序器)。
如果在这两种模式中都使用相同的监视器,那么最好采用一种代理方法,因为您只需将记分板连接到一个监视器,而不是一个在代理A中,另一个在代理B中,这取决于模式。
您的方法也同样有效,在这种情况下,我不认为有一种标准的UVM方法。我让一位同事为GPIO接口做了类似的事情,而且效果很好。
https://stackoverflow.com/questions/23898090
复制相似问题