行為型設(shè)計(jì)模式數(shù)量較多,上一篇介紹了模板模式和策略模式,下面對迭代模式進(jìn)行介紹,挖掘其在UVM中的應(yīng)用。
迭代器模式
Iterator Design Pattern: 對容器 (聚合類,集合數(shù)據(jù)等) 的遍歷操作從容器中拆分出來,放到迭代器中,實(shí)現(xiàn)迭代操作的解耦。
大部分編程語言都提供了多種遍歷集合的方式,比如for循環(huán),foreach循環(huán)等。對于簡單的遍歷,可以利用語言提供的迭代方式完成遍歷操作,對于復(fù)雜條件的集合遍歷,比如支持廣度優(yōu)先和深度優(yōu)先遍歷的樹結(jié)構(gòu),用戶需要自己創(chuàng)建迭代器。
迭代器模式的結(jié)構(gòu)分為迭代器接口和迭代器實(shí)現(xiàn)類,容器接口和容器實(shí)現(xiàn)類。接口類是為了面向接口編程。迭代器中一般包含next()函數(shù)用于返回容器中的元素,布爾型變量hasNext判斷是否結(jié)束循環(huán)。
Python中的迭代器
Systemverilog對聚合類型數(shù)據(jù)(Aggregate data types)的操作并沒有把迭代器 “暴露” 出來,先從Python開始了解。Python允許用戶自定義類對迭代的支持。
引用Python Documentation
迭代器是一個(gè)表示數(shù)據(jù)流的對象;這個(gè)對象每次只返回一個(gè)元素。Python 迭代器必須支持 __next__() 方法;這個(gè)方法不接受參數(shù),并總是返回?cái)?shù)據(jù)流中的下一個(gè)元素。如果數(shù)據(jù)流中沒有元素,__next__() 會(huì)拋出 StopIteration 異常。
內(nèi)置的 iter() 函數(shù)接受任意對象并試圖返回一個(gè)迭代器來輸出對象的內(nèi)容或元素,并會(huì)在對象不支持迭代的時(shí)候拋出 TypeError 異常。Python 有幾種內(nèi)置數(shù)據(jù)類型支持迭代,最常見的就是列表和字典。如果一個(gè)對象能生成迭代器,那么它就會(huì)被稱作 iterable。
>>> L = [1, 2, 3] >>> it = iter(L) >>> it <...iterator object at ...> >>> it.__next__() # same as next(it) 1 >>> next(it) 2 >>> next(it) 3 >>> next(it) Traceback (most recent call last): File "", line 1, in StopIteration >>>
Python 有不少要求使用可迭代的對象的地方,其中最重要的就是 for 表達(dá)式。在表達(dá)式 for X in Y,Y 要么自身是一個(gè)迭代器,要么能夠由 iter() 創(chuàng)建一個(gè)迭代器。以下兩種表達(dá)是等價(jià)的nonedisplay: none;'>
生成器表達(dá)式和列表推導(dǎo)式
迭代器的輸出有兩個(gè)很常見的使用方式,1) 對每一個(gè)元素執(zhí)行操作,2) 選擇一個(gè)符合條件的元素子集。比如,給定一個(gè)字符串列表,你可能想去掉每個(gè)字符串尾部的空白字符,或是選出所有包含給定子串的字符串。
列表推導(dǎo)式和生成器表達(dá)時(shí)(簡寫:"listcomps" 和 "genexps")讓這些操作更加簡明,這個(gè)形式借鑒自函數(shù)式程序語言 Haskell(Haskell Language)。你可以用以下代碼去掉一個(gè)字符串流中的所有空白字符nonedisplay: none;'>
通過列表推導(dǎo)式,你會(huì)獲得一個(gè) Python 列表;stripped_list 就是一個(gè)包含所有結(jié)果行的列表,并不是迭代器。生成器表達(dá)式會(huì)返回一個(gè)迭代器,它在必要的時(shí)候計(jì)算結(jié)果,避免一次性生成所有的值。這意味著,如果迭代器返回一個(gè)無限數(shù)據(jù)流或者大量的數(shù)據(jù),列表推導(dǎo)式就不太好用了。這種情況下生成器表達(dá)式會(huì)更受青睞。
生成器表達(dá)式兩邊使用圓括號 (" ( ) ") ,而列表推導(dǎo)式則使用方括號 (" [ ] ")。
SV數(shù)組內(nèi)建方法
和數(shù)組定位相關(guān)的,SV提供了6種方式:
如何實(shí)現(xiàn)是關(guān)鍵,如何維護(hù)游標(biāo),如何判斷返回元素滿足條件,這些需要根據(jù)實(shí)際業(yè)務(wù)具體實(shí)現(xiàn)。
迭代器在scoreboard中的應(yīng)用
scoreboard一邊接收dut transaction放入容器actual_array, 一邊接收golden transaction放入容器golden_array。如果是保序的,則可以直接按先后順序?qū)Ρ龋绻皇潜P虻模瑒t需要按照相應(yīng)規(guī)則遍歷容器篩選出transaction。
如果規(guī)則是Packet不是保序的,但是addr保持不變,則可以通過SV內(nèi)建方法 find_index() with (item.addr == addr)在容器中篩選出待比較的Packet。find_index() with (expression) 中內(nèi)建了迭代器,根據(jù)所給的expression條件“吐出”符合的元素。
ication Environment Based on Software Design Patterns 中將迭代器模式應(yīng)用到scoreboard中。
常見的scoreboard的構(gòu)建方式:OVM/UVM Scoreboards - Fundamental Architectures
審核編輯:劉清
-
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19227 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85037 -
DUT
+關(guān)注
關(guān)注
0文章
189瀏覽量
12490 -
for循環(huán)
+關(guān)注
關(guān)注
0文章
61瀏覽量
2537 -
迭代器
+關(guān)注
關(guān)注
0文章
44瀏覽量
4344
原文標(biāo)題:UVM設(shè)計(jì)模式:迭代器模式、Python/SV中的迭代器、callback_iter、scoreboard中的迭代器
文章出處:【微信號:IP與SoC設(shè)計(jì),微信公眾號:IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論