在我的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));排序器也是一样。
https://stackoverflow.com/questions/23898090
复制相似问题