簡體   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