我的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
我对此感到困惑,如果有人能解释为什么函数定义中的收益率不起作用?
答案 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)