0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python中的迭代器介紹 迭代器在scoreboard中的應(yīng)用有哪些?

rfdqdzdg ? 來(lái)源:IC Verification Club ? 2023-08-08 09:41 ? 次閱讀

迭代器模式

Iterator Design Pattern: 對(duì)容器 (聚合類(lèi),集合數(shù)據(jù)等) 的遍歷操作從容器中拆分出來(lái),放到迭代器中,實(shí)現(xiàn)迭代操作的解耦。

大部分編程語(yǔ)言都提供了多種遍歷集合的方式,比如for循環(huán),foreach循環(huán)等。對(duì)于簡(jiǎn)單的遍歷,可以利用語(yǔ)言提供的迭代方式完成遍歷操作,對(duì)于復(fù)雜條件的集合遍歷,比如支持廣度優(yōu)先和深度優(yōu)先遍歷的樹(shù)結(jié)構(gòu),用戶(hù)需要自己創(chuàng)建迭代器。

迭代器模式的結(jié)構(gòu)分為迭代器接口和迭代器實(shí)現(xiàn)類(lèi),容器接口和容器實(shí)現(xiàn)類(lèi)。接口類(lèi)是為了面向接口編程。迭代器中一般包含next()函數(shù)用于返回容器中的元素,布爾型變量hasNext判斷是否結(jié)束循環(huán)。

Python中的迭代器

Systemverilog對(duì)聚合類(lèi)型數(shù)據(jù)(Aggregate data types)的操作并沒(méi)有把迭代器 “暴露” 出來(lái),先從Python開(kāi)始了解。Python允許用戶(hù)自定義類(lèi)對(duì)迭代的支持。

引用Python Documentation

迭代器是一個(gè)表示數(shù)據(jù)流的對(duì)象;這個(gè)對(duì)象每次只返回一個(gè)元素。Python 迭代器必須支持 __next__() 方法;這個(gè)方法不接受參數(shù),并總是返回?cái)?shù)據(jù)流中的下一個(gè)元素。如果數(shù)據(jù)流中沒(méi)有元素,__next__() 會(huì)拋出 StopIteration 異常。

內(nèi)置的 iter() 函數(shù)接受任意對(duì)象并試圖返回一個(gè)迭代器來(lái)輸出對(duì)象的內(nèi)容或元素,并會(huì)在對(duì)象不支持迭代的時(shí)候拋出 TypeError 異常。Python 有幾種內(nèi)置數(shù)據(jù)類(lèi)型支持迭代,最常見(jiàn)的就是列表和字典。如果一個(gè)對(duì)象能生成迭代器,那么它就會(huì)被稱(chēng)作 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 有不少要求使用可迭代的對(duì)象的地方,其中最重要的就是 for 表達(dá)式。在表達(dá)式 for X in Y,Y 要么自身是一個(gè)迭代器,要么能夠由 iter() 創(chuàng)建一個(gè)迭代器。以下兩種表達(dá)是等價(jià)的nonedisplay: none;'>

生成器表達(dá)式和列表推導(dǎo)式

迭代器的輸出有兩個(gè)很常見(jiàn)的使用方式,1) 對(duì)每一個(gè)元素執(zhí)行操作,2) 選擇一個(gè)符合條件的元素子集。比如,給定一個(gè)字符串列表,你可能想去掉每個(gè)字符串尾部的空白字符,或是選出所有包含給定子串的字符串。

列表推導(dǎo)式和生成器表達(dá)時(shí)(簡(jiǎn)寫(xiě):"listcomps" 和 "genexps")讓這些操作更加簡(jiǎn)明,這個(gè)形式借鑒自函數(shù)式程序語(yǔ)言 Haskell(Haskell Language)。你可以用以下代碼去掉一個(gè)字符串流中的所有空白字符nonedisplay: none;'>

通過(guò)列表推導(dǎo)式,你會(huì)獲得一個(gè) Python 列表;stripped_list 就是一個(gè)包含所有結(jié)果行的列表,并不是迭代器。生成器表達(dá)式會(huì)返回一個(gè)迭代器,它在必要的時(shí)候計(jì)算結(jié)果,避免一次性生成所有的值。這意味著,如果迭代器返回一個(gè)無(wú)限數(shù)據(jù)流或者大量的數(shù)據(jù),列表推導(dǎo)式就不太好用了。這種情況下生成器表達(dá)式會(huì)更受青睞。

生成器表達(dá)式兩邊使用圓括號(hào) (" ( ) ") ,而列表推導(dǎo)式則使用方括號(hào) (" [ ] ")。

SV數(shù)組內(nèi)建方法

和數(shù)組定位相關(guān)的,SV提供了6種方式:

39e6530a-3521-11ee-9e74-dac502259ad0.png

如何實(shí)現(xiàn)是關(guān)鍵,如何維護(hù)游標(biāo),如何判斷返回元素滿(mǎn)足條件,這些需要根據(jù)實(shí)際業(yè)務(wù)具體實(shí)現(xiàn)。

迭代器在scoreboard中的應(yīng)用

scoreboard一邊接收dut transaction放入容器actual_array, 一邊接收golden transaction放入容器golden_array。如果是保序的,則可以直接按先后順序?qū)Ρ?,如果不是保序的,則需要按照相應(yīng)規(guī)則遍歷容器篩選出transaction。

如果規(guī)則是Packet不是保序的,但是addr保持不變,則可以通過(guò)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中。

常見(jiàn)的scoreboard的構(gòu)建方式:OVM/UVM Scoreboards - Fundamental Architectures





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19112
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    313

    瀏覽量

    20923
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84293
  • for循環(huán)
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    2483
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    4294

原文標(biāo)題:UVM設(shè)計(jì)模式 ( 五 ) 迭代器模式、Python/SV中的迭代器、callback_iter、scoreboard中的迭代器

文章出處:【微信號(hào):數(shù)字芯片設(shè)計(jì)工程師,微信公眾號(hào):數(shù)字芯片設(shè)計(jì)工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    談?wù)?b class='flag-5'>Python 迭代模式

    年,Design Patterns - Elements of Reusable Object-Oriented Software),它提出了23種設(shè)計(jì)模式。迭代模式就是其中的一種,
    發(fā)表于 11-23 13:10 ?766次閱讀
    談?wù)?b class='flag-5'>Python</b> <b class='flag-5'>中</b>的<b class='flag-5'>迭代</b><b class='flag-5'>器</b>模式

    Python高級(jí)特性:迭代切片的應(yīng)用

    Python 獨(dú)特的一種高級(jí)特性,而切片也是一種高級(jí)特性,兩者相結(jié)合,會(huì)產(chǎn)生什么樣的結(jié)果呢? 1、迭代迭代 首先,
    發(fā)表于 11-29 10:11 ?641次閱讀

    淺談python迭代

      說(shuō)道python迭代之前,不得不提到的就是遠(yuǎn)古時(shí)期的C語(yǔ)言的時(shí)代,如果想要對(duì)一個(gè)數(shù)組進(jìn)行遍歷,只能使用for循環(huán)。
    發(fā)表于 11-24 17:01 ?296次閱讀
    淺談<b class='flag-5'>python</b><b class='flag-5'>中</b>的<b class='flag-5'>迭代</b><b class='flag-5'>器</b>

    請(qǐng)問(wèn)迭代的實(shí)現(xiàn)原理是什么?

    什么是集合框架?LIST接口的實(shí)際應(yīng)用?迭代的實(shí)現(xiàn)原理是什么?
    發(fā)表于 11-04 09:45

    js迭代異步介紹

    js 迭代 異步 介紹 (Introduction)It’s been a long while coming and I feel it’s high time I made a post
    發(fā)表于 09-06 09:26

    python迭代

    的,哪些是不可迭代的。但是對(duì)新手來(lái)說(shuō),可能需要借助一些函數(shù)來(lái)判別,比如 Python 內(nèi)置的 collections.abc 模塊,這個(gè)模塊只有 Python
    發(fā)表于 02-24 15:42

    OpenHarmony的HDF單鏈表及其迭代

    迭代。直觀上看,除了第一個(gè)節(jié)點(diǎn),其它節(jié)點(diǎn)都可以通過(guò)next訪問(wèn)到,第一個(gè)節(jié)點(diǎn)通過(guò)root訪問(wèn)到。那實(shí)際上會(huì)不會(huì)就是這么簡(jiǎn)單呢?其實(shí)不然,因?yàn)樾枰紤]到節(jié)點(diǎn)刪除的因素。如下圖,鏈表迭代
    發(fā)表于 08-30 10:31

    OpenHarmony的HDF單鏈表及其迭代

    節(jié)點(diǎn)的地址。因?yàn)閱捂湵碇恢С滞粋€(gè)方向查找,不支持往回查找,如上面的錯(cuò)誤范例。如果root記錄的是第二個(gè)節(jié)點(diǎn)地址,則第一個(gè)節(jié)點(diǎn)變得不可訪問(wèn)。迭代簡(jiǎn)介迭代是伴隨集合概念產(chǎn)生的,意思是
    發(fā)表于 09-05 11:38

    了解Python數(shù)據(jù)結(jié)構(gòu)迭代對(duì)象、迭代、生成器的概念

    了解Python的數(shù)據(jù)結(jié)構(gòu)時(shí),容器(container)、可迭代對(duì)象(iterable)、迭代(iterator)、生成器(genera
    發(fā)表于 11-15 17:34 ?771次閱讀
    了解<b class='flag-5'>Python</b>數(shù)據(jù)結(jié)構(gòu)<b class='flag-5'>迭代</b>對(duì)象、<b class='flag-5'>迭代</b><b class='flag-5'>器</b>、生成器的概念

    Python學(xué)習(xí)點(diǎn):為什么 range() 不生成迭代

    迭代是 23 種設(shè)計(jì)模式中最常用的一種(之一), Python 隨處可見(jiàn)它的身影,我們經(jīng)常用到它,但是卻不一定意識(shí)到它的存在。
    發(fā)表于 11-23 13:50 ?757次閱讀
    <b class='flag-5'>Python</b>學(xué)習(xí)點(diǎn):為什么 range() 不生成<b class='flag-5'>迭代</b><b class='flag-5'>器</b>

    python迭代詳解

    python迭代 1. 可迭代對(duì)象 可以利用 for 循環(huán)的對(duì)象,都叫可迭代對(duì)象。 列表、元組、字典、字符串等都是可
    的頭像 發(fā)表于 02-24 15:42 ?1299次閱讀

    簡(jiǎn)單介紹C++迭代

    之前的兩篇文章我們主要了解了vector和string的相關(guān)知識(shí),從中我們知道可以通過(guò)下標(biāo)來(lái)訪問(wèn)vector的元素或者string的字符,但是除了這種方式還有一種更為通用的方式獲取元素,那就是迭代,這篇文章就會(huì)簡(jiǎn)單介紹
    的頭像 發(fā)表于 03-17 14:03 ?470次閱讀

    網(wǎng)絡(luò)工程師學(xué)Python-迭代

    迭代Python 中非常重要的概念之一,它是一種對(duì)象,可以代碼按順序訪問(wèn)一組值。
    的頭像 發(fā)表于 04-20 16:58 ?872次閱讀

    迭代模式UVM的應(yīng)用哪些

    行為型設(shè)計(jì)模式數(shù)量較多,上一篇介紹了模板模式和策略模式,下面對(duì)迭代模式進(jìn)行介紹,挖掘其UVM的應(yīng)用。
    的頭像 發(fā)表于 08-14 17:15 ?547次閱讀
    <b class='flag-5'>迭代</b>模式<b class='flag-5'>在</b>UVM<b class='flag-5'>中</b>的應(yīng)用<b class='flag-5'>有</b>哪些

    計(jì)算數(shù)學(xué)的函數(shù)迭代介紹

    函數(shù)迭代是數(shù)學(xué)中一個(gè)非常重要和有趣的主題,它在不同的領(lǐng)域有著不同的應(yīng)用和著眼點(diǎn)。動(dòng)力系統(tǒng),函數(shù)迭代可以揭示復(fù)雜系統(tǒng)的演化規(guī)律和混沌現(xiàn)象;
    的頭像 發(fā)表于 08-30 10:11 ?1198次閱讀
    計(jì)算數(shù)學(xué)<b class='flag-5'>中</b>的函數(shù)<b class='flag-5'>迭代</b><b class='flag-5'>介紹</b>