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