12 UVM Driver
目录
12.1?uvm_driver class hierarchy
12.2?How to write driver code?
12.4 How to get sequence items from the sequencer?
12.5.1 Using get_next_item/ try_next_item and item_done methods
12.5.2 Using get and put methods
12.5.3 Difference between get_next_item/ item_done and get/ put approach?
driver与 DUT 交互。它使用接口/interface将随机事务(randomized transactions)或sequence item驱动到 pin-level的DUT。driver必须从uvm_driver扩展。从sequencer中检索/retrieve事务或序列项,driver使用接口句柄将它们驱动到设计。可以从已在顶级层/top-level次结构中设置的配置数据库中检索接口句柄。
uvm_driver 类是参数化类,有两个参数:类型为 REQ的uvm_sequence_item 和 RSP uvm_sequence_item 的。RSP sequence item是可选的。通常,REQ和RSP sequence item具有相同的类类型。如果特别声明,它们可能会有所不同。
uvm_driver 类声明:
class uvm_driver #( type REQ = uvm_sequence_item, type RSP = REQ ) extends uvm_component
12.1?uvm_driver class hierarchy
12.2?How to write driver code?
- 创建一个从 uvm_driver 扩展的用户定义的driver类,并将其注册到工厂中。
- 声明虚拟接口(virtual interface)句柄,以在 build_phase 中使用配置数据库检索实际接口句柄。
- 编写标准 new() 函数。由于driver是一个 uvm_component。new() 函数有两个参数:字符串名称和 uvm_component 父类parent。
- 实现 build_phase 并从配置数据库获取接口句柄。
- 实现 run_phase 以获取序列项并使用虚拟接口句柄将它们驱动到 DUT。
12.3?UVM Driver example
class driver extends uvm_driver#(seq_item);
virtual add_if vif;
`uvm_component_utils(driver)
function new(string name = "driver", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db#(virtual add_if) :: get(this, "", "vif", vif))
`uvm_fatal(get_type_name(), "Not set at top level");
endfunction
task run_phase (uvm_phase phase);
// Get the sequence_item and drive it to DUT
endtask
endclass
12.4 How to get sequence items from the sequencer?
driver的uvm_seq_item_pull_port使用TLM接口来接受来自sequencer的REQ sequence items,如果需要,driver可以给sequencr提供一个RSP sequence items。细节在Sequence-Driver-Sequencer communication章节讨论。
12.5 UVM driver methods
有两种与sequencer交互的方式。
- 使用 get_next_item/try_next_item 和 item_done 方法
- 使用 get 和 put 方法。
12.5.1 Using get_next_item/ try_next_item and item_done methods
我们先来了解一下 get_next_item、try_next_item 和 item_done 方法。
get_next_item 或成功的 try_next_item 检索 REQ? sequence item,使用虚拟接口句柄将其驱动到 DUT。一旦驱动逻辑完成,就必须调用 item_done 方法。?
task run_phase (uvm_phase phase);
forever begin
seq_item_port.get_next_item(req);
// Driving logic
...
seq_item_port.item_done();
end
endtask
12.5.2 Using get and put methods
task run_phase (uvm_phase phase);
forever begin
seq_item_port.get(req);
// Driving logic
...
seq_item_port.put(rsp_item);
end
endtask
12.5.3 Difference between get_next_item/ item_done and get/ put approach?
- item_done 必须在 get_next_item() 或成功的 try_next_item() 调用之后调用,然后只能请求下一个序列项。而即使未调用 put() 方法,get() 调用也可以请求另一个请求项。
- put() 必须使用 RSP? sequence item作为参数来调用,而 item_done() 则是可选。?
- 在 get_next_item/ item_done 方法的情况下,一旦使用虚拟接口将事务驱动到 DUT,并调用 item_done 时,wait_for_item_done 任务(uvm_sequence_base 类方法)将被解除阻塞。在 get/put 方法的情况下,当从驱动程序调用 put 方法(其中驱动程序有时间处理和驱动序列项)时, wait_for_item_done 将被解除阻塞。
- 由于sequence编写器必须记住response item的句柄,因此 get/put 方法的实现比 get_next_item/ item_done 方法更复杂。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!