繁体   English   中英

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语句的generator function )时,您将获得一个生成器对象,该对象甚至没有开始通过该函数,而是仅当您开始遍历返回的生成器对象时才开始(或在其上调用next() )。 范例-

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

正如您在上面看到的,它没有开始通过该函数,它只是返回了generator对象。 要遍历该函数,您需要遍历g或对其调用next() 范例-

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

在第一种情况以及类似情况下,您只是在调用generator函数,该函数返回generator对象,然后丢弃结果。 最有可能的是,无论从哪里调用rst() ,都期望返回一个生成器对象。 在这种情况下,第二种方法是最好的。

但是,如果您真的要在单独的函数中进行创建(并且我认为没有必要在单独的方法中进行创建),则可以直接从rst(self)返回self.wait_clks(5)的结果。 范例-

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM