python和MyHDL中的yield语句之间的区别

时间:2011-05-18 12:50:58

标签: python yield myhdl

我目前正在为夏季项目学习MyHDL。 我有一个问题,掌握屈服声明的功能。尽管MyHDL基于python是正确的,但它以专门的方式使用其yield语句。 相同的链接是: http://www.myhdl.org/doc/current/manual/reference.html#myhdl.always

它说: MyHDL生成器是具有专用yield语句的标准Python生成器。在硬件描述语言中,等效语句称为敏感性列表。 MyHDL生成器中yield语句的一般格式是: 屈服条款[,条款......] 当生成器执行yield语句时,它的执行将在该点暂停。同时,每个子句都是一个触发器对象,它定义了应该恢复生成器的条件。但是,每次调用yield语句时,无论子句数是多少,生成器都会恢复一次。这发生在第一次发生的触发上。

我无法理解它。有人可以用简单的语言解释一下吗?或者可能将我重定向到另一个来源?

如果你能提供帮助,我将不胜感激。 谢谢!

此致

3 个答案:

答案 0 :(得分:3)

首先:请记住,MyHDL实现是纯粹的纯Python。从这个意义上讲,MyHDL和Python中的yield语句之间没有“差异”。

MyHDL确实是一种将Python用作HDL的方法。部分地,这是通过在名为myhdl的纯Python包中实现一些特定于硬件设计的对象来完成的。例如,有一个myhdl.Simulation对象以适合硬件模拟的方式运行生成器。

另一部分是以硬件特定方式解释某些Python功能。例如,硬件模块被建模为返回生成器的Python函数。另一个例子是“yield”语句被解释为“等待”功能。

答案 1 :(得分: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 arg,当生成器耗尽时,它将返回default而不是raising StopIteration

变量conds指向包含条件的tuple。在上面的这种情况下,它指向包含process返回的2 tuplelambda anonymous functions

语法:

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

调用any built-in function,传递generator expression,其遍历conds并评估if cond(i) is True。这是写作的简写:

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

答案 2 :(得分:2)

yield语句用于创建生成器。反过来,这些生成器可以与MyHDL中的Simulation(...)对象一起使用,也可以与转换器函数一起使用。换句话说,通过将描述硬件行为的所有生成器传递给模拟器,在MyHDL中使用生成器。 Simulation.run()函数将使用“next()”。

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