我希望能够控制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
我做了通常的研究,到目前为止,已经空了。
答案 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