Как создать конверсионное время-l oop в MyHDL? - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу использовать для циклов как обобщенные в синтезируемом коде MyHDL. Мне нужно определенное количество итераций.

У меня есть список сигналов. Я хочу одну и ту же (параметризованную) операцию для всех сигналов.

Для over Always_seq (сбой)


@block
def top(clock, reset, address, data, registers):

    for reg in registers:
        @always_seq(clock.posedge, reset)
        def register_write():
            if address == reg.address:
                reg.signal.next = data

    return instances()

Проблема заключается в том, что только один блок всегда будет быть сгенерированным, потому что в этом случае я переопределяю предыдущее определение блока register_write.

ОБНОВЛЕНИЕ

Эта проблема может быть исправлена, если я собираю генераторы, подобные этому :

@block
def top3(clock, reset, address, data, registers):

    always_list = []

    for reg in registers:
        def register_write():
            if address == reg.address:
                reg.signal.next = data
        register_write = (always_seq(clock.posedge, reset))(register_write)
        always_list.append(register_write)

    return instances()

НО это повысит ConversionError: Signal has multiple drivers: reg_signal. Да, потому что кажется, что это одно и то же имя ... Это подразумевает следующий вопрос: Как я могу переименовать сигналы?


Внутри Always_seq

В этом случае MyHDL пытается преобразовать for l oop в HDL для l oop ... Это, очевидно, ограничивает использование. Есть ли способ сказать "развернуть это l oop" или "это время преобразования l oop" в MyHDL?

@block
def top(clock, reset, address, data, registers):

    signals = [x.signal for x in registers]

    @always_seq(clock.posedge, reset)
    def register_write():
        for ii in range(len(signals)):
            signals[ii].next = data

    return instances()

Каков рекомендуемый способ создания времени преобразования l oop в MyHDL?

...