myhdl 中的 yield 语句

yield statement in myhdl

我的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

我对此感到困惑,是否有人可以解释为什么函数定义中的 yield 不起作用?

当你简单地调用一个 generator function (一个在其主体中有 yield 语句的)时,你会得到一个生成器对象,它甚至不会在那个时候开始通过函数,它只会在您开始迭代 returned 生成器对象(或对其调用 next())。示例 -

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

正如您在上面看到的,它并没有开始遍历函数,它只是 returned 生成器对象。要完成该函数,您需要迭代 g 或对其调用 next()。示例 -

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

在您的第一种情况下也发生了类似的事情,您只是调用生成器函数,return生成器对象,然后丢弃结果。最有可能的是,从任何调用 rst() 的地方,它都期待 return 中的生成器对象。在这种情况下你的第二种方法是最好的。

但是如果你真的真的想在一个单独的函数中制作它(我认为没有必要在一个单独的方法中制作它),你可以直接 return [=19= 的结果] 从 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
.
.

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

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