Разница между оператором yield в Python и MyHDL - PullRequest
6 голосов
/ 18 мая 2011

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

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

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

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

Привет

Ответы [ 3 ]

3 голосов
/ 19 мая 2011

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

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

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

2 голосов
/ 19 мая 2011

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

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

2 голосов
/ 19 мая 2011

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, когда генератор будет исчерпан, он вернет 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
...