class Multiplier(Component):
    a: In(Q(8, 8))
    b: In(Q(8, 8))

    x: Out(Q(16, 16))
    y: Out(Q(8, 8))
    z: Out(Q(8, 4))
    w: Out(Q(8, 0))

    def elaborate(self, platform):
        m = Module()

        m.d.comb += self.x.eq(self.a * self.b)
        m.d.comb += self.y.eq(self.a * self.b)
        m.d.comb += self.z.eq(self.a * self.b)
        m.d.comb += self.w.eq(self.a * self.b)

        return m

dut = Multiplier()
def bench():
    yield dut.a.eq(1.5)
    yield dut.b.eq(3.3)
    yield Settle()

    for sig in [dut.x, dut.y, dut.z, dut.w]:
        print((yield sig.as_value()) / 2**sig.f_width)

'''
$ ./test_am_fp.py 
4.951171875
4.953125
4.9375
5.0
'''