1

我的 myhdl 环境中有以下代码:

def rst(self):
   rst.next=rst.active
   self.wait_clks(5)

def wait_clks(self, cycles):
   for _ in range(cycles):
      yield self.clk.posedge

上面的代码不起作用,但是当我用以下代码替换它时它起作用:

def rst(self):
   rst.next=rst.active
   for _ in range(5):
      yield self.clk.posedge

我对此感到困惑,如果有人能解释为什么函数定义中的产量不起作用?

4

2 回答 2

1

当您简单地调用 a generator function(一个在其主体中具有 yield 语句的) 时,您会得到一个生成器对象,它甚至不会在该点开始遍历该函数,它只会在您开始迭代返回的生成器对象(或调用next()它)。例子 -

>>> def gen1():
...     print("Starting")
...     for i in range(10):
...             yield i
...
>>> g = gen1()
>>> g
<generator object gen1 at 0x00273E68>

正如你在上面看到的,它并没有开始通过函数,它只是返回了生成器对象。要遍历该函数,您需要迭代g或调用next()它。例子 -

>>> g.next()
Starting
0
>>> for i in g:
...     print i
... 
1
2
.
.

在您的第一种情况下,也发生了类似的事情,您只是调用生成器函数,该函数返回生成器对象,然后丢弃结果。最有可能的是,无论从哪里rst()被调用,它都期待一个生成器对象作为回报。在这种情况下,您的第二种方法是最好的。

但是如果你真的想在一个单独的函数中制作它(而且我认为没有必要在一个单独的方法中制作它),你可以直接返回self.wait_clks(5)back from的结果rst(self)。例子 -

def rst(self):
   rst.next=reset.active
   return self.wait_clks(5)

显示这有效的示例 -

>>> def f():
...     return gen1()
... 
>>> for i in f():
...     print(i)
... 
Starting
0
1
2
.
.
于 2015-08-25T16:19:36.840 回答
1

正如 Anand 所描述的,您不能简单地调用生成器,在这种情况下,如果您生成生成器,您将得到您所期望的"

def rst(self):
    rst.next=rst.active
    yield self.wait_clks(5)
于 2015-08-31T17:42:29.987 回答