myhdl

时间:2015-08-25 16:11:15

标签: python python-2.7 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

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

2 个答案:

答案 0 :(得分:1)

当你只是调用一个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()的地方开始,它期待一个生成器对象作为回报。在这种情况下,你的第二种方法是最好的。

但是如果你真的想在单独的函数中创建它(并且我没有看到任何需要在单独的方法中创建它),你可以直接从{{1}返回self.wait_clks(5)的结果}。示例 -

rst(self)

显示此方法的示例 -

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

答案 1 :(得分:1)

正如Anand所描述的那样,你不能简单地召唤一个发电机,在这种情况下,如果你产生发电机,你将获得你所期望的和#34;

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