PyGears TypeMatchError: [0], Incomplete type: Tuple[Fixp[32], Fixp[32]]

PyGears TypeMatchError: [0], Incomplete type: Tuple[Fixp[32], Fixp[32]]

我在 PyGears 中处理简单模块时遇到问题。我想进行简单的添加操作,然后进行舍入和饱和。我得到的错误是:

File "/home/stefan/Test/test.py", line 15, in drv(t=Tuple[Fixp[32], Fixp[32]], seq=[Tuple[3,2]]) \ TypeMatchError: [0], Incomplete type: Tuple[Fixp[32], Fixp[32]]

  • when resolving return type "t"
  • when instantiating "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]
  2. add运算后的输出为Q11.33格式,因此通过舍入运算去除22位没有意义。如果您想保留所有 22 个小数位,请删除 qround 并保持 saturate 不变。但我建议四舍五入到 21 位并饱和到 saturate(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)