Разница между оператором yield в Python и MyHDL

В настоящее время я изучаю MyHDL для моего летнего проекта. У меня есть проблема с пониманием функционирования отчета о доходности в нем. Хотя это правда, что MyHDL основан на Python, он использует свой оператор yield специальным образом. ссылка на это же: http://www.myhdl.org/doc/current/manual/reference.html.

в нем говорится: генераторы MyHDL являются стандартными генераторами Python со специальными операторами yield. На языках описания аппаратных средств эквивалентные операторы называются списками чувствительности. Общий формат операторов yield в генераторах MyHDL: yield clause [, clause ...] Когда генератор выполняет оператор yield, его выполнение в этот момент приостанавливается. В то же время каждое предложение является триггерным объектом, который определяет условие, при котором генератор должен быть возобновлен. Однако при вызове оператора yield генератор возобновляется ровно один раз, независимо от количества предложений. Это происходит при первом срабатывании.

Я не в состоянии понять это. Может ли кто-нибудь объяснить это простыми словами? или возможно перенаправить меня на другой источник?

Я буду благодарен, если вы поможете. Спасибо!

С уважением

3 ответа

Решение

Прежде всего: помните, что реализация MyHDL является строго чистым Python. В этом смысле нет никакой разницы между оператором yield в MyHDL и Python.

MyHDL действительно способ использовать Python в качестве HDL. Частично это достигается путем реализации некоторых специфических для аппаратного дизайна объектов в чистом пакете Python, называемом myhdl. Например, есть объект myhdl.Simulation, который запускает генераторы способом, подходящим для аппаратного моделирования.

Другая часть - это просто интерпретация определенных функций Python аппаратным способом. Например, аппаратный модуль моделируется как функция Python, которая возвращает генераторы. Другим примером является то, что оператор yield поддается интерпретации как функция ожидания.

Оператор yield используется для создания генераторов. В свою очередь, эти генераторы могут использоваться с объектом Simulation(...) в MyHDL или с функциями конвертера. Другими словами, генераторы используются в MyHDL, передавая все генераторы, которые описывают аппаратное поведение, в симулятор. Функция Simulation.run() будет использовать "next()".

В разделе моделирования RTL руководства MyHDL http://www.myhdl.org/doc/current/manual/modeling.html приведено несколько хороших примеров того, как создавать генераторы MyHDL и использовать их в моделировании.

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