Смена тактового блока часов полярности на лету - PullRequest
1 голос
/ 09 июля 2019

Я создаю 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 Ответ

2 голосов
/ 10 июля 2019

Предполагая, что монитор имеет эксклюзивный доступ к блоку синхронизации, вы можете рассмотреть возможность изменения события синхронизации в интерфейсе с помощью квалификатора 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
...