Python和MyHDL中yield语句的区别

6 投票
3 回答
1004 浏览
提问于 2025-04-16 17:53

我现在正在学习MyHDL,准备做一个暑期项目。 我对它里面的yield语句有点搞不懂。虽然MyHDL是基于Python的,但它的yield语句用法有些特别。 这里有个链接可以参考: http://www.myhdl.org/doc/current/manual/reference.html#myhdl.always

链接里说: MyHDL的生成器是标准的Python生成器,但它的yield语句有特别的用法。在硬件描述语言中,类似的语句叫做敏感列表。在MyHDL生成器中,yield语句的一般格式是: yield clause [, clause ...] 当生成器执行yield语句时,它会在那一刻暂停执行。同时,每个clause都是一个触发对象,定义了生成器应该在什么条件下恢复执行。不过,每次调用yield语句时,生成器只会恢复一次,无论有多少个clause。这个恢复会在第一个触发条件发生时进行。

我看不太懂这个内容。有人能用简单的语言解释一下吗?或者推荐我其他的资料吗?

如果能帮忙,我会非常感激。 谢谢!

祝好

3 个回答

2

yield语句是用来创建生成器的。生成器可以和MyHDL中的Simulation(...)对象一起使用,或者和转换函数一起用。简单来说,生成器就是用来描述硬件行为的,然后把这些生成器传给模拟器。Simulation.run()函数会使用“next()”来进行下一步操作。

在MyHDL手册的RTL建模部分,http://www.myhdl.org/doc/current/manual/modeling.html#example,有一些很好的例子,教你如何创建MyHDL生成器并在模拟中使用它们。

2

MyHDL使用了yield语句来传递一系列条件,当其中一个条件为True时,生成器会继续执行。例如,当时钟从低电平变为高电平(从0变为1)时,生成器可能会产生条件clock.posedge——一旦时钟发生这种变化,生成器就会恢复运行。

为了大致模拟这个过程,这里有一个Python生成器,当满足某个条件(参数能被3或7整除)时,它会被恢复:

def process():
    j = 0
    while True:
        yield (lambda x: x % 3 == 0, lambda x: x % 7 == 0)
        j += 1
        print 'process j=', j

gen = process()
conds = next(gen)

for i in range(1, 11):
    print 'i=', i
    if any(cond(i) for cond in conds):
        conds = next(gen)

输出:

i= 1
i= 2
i= 3
process j= 1
i= 4
i= 5
i= 6
process j= 2
i= 7
process j= 3
i= 8
i= 9
process j= 4
i= 10

更新 - 关于我使用的一些语法,稍微详细一点:

我倾向于使用[next(gen, [default])]函数,因为它比调用gen.next()更灵活。例如,如果你传入default参数,当生成器耗尽时,它会返回default,而不是引发StopIteration错误。

变量conds指向一个元组,里面包含了条件。在上面的例子中,它指向一个包含两个lambda匿名函数的元组,这两个函数是由process返回的。

语法:

if any(cond(i) for cond in conds):
    conds = next(gen)

调用了any内置函数,并传入一个生成器表达式,这个表达式会遍历conds并判断if cond(i) is True。这其实是写作:

for cond in conds:
    if cond(i):
        conds = next(gen)
        break
3

首先要知道的是,MyHDL的实现完全是用纯Python写的。从这个角度来看,MyHDL中的yield语句和Python中的yield语句没有什么区别。

MyHDL实际上是让你用Python来做硬件描述语言(HDL)。部分原因是它在一个叫做myhdl的纯Python包中实现了一些特定于硬件设计的对象。例如,有一个myhdl.Simulation对象,它以适合硬件仿真的方式运行生成器。

另外一部分则是以硬件特定的方式来解释某些Python特性。比如,一个硬件模块被建模为一个返回生成器的Python函数。再比如,"yield"语句在这里被理解为一种"等待"的功能。

撰写回答