快速更改时钟模块的时钟极性

时间:2019-07-09 09:35:17

标签: system-verilog uvm

我正在创建能够切换其时钟极性的UVM VIP。接口中使用时钟块。 例如,监控器应根据UVM配置使用入局时钟的伪造或忽略来对数据进行采样-这种极性更改可能会随时发生。

这可以实现如下:

// In the interface, two clocking blocks are defined
// one for posedge (passive_cb), one for negedge (passive_cbn).

task wait_clock_event();
   if (cfg.pol == 0) @vif.passive_cb;
   else @vif.passive_cbn;
endtask

task sample_data();
  if (cfg.pol == 0) pkt.data = vif.passive_cb.data;
  else pkt.data = vif.passive_cbn.data;
endtask

task run();
  wait_clock_event();
  sample_data();
endtask

这似乎可行,但是浪费了代码行并易于出错。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

假设监视器具有对时钟块的独占访问权,则可以考虑使用iff限定符在接口中修改时钟事件。

bit pol;
clocking passive_cb @(posedge clk iff !pol, negedge clk iff pol);
  input data;
endclocking

如果pol在与目标时钟极性相同的时间步中发生变化,则可能存在争用情况。

您的监视代码将包括一个设置函数,其他任务可以简化为仅一个时钟块。

function void set_vifcb_pol();
  vif.pol = cfg.pol;
endfunction

task wait_clock_event();
  @vif.passive_cb;
endtask

task sample_data();
  pkt.data = vif.passive_cb.data;
endtask

task run();
  set_vifcb_pol();
  wait_clock_event();
  sample_data();
endtask