0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中的迭代器介绍 迭代器在scoreboard中的应用有哪些?

rfdqdzdg 来源:IC Verification Club 2023-08-08 09:41 次阅读

迭代器模式

Iterator Design Pattern: 对容器 (聚合类,集合数据等) 的遍历操作从容器中拆分出来,放到迭代器中,实现迭代操作的解耦。

大部分编程语言都提供了多种遍历集合的方式,比如for循环,foreach循环等。对于简单的遍历,可以利用语言提供的迭代方式完成遍历操作,对于复杂条件的集合遍历,比如支持广度优先和深度优先遍历的树结构,用户需要自己创建迭代器。

迭代器模式的结构分为迭代器接口和迭代器实现类,容器接口和容器实现类。接口类是为了面向接口编程。迭代器中一般包含next()函数用于返回容器中的元素,布尔型变量hasNext判断是否结束循环。

Python中的迭代器

Systemverilog对聚合类型数据(Aggregate data types)的操作并没有把迭代器 “暴露” 出来,先从Python开始了解。Python允许用户自定义类对迭代的支持。

引用Python Documentation

迭代器是一个表示数据流的对象;这个对象每次只返回一个元素。Python 迭代器必须支持 __next__() 方法;这个方法不接受参数,并总是返回数据流中的下一个元素。如果数据流中没有元素,__next__() 会抛出 StopIteration 异常。

内置的 iter() 函数接受任意对象并试图返回一个迭代器来输出对象的内容或元素,并会在对象不支持迭代的时候抛出 TypeError 异常。Python 有几种内置数据类型支持迭代,最常见的就是列表和字典。如果一个对象能生成迭代器,那么它就会被称作 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 表达式。在表达式 for X in Y,Y 要么自身是一个迭代器,要么能够由 iter() 创建一个迭代器。以下两种表达是等价的nonedisplay: none;'>

生成器表达式和列表推导式

迭代器的输出有两个很常见的使用方式,1) 对每一个元素执行操作,2) 选择一个符合条件的元素子集。比如,给定一个字符串列表,你可能想去掉每个字符串尾部的空白字符,或是选出所有包含给定子串的字符串。

列表推导式和生成器表达时(简写:"listcomps" 和 "genexps")让这些操作更加简明,这个形式借鉴自函数式程序语言 Haskell(Haskell Language)。你可以用以下代码去掉一个字符串流中的所有空白字符nonedisplay: none;'>

通过列表推导式,你会获得一个 Python 列表;stripped_list 就是一个包含所有结果行的列表,并不是迭代器。生成器表达式会返回一个迭代器,它在必要的时候计算结果,避免一次性生成所有的值。这意味着,如果迭代器返回一个无限数据流或者大量的数据,列表推导式就不太好用了。这种情况下生成器表达式会更受青睐。

生成器表达式两边使用圆括号 (" ( ) ") ,而列表推导式则使用方括号 (" [ ] ")。

SV数组内建方法

和数组定位相关的,SV提供了6种方式:

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

如何实现是关键,如何维护游标,如何判断返回元素满足条件,这些需要根据实际业务具体实现。

迭代器在scoreboard中的应用

scoreboard一边接收dut transaction放入容器actual_array, 一边接收golden transaction放入容器golden_array。如果是保序的,则可以直接按先后顺序对比,如果不是保序的,则需要按照相应规则遍历容器筛选出transaction。

如果规则是Packet不是保序的,但是addr保持不变,则可以通过SV内建方法 find_index() with (item.addr == addr)在容器中筛选出待比较的Packet。find_index() with (expression) 中内建了迭代器,根据所给的expression条件“吐出”符合的元素。

ication Environment Based on Software Design Patterns 中将迭代器模式应用到scoreboard中。

常见的scoreboard的构建方式:OVM/UVM Scoreboards - Fundamental Architectures





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18972
  • 生成器
    +关注

    关注

    7

    文章

    302

    浏览量

    20228
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
  • for循环
    +关注

    关注

    0

    文章

    61

    浏览量

    2420
  • 迭代器
    +关注

    关注

    0

    文章

    43

    浏览量

    4273

原文标题:UVM设计模式 ( 五 ) 迭代器模式、Python/SV中的迭代器、callback_iter、scoreboard中的迭代器

文章出处:【微信号:数字芯片设计工程师,微信公众号:数字芯片设计工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    谈谈Python 中的迭代器模式

    中都得到了广泛的应用。 本文将谈谈 Python 中的迭代器模式,主要内容:什么是迭代器模式、Python 如何实现迭代器模式、iterto
    发表于 11-23 13:10 683次阅读
    谈谈<b class='flag-5'>Python</b> 中的<b class='flag-5'>迭代</b>器模式

    Python高级特性:迭代器切片的应用

    在前两篇关于 Python 切片的文章中,我们学习了切片的基础用法、高级用法、使用误区,以及自定义对象如何实现切片用法(相关链接见文末)。本文是切片系列的第三篇,主要内容是迭代器切片。 迭代
    发表于 11-29 10:11 580次阅读

    浅谈python中的迭代

      说道python迭代器之前,不得不提到的就是在远古时期的C语言的时代,如果想要对一个数组进行遍历,只能使用for循环。
    发表于 11-24 17:01 218次阅读
    浅谈<b class='flag-5'>python</b>中的<b class='flag-5'>迭代</b>器

    matlab牛顿迭代法全解

    非线性方程(或方程组)问题可以描述为求 x 使得f(x) = 0。求解非线性方程的方法,牛顿迭代法是求非线性方程(非线性方程组)数值解的一种重要的方法。牛顿是微积分创立者之一,微积分
    发表于 03-08 16:22

    多初值迭代过程如何图示

    将函数的迭代过程图示出来,但是是多个初值,每个初值迭代的过程的数值结果都有,显示一张图上。类似这种图。求大神给个思路,用什么函数
    发表于 08-18 10:45

    通过开发集和度量指标加速迭代

    ,从而产生新的想法,并保持这一迭代过程。迭代过程如下图所示:迭代过程循环得越快,你也将进展得越快。此时,拥有开发集、测试集和度量指标的重要性便得以体现了:每当你了一个新想法,
    发表于 12-13 14:06

    请问迭代的实现原理是什么?

    什么是集合框架?LIST接口的实际应用?迭代的实现原理是什么?
    发表于 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
    发表于 09-06 09:26

    python迭代

    的,哪些是不可迭代的。但是对新手来说,可能需要借助一些函数来判别,比如 Python 内置的 collections.abc 模块,这个模块只有 Python
    发表于 02-24 15:42

    OpenHarmony的HDF单链表及其迭代

    迭代。直观上看,除了第一个节点,其它节点都可以通过next访问到,第一个节点通过root访问到。那实际上会不会就是这么简单呢?其实不然,因为需要考虑到节点删除的因素。如下图,链表迭代
    发表于 08-30 10:31

    OpenHarmony的HDF单链表及其迭代

    节点的地址。因为单链表只支持往一个方向查找,不支持往回查找,如上面的错误范例。如果root记录的是第二个节点地址,则第一个节点变得不可访问。迭代简介迭代是伴随集合概念产生的,意思是
    发表于 09-05 11:38

    Python学习点:为什么 range() 不生成迭代

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在。在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成
    发表于 11-23 13:50 685次阅读
    <b class='flag-5'>Python</b>学习点:为什么 range() 不生成<b class='flag-5'>迭代</b>器

    python迭代器详解

    python迭代器 1. 可迭代对象 可以利用 for 循环的对象,都叫可迭代对象。 列表、元组、字典、字符串等都是可迭代对象。 # 以列表
    的头像 发表于 02-24 15:42 1173次阅读

    python迭代调用内置函数计时比较(上)

    python迭代工具自动调用迭代对象next方法,对迭代对象进行遍历。 python的for循环、列表解析、map方法、生成器表达式、
    的头像 发表于 02-21 14:56 426次阅读

    python迭代调用内置函数计时比较(下)

    python迭代工具自动调用迭代对象next方法,对迭代对象进行遍历。 python的for循环、列表解析、map方法、生成器表达式、
    的头像 发表于 02-21 14:56 348次阅读