2009-10-07 47 views
1

我在的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事件的任何被髮射?

回答

2

您可以手動級聯事件:

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 
}; 
+0

優雅:-)強制性15個字符的擴展如下! – 2009-10-08 05:06:41

2

另一種解決方案是使用一個計算的宏。計算宏的概念是編寫代碼來生成電子代碼。使用這種方法,您可以查看foo_l的長度,並生成first of { sync ...列表作爲宏的替代。

對不起,我目前沒有時間做一個例子,但如果你有興趣,Specman文檔應該是你的朋友。如果您還沒有聽說過計算宏,那絕對值得一看。

[更新]:在Team Specman上他們剛剛發佈了example of a computed macro。他們在這個主題上也有一些older posts