#python #pygears
#python #pygears
Вопрос:
У меня возникла проблема при работе над простым модулем в PyGears. Я хотел бы выполнить простую операцию добавления и после этого выполнить округление и насыщение. Ошибка, которую я получаю, это:
Файл «/home/stefan/Test/test.py «, строка 15, в drv(t=кортеж[Fixp[32], Fixp[32]], seq=[Кортеж[3,2]]) TypeMatchError: [0], Неполный тип: кортеж[Fixp[32], Fixp[32]]
- при разрешении возвращаемого типа «t»
- при создании экземпляра «drv»
Мой код приведен ниже:
from pygears import gear
from pygears.typing import Fixp, Tuple
from pygears.lib import add, qround, saturate, drv, collect
from pygears.sim import sim, cosim
@gear
def adder(data: Tuple[Fixp[32], Fixp[32]]):
return add(data[0],data[1])
| qround(fract=22)
| saturate(t=Fixp[10, 32])
########## VERIFICATION ENV ##########
res = []
drv(t=Tuple[Fixp[32], Fixp[32]], seq=[Tuple[3,2]])
| adder()
| float
| collect(result=res)
cosim('test.py','verilator','./home/stefan/Test')
sim()
print(res)
Ответ №1:
Я вижу здесь три проблемы:
- Первая проблема заключается в том, что вы неправильно определили Fixp. Вы также должны указать, сколько битов вы хотите для целочисленной части. Поэтому вы должны определить его как Fixp[10,32]
- Вывод после операции добавления выполняется в формате Q11.33, поэтому удаление 22 бит с помощью операции round не имеет смысла. Если вы хотите сохранить все 22 дробных бита, удалите qround и оставьте насыщать как есть. Но я бы предложил округлить до 21 бита и выполнить насыщение до насыщения (11,32)
- Вам не нужен cosim
Имея все это в виду, рабочий код должен выглядеть примерно так
from pygears import gear
from pygears.typing import Fixp, Tuple
from pygears.lib import add, qround, saturate, drv, collect
from pygears.sim import sim
@gear
def adder(data: Tuple[Fixp[10, 32], Fixp[10, 32]]):
return add(data[0],data[1])
| qround (fract=21)
| saturate(t=Fixp[11, 32])
########## VERIFICATION ENV ##########
res = []
sequence = [Tuple[3,2.222356],Tuple[3,3.12]]
drv(t=Tuple[Fixp[10, 32], Fixp[10, 32]], seq=sequence)
| adder()
| float
| collect(result=res)
sim()
print(res)