UVM:通过接口驱动时钟

时间:2014-06-25 21:47:47

标签: system-verilog uvm

我希望能够控制UVC接口上的时钟/数据对。控制数据相对简单。在这个轴上缠绕的地方是时钟。

如何控制界面中的时钟,使其可以关闭/打开?是否应在驱动程序或其他地方处理对参考时钟的虚拟接口时钟分配?

我发现时钟分配是在get_and_drive任务中处理的,时钟分配不会发生。

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

我做了通常的研究,到目前为止,已经空了。

2 个答案:

答案 0 :(得分:1)

您可以使用的最简单的事情是程序分配。这是该标准的一个更加模糊的特征。

task get_and_drive();
  vif.d_in <= 'b0;
  assign vif.clk_in = vif.ref_clk;   // does not work
  // ...
endtask : get_and_drive

我不知道您希望如何禁用时钟(可能基于您的请求的某个字段,您希望在send_to_dut(...)中执行此操作),但这里有一个关于EDA的示例帮助你的游乐场:http://www.edaplayground.com/x/3RR

有关程序分配语句的更多信息,请参阅SystemVerilog 2012标准,第10.6节程序连续分配

注意:该标准还提到该构造被认为是弃用。

答案 1 :(得分:1)

如果您不想使用程序分配,则必须为您的驱动程序添加一些基础结构。您需要一种基于clk_in和门控字段驱动clk_ref的方法:

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

您必须从驱动程序的run_phase(...)分叉此方法:

task run_phase(uvm_phase phase);
  fork
    drive_clock();
  join_none

  // do any other stuff here
endtask

我猜你想要从send_to_dut(...)任务中控制时钟:

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

以下是EDA游乐场上的精简示例:http://www.edaplayground.com/x/2XV