6

我目前正在为我的暑期项目学习 MyHDL。我在掌握其中的 yield 语句的功能时遇到了问题。虽然 MyHDL 确实基于 python,但它以一种专门的方式使用它的 yield 语句。相同的链接是: http ://www.myhdl.org/doc/current/manual/reference.html#myhdl.always

它指出: MyHDL 生成器是标准的 Python 生成器,带有专门的 yield 语句。在硬件描述语言中,等效的语句称为敏感度列表。MyHDL 生成器中yield 语句的一般格式是:yield 子句[, 子句...] 当生成器执行yield 语句时,它的执行会在此时暂停。同时,每个子句都是一个触发对象,它定义了应该恢复生成器的条件。但是,每次调用 yield 语句,生成器只恢复一次,而不管子句的数量。这发生在发生的第一个触发器上。

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

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

问候

4

3 回答 3

3

首先也是最重要的:记住 MyHDL 实现是严格的纯 Python。从这个意义上说,MyHDL 和 Python 中的 yield 语句之间没有“区别”。

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

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

于 2011-05-19T19:19:41.763 回答
2

MyHDL 正在使用该yield语句来传达一系列条件,当其中一个条件为 时True,将恢复生成器的执行。例如,clock.posedge当时钟从低电平转换为高电平(0 到 1)时,发生器可能会产生条件——当时钟进行此转换时,发生器将恢复。

为了(大致)模拟它是如何工作的,这里有一个 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()。例如,如果您传递defaultarg,当生成器耗尽时,它将返回default而不是raiseStopIteration

varconds指向一个包含条件的元组。在上面的这个例子中,它指向一个包含 2 个lambda 匿名函数元组process

语法:

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

调用any内置函数,传递给它一个循环并计算的生成器表达式。它是写作的简写:condsif cond(i) is True

for cond in conds:
    if cond(i):
        conds = next(gen)
        break
于 2011-05-19T05:27:14.450 回答
2

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

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

于 2011-05-19T17:08:56.583 回答