PyGears TypeError: [0], cannot saturate 'Int[10]' to a different base type 'Fixp[8, 16]'

PyGears TypeError: [0], cannot saturate 'Int[10]' to a different base type 'Fixp[8, 16]'

我正在尝试制作一个名为 Neuron 的简单模块。思路是将输入的像素值乘以权重,然后累加。累加后,要将结果加到偏置值上,再送回输出。

代码如下,我遇到的错误是这个:

TypeError: [0], cannot saturate 'Int[10]' to a different base type 'Fixp[8, 16]' when resolving return type "type_saturate(data, t, limits)"

from pygears import gear, Intf
from pygears.typing import Queue, Tuple, Fixp
from pygears.lib import mul, accum, qround, saturate, queuemap, add
from pygears.hdl import hdlgen

@gear
def neuron (din: Queue[Tuple[Fixp[4, 16], Fixp[4, 16]]], *, bias):
  return din \
    | queuemap(f=mul) \
    | accum(init=Fixp[8, 32](0)) \
    | add(Fixp[8,32](bias)) \
    | qround \
    | saturate(t=Fixp[8, 16])
  
neuron(Intf(Queue[Tuple[Fixp[4, 16], Fixp[4, 16]]]),bias=3)
 
hdlgen('/neuron',outdir='./temp_mlp')

模块 qround 作为生产者连接到 saturate 模块,qround 模块以整数格式输出数据,在您的示例中 Int[10] 作为错误提示。 saturate 模块只能对相同基类型的数据类型进行操作,即它可以饱和 Int 到更小的 Int,或者 Fixp 到更小的 Fixp.

我猜你想要一个 Int[8] 输出,因为你已经使用了 qround

from pygears import gear, Intf
from pygears.typing import Queue, Tuple, Fixp, Int
from pygears.lib import mul, accum, qround, saturate, queuemap, add
from pygears.hdl import hdlgen

@gear
def neuron (din: Queue[Tuple[Fixp[4, 16], Fixp[4, 16]]], *, bias):
  return din \
    | queuemap(f=mul) \
    | accum(init=Fixp[8, 32](0)) \
    | add(Fixp[8,32](bias)) \
    | qround \
    | saturate(t=Int[8])

neuron(Intf(Queue[Tuple[Fixp[4, 16], Fixp[4, 16]]]),bias=3)

hdlgen('/neuron',outdir='./temp_mlp')