Разница между двумя событиями Specman с одним и тем же событием выборки @sim

У меня есть два события с одним и тем же событием выборки @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?


person renvill    schedule 17.02.2017    source источник
comment
Какое событие запускает проверку?   -  person Thorsten    schedule 18.02.2017


Ответы (1)


Сам Scoreboard не выбирает строки, он просто добавляет значения, которые были переданы ему через порты. Я предполагаю, что когда port_b был написан, табло получило свое текущее значение (которое в то время было A). При сравнении значения, при записи port_a - табло сравнивалось с сохраненным значением (A), а не с новым значением.

Правильно ли я понимаю: значение A («добавить») обновляется перед B («совпадение»)? Если это так, я предполагаю, что вы используете delay_match_in_scbd() вместо match_in_scbd(). Это означает, что Scoreboard сохраняет значение, и сравнение происходит при вызове add().

Вы можете выполнить команду «tracescoreboard», чтобы увидеть, когда элементы записываются в порты Scoreboard и когда происходит сравнение.

person user3467290    schedule 20.02.2017
comment
Ты прав. Я исправил концепцию табло «не выборки» строк, но фактически получает любое значение, переданное ему через interface_ports. Я исправил форму волны, и теперь вы можете видеть, что часть «добавить» произошла раньше, чем «совпадение». Кроме того, я не использовал/не модифицировал никакие delay_match_in_scbd() или match_in_scbd(), поэтому схема сопоставления по умолчанию для uvm_scoreboard должна быть на месте. Но это не имеет значения, потому что основная проблема здесь заключается в том, как Specman отбирал данные с помощью @sim. Так что даже вне контекста табло я все равно вижу проблему. - person renvill; 21.02.2017
comment
Ожидание, что порт данных data_b будет прочитан при удалении signal_b, является правильным. Если вы видите что-то другое - вам следует отлаживать тест.... например - использовать команду trace port. Также кажется, что строки, которые вы поместили здесь, являются модификациями копирования и вставки из реального кода и не используют допустимый синтаксис e (например, - unit is или on event. ), поэтому, возможно, в коде есть что-то, что могло бы пролить некоторый свет, но трудно сказать как мы не видим реального кода - person user3467290; 23.02.2017