1

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が機能しない理由を誰かが説明できるなら、私はこれについて混乱していますか?

4

2 に答える 2

1

(本体に yield ステートメントがあるもの)を単に呼び出すとgenerator function、ジェネレーター オブジェクトが取得されます。その時点で関数の実行が開始されることさえありません。返されたジェネレーター オブジェクトの反復処理を開始したときにのみ開始されます (または、それを呼び出します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()が呼び出された場所から、ジェネレーター オブジェクトが返されることを期待しています。その場合、2 番目の方法が最適です。

しかし、本当に別の関数で作成したい場合 (別のメソッドで作成する必要はないと思います) は、self.wait_clks(5)back fromの結果を直接返すことができますrst(self)。例 -

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
.
.
于 2015-08-25T16:19:36.840 に答える
1

Anand が説明したように、単純にジェネレーターを呼び出すことはできません。この場合、ジェネレーターを生成すると、期待どおりの結果が得られます。"

def rst(self):
    rst.next=rst.active
    yield self.wait_clks(5)
于 2015-08-31T17:42:29.987 に答える