Como posso esperar por um evento de uma lista de eventos em Specman?
Pergunta
Eu tenho uma estrutura em Specman:
struct foo_s {
event foo_ev;
// some code that will emit foo_ev sometimes
};
E uma lista:
var foo_l: list of foo_s; // later code will manage the list
E agora eu quero sincronizar em qualquer um dos foo_ev
Eventos na lista:
first of {
sync @foo_l[0].foo_ev;
sync @foo_l[1].foo_ev;
sync @foo_l[2].foo_ev;
//etc
};
O problema é que, na época, esse trecho é executado, não sei quantos elementos estão em foo_l
. Existe alguma maneira de eu esperar por algum do foo_ev
eventos a serem emitidos?
Solução
Você pode manualmente cascata o evento:
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
};
Outras dicas
Outra solução seria usar uma macro calculada. O conceito de macros computados é escrever código para gerar código eletrônico. Usando esta abordagem, você pode olhar para o comprimento de foo_l
e gerar o first of { sync ...
Liste como substituição da macro.
Desculpe, atualmente não tenho tempo para preparar um exemplo, mas a documentação do Specman deve ser seu amigo, se você estiver interessado. Se você ainda não ouviu falar sobre macros computados, definitivamente vale a pena dar uma olhada.
ATUALIZAR]: Em equipe Specman, eles acabaram de publicar um Exemplo de uma macro calculada. Eles também têm alguns Posts mais antigos neste tópico.