System verilog UVM:通过接口驱动时钟

System verilog UVM:通过接口驱动时钟,system-verilog,uvm,System Verilog,Uvm,我希望能够控制UVC接口上的时钟/数据对。控制数据是相对直接的。我绕轴的地方是时钟 如何控制接口中的时钟,使其可以选通关闭/打开?虚拟接口时钟分配到参考时钟应该在驱动程序中处理,还是在其他地方处理 我发现,如果在get_和_驱动器任务中处理了时钟分配,则不会发生时钟分配 task get_and_drive(); vif.d_in <= 'b0; vif.clk_in = vif.ref_clk; // does not work forever begin seq_ite

我希望能够控制UVC接口上的时钟/数据对。控制数据是相对直接的。我绕轴的地方是时钟

如何控制接口中的时钟,使其可以选通关闭/打开?虚拟接口时钟分配到参考时钟应该在驱动程序中处理,还是在其他地方处理

我发现,如果在get_和_驱动器任务中处理了时钟分配,则不会发生时钟分配

task get_and_drive();
vif.d_in <= 'b0;
vif.clk_in = vif.ref_clk;   // does not work
forever
  begin
    seq_item_port.get_next_item(req);
    send_to_dut(req);
    seq_item_port.item_done();
  end
endtask : get_and_drive
任务获取和驱动();

vif.d_in您可以使用的最简单的方法是程序赋值。这是标准的一个更模糊的特征

task get_and_drive();
  vif.d_in <= 'b0;
  assign vif.clk_in = vif.ref_clk;   // does not work
  // ...
endtask : get_and_drive
任务获取和驱动();

中的vif.d_如果您不想使用程序分配,那么您必须为驱动程序添加一些基础结构。您需要一种基于
clk_ref
和选通字段驱动
clk_in
的方法:

bit clk_on;

task drive_clock();
  forever @(vif.clk_ref iff clk_on)  // sensitive to any change of the clock
    vif.clk_in <= vif.clk_ref;
endtask
我猜您想从
发送到dut(…)
任务内部控制时钟:

task send_to_dut(some_sequence_item req);
  clk_on = req.clk_on;
  // any other driving code here
endtask
下面是EDA游乐场上的一个简单示例,演示了这一点:

task send_to_dut(some_sequence_item req);
  clk_on = req.clk_on;
  // any other driving code here
endtask