Разница между инструкцией yield в python и MyHDL
в настоящее время я изучаю MyHDL для своего летнего проекта. У меня есть проблема с пониманием функционирования утверждения yield в нем. Хотя верно, что MyHDL основан на python, он использует свой оператор yield специализированным способом. ссылка на то же самое : http://www.myhdl.org/doc/current/manual/reference.html#myhdl.always
Это Штаты: генераторы MyHDL являются стандартными генераторами Python со специализированными инструкциями yield. В описании оборудования языки, эквивалентные операторы называются списками чувствительности. Общий формат операторов yield в генераторах MyHDL: предложение yield [, предложение ...] Когда генератор выполняет оператор yield, его выполнение приостанавливается в этой точке. В то же время каждое предложение является объектом триггера, который определяет условие, при котором генератор должен быть возобновлен. Однако при каждом вызове оператора yield генератор возобновляется ровно один раз, независимо от количества предложений. Этот происходит при первом же срабатывании.
Я не в состоянии постичь это. Кто-нибудь может объяснить простыми словами? или, может быть, перенаправить меня к другому источнику?
Я буду благодарен, если вы сможете помочь. Спасибо!
в отношении
3 ответов
прежде всего: помните, что реализация MyHDL является строго чистым Python. В этом смысле нет никакой" разницы " между инструкцией yield в MyHDL и в Python.
MyHDL действительно является способом использования Python в качестве HDL. Частично это делается путем реализации определенных объектов аппаратного дизайна в чистом пакете Python под названием myhdl. Например, существует myhdl.Объект моделирования, который запускает генераторы способом, подходящим для аппаратного моделирования.
в другая часть просто интерпретирует определенные функции Python определенным аппаратным способом. Например, аппаратный модуль моделируется как функция Python, возвращающая генераторы. Другим примером является то, что оператор" yield "интерпретируется как функциональность" wait".
MyHDL использует yield
заявление для передачи списка условий, которые, когда один из них True
, возобновит выполнение генератора. Например, генератор может выдавать условие clock.posedge
когда часы переходят от низкого к высокому (0 к 1) -- Когда часы делают этот переход, генератор будет возобновлен.
чтобы смоделировать (грубо), как это работает, вот генератор Python, который возобновляется, когда одно из его условий (аргумент равномерно делятся на 3 или 7) встречаются:
def process():
j = 0
while True:
yield (lambda x: x % 3 == 0, lambda x: x % 7 == 0)
j += 1
print 'process j=', j
gen = process()
conds = next(gen)
for i in range(1, 11):
print 'i=', i
if any(cond(i) for cond in conds):
conds = next(gen)
выход:
i= 1
i= 2
i= 3
process j= 1
i= 4
i= 5
i= 6
process j= 2
i= 7
process j= 3
i= 8
i= 9
process j= 4
i= 10
обновление - немного более подробно о некоторых синтаксисе, который я использовал:
я склонен использовать [next(gen, [default])
] функция, поскольку она немного более гибкая, чем вызов gen.next()
. Например, если вы передаете default
arg, когда генератор будет исчерпан, он вернется default
, а не повышение StopIteration
.
ВАР conds
указывает на кортежа!--29-->, содержащий условия. В этом случае выше он указывает на кортежа!--29--> содержащий 2 анонимные функции, лямбда - возвращено process
.
синтаксис:
if any(cond(i) for cond in conds):
conds = next(gen)
называет any
встроенная функция, передав ему выражение генератор, который проходит по conds
и оценивает if cond(i) is True
. Это стенография для написания:
for cond in conds:
if cond(i):
conds = next(gen)
break
оператор yield используется для создания генераторов. В свою очередь, эти генераторы могут быть использованы при моделировании(...) объект в пределах MyHDL или с функциями преобразователя. Другими словами, генераторы используются в MyHDL, передавая симулятору все генераторы, описывающие поведение оборудования. моделирование.функция run () будет использовать "next ()".
в разделе моделирования RTL руководства MyHDL, http://www.myhdl.org/doc/current/manual/modeling.html#example, некоторые хорошие примеры того, как создать генераторы MyHDL и использовать их в симуляции.