PyGears TypeMatchError: [0], Неполный тип: кортеж[Fixp[32], Fixp[32]]

#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:

Я вижу здесь три проблемы:

  1. Первая проблема заключается в том, что вы неправильно определили Fixp. Вы также должны указать, сколько битов вы хотите для целочисленной части. Поэтому вы должны определить его как Fixp[10,32]
  2. Вывод после операции добавления выполняется в формате Q11.33, поэтому удаление 22 бит с помощью операции round не имеет смысла. Если вы хотите сохранить все 22 дробных бита, удалите qround и оставьте насыщать как есть. Но я бы предложил округлить до 21 бита и выполнить насыщение до насыщения (11,32)
  3. Вам не нужен 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)