Заявление о выходе в 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 ответа

Решение

Когда вы просто позвоните 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() называется, он ожидает объекта генератора в ответ. В этом случае ваш второй метод является лучшим.

Но если вы действительно хотите сделать это в отдельной функции (и я не вижу необходимости делать это в отдельном методе), вы можете напрямую вернуть результат self.wait_clks(5) обратно из 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
.
.

Как описано Анандом, вы не можете просто вызвать генератор, в этом случае, если вы дадите генератор, вы получите то, что ожидаете "

def rst(self):
    rst.next=rst.active
    yield self.wait_clks(5)
Другие вопросы по тегам