12 UVM Driver

发布时间:2023年12月29日

目录

12.1?uvm_driver class hierarchy

12.2?How to write driver code?

12.3?UVM Driver example

12.4 How to get sequence items from the sequencer?

12.5 UVM driver methods

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?

  1. 创建一个从 uvm_driver 扩展的用户定义的driver类,并将其注册到工厂中。
  2. 声明虚拟接口(virtual interface)句柄,以在 build_phase 中使用配置数据库检索实际接口句柄。
  3. 编写标准 new() 函数。由于driver是一个 uvm_component。new() 函数有两个参数:字符串名称和 uvm_component 父类parent。
  4. 实现 build_phase 并从配置数据库获取接口句柄。
  5. 实现 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交互的方式。

  1. 使用 get_next_item/try_next_item 和 item_done 方法
  2. 使用 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?

  1. item_done 必须在 get_next_item() 或成功的 try_next_item() 调用之后调用,然后只能请求下一个序列项。而即使未调用 put() 方法,get() 调用也可以请求另一个请求项。
  2. put() 必须使用 RSP? sequence item作为参数来调用,而 item_done() 则是可选。?
  3. 在 get_next_item/ item_done 方法的情况下,一旦使用虚拟接口将事务驱动到 DUT,并调用 item_done 时,wait_for_item_done 任务(uvm_sequence_base 类方法)将被解除阻塞。在 get/put 方法的情况下,当从驱动程序调用 put 方法(其中驱动程序有时间处理和驱动序列项)时, wait_for_item_done 将被解除阻塞。
  4. 由于sequence编写器必须记住response item的句柄,因此 get/put 方法的实现比 get_next_item/ item_done 方法更复杂。
文章来源:https://blog.csdn.net/Bonnie_89/article/details/135249130
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。