我还建议像 Tudor 一样只使用一种代理。但随后我会使用继承,声明 base_driver 和 base_sequencer(可能具有来自 ModeA 或 ModeB 驱动程序和/或定序器的共同功能),并且 ModeA 和 ModeB 单元将扩展这些基本单元。然后,在代理中,并使用每个测试中设置的 uvm_config_db 中的标志,您可以在实例化一个或另一个之间进行选择:
基础驱动:
class my_proj_base_driver extends uvm_driver#(my_proj_tr);
[...]
A模式驱动:
class my_proj_ModeA_driver extends my_proj_base_driver;
[...]
模式 B 驱动程序:
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));
对于音序器也是如此。