gpt4 book ai didi

system-verilog - UVM testbench - 将两个不同的驱动程序连接到同一接口(interface)的 "UVM"方法是什么?

转载 作者:行者123 更新时间:2023-12-03 23:35:54 28 4
gpt4 key购买 nike

在我的 Testbench 中,我有一个需要驱动的接口(interface)。该接口(interface)可以在 2 种不同的模式下驱动,每种模式都有自己的驱动程序协议(protocol)和事务类型。

到目前为止,我已经分别设计了两个 uvm_agents。现在,我需要一种方法来交换一个或另一个,这取决于我正在运行的测试用例。我也想以最符合 UVM 哲学的方式来做这件事。

我能想出的最好方法是:在我的 uvm_env 中,从测试中获取一个 uvm_db_config 参数,该参数表示“ModeA”或“ModeB”,并基于此将代理的 is_active 设置为“UVM_ACTIVE”和适当的“UVM_PASSIVE”。

我想对这种方法发表意见。

向我建议的一种方法是保留一个通用的 uvm_agent,并根据配置实例化 uvm_driver/uvm_sequencer。不太确定这种方法,因为它看起来很乱。

最佳答案

我还建议像 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;
[...]

ModB 驱动程序:

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));

对于音序器也是如此。

关于system-verilog - UVM testbench - 将两个不同的驱动程序连接到同一接口(interface)的 "UVM"方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898090/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com