У меня есть два события с одним и тем же событием выборки @sim
:
unit monitor_a_u is {
sample_a : interface_port of tlm_analysis of data_item_s is instance;
data_a : simple_port of uint(bits:32) is instance;
keep data_a.hdl_path() == "<data_a's path>";
event signal_a_r is rise(signal_a$) @sim;
on signal_a_r {
var data_a : data_item_s = new;
data_a = data_a$;
sample_a$.write(data_a);
};
unit monitor_b_u is {
sample_b : interface_port of tlm_analysis of data_item_s is instance;
data_b : simple_port of uint(bits:32) is instance;
keep data_b.hdl_path() == "<data_b's path>";
event signal_b_f is fall(signal_b$) @sim;
on signal_b_f {
var data_b : data_item_s = new;
data_b = data_b$;
sample_b$.write(data_b);
};
Когда запускаются два вышеуказанных события, данные выбираются и сравниваются на табло:
unit my_scbd_u like uvm_scoreboard {
scbd_port sample_a : add data_item_s;
scbd_port sample_b : match data_item_s;
sample_a_predict(item: data_item_s) is only {
add_to_scbd(item);
set_match_port(item, sample_b);
};
};
extend my_top_env {
my_scbd : my_scbd_u is instance;
mon_a : monitor_a_u is instance;
mon_b : monitor_b_u is instance;
connect_ports() is also {
mon_a.sample_a.connect(my_scbd.sample_a);
mon_b.sample_b.connect(my_scbd.sample_b);
};
};
Теперь в симуляторе (IES вер. 15) данные, которые я хотел бы сэмплировать, находятся в вертикальном курсоре на осциллограмме ниже, а значения показаны в столбце «Значения»:
__
signal_a __________| |____________
__________ _______________
data_a ____0x1___X____0x0________
_____
signal_b _________| |___________
_______________ ___________
data_b _____0xA_______X___0xB_____
Обнаружено несовпадение данных в момент, когда signal_b падает, и выводится сообщение примерно такого вида: "data_b (0xA) is not equal to data_a (0x0)"
. Я ожидаю, что отчет об ошибке будет "data_b (**0xB**) is not equal to data_a (0x0)"
.
Может ли кто-нибудь объяснить, почему табло, кажется, получает данные иначе, чем то, что видно на осциллограмме? Может ли это быть проблемой дельта-задержки в Specman?