Я хочу использовать для циклов как обобщенные в синтезируемом коде 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?