Как я могу дождаться одного события из списка событий в Specman?
Вопрос
У меня есть структура в specman:
struct foo_s {
event foo_ev;
// some code that will emit foo_ev sometimes
};
И список:
var foo_l: list of foo_s; // later code will manage the list
И теперь я хочу синхронизироваться на любом из foo_ev
события в списке:
first of {
sync @foo_l[0].foo_ev;
sync @foo_l[1].foo_ev;
sync @foo_l[2].foo_ev;
//etc
};
Проблема в том, что во время запуска этого фрагмента я не знаю, сколько элементов находится в нем. foo_l
.Есть ли у меня способ дождаться любой принадлежащий foo_ev
события, которые будут излучаться?
Решение
Вы можете вручную каскадировать событие:
unit bar_u {
foo_l: list of foo_s;
event any_foo_toggled_e;
}
struct foo_s {
event foo_e;
on foo_e {
emit get_enclosing_unit(bar_u).any_foo_toggled_e;
};
// some code that will emit foo_ev sometimes
};
Другие советы
другим решением было бы использовать вычисляемый макрос.Концепция вычисляемых макросов заключается в написании кода для генерации электронного кода.Используя этот подход, вы можете посмотреть длину foo_l
и сгенерировать first of { sync ...
list как замена макроса.
Извините, у меня сейчас нет времени придумать пример, но документация Specman должна быть вашим другом, если вам интересно.Если вы еще не слышали о вычисляемых макросах, это определенно стоит посмотреть.
[ОБНОВЛЯТЬ]: В Team Specman только что опубликовали пример вычисляемого макроса.У них также есть некоторые старые сообщения на эту тему.