[英]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.