1

我希望能够控制 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

我已经完成了通常的研究,但到目前为止,都一无所获。

4

2 回答 2

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

于 2014-06-26T08:34:39.087 回答
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 节程序连续分配

注意:该标准还提到该构造被考虑弃用。

于 2014-06-26T08:16:45.200 回答