def test_lut_unary(op): pe = PE() inst = getattr(asm, f"lut_{op.name}")() for _ in range(NTESTS): b0 = Bit(random.choice([0,1])) b1 = Bit(random.choice([0,1])) b2 = Bit(random.choice([0,1])) data0 = UIntVector.random(DATAWIDTH) _, res_p,_ = pe(inst, data0=data0,bit0=b0,bit1=b1,bit2=b2) assert res_p==op.func(b1)
def test_lut_ternary(op): pe = PE() inst = getattr(asm, f"lut_{op.name}")() for _ in range(NTESTS): sel = Bit(random.choice([0,1])) d0 = Bit(random.choice([0,1])) d1 = Bit(random.choice([0,1])) data0 = UIntVector.random(DATAWIDTH) _, res_p,_ = pe(inst, data0=data0,bit0=d0,bit1=d1,bit2=sel) assert res_p==op.func(sel,d0,d1)
def test_stall(args): data0, data1 = args inst = asm.add(ra_mode=Mode_t.BYPASS, rb_mode=Mode_t.DELAY) data1_delay_values = [UIntVector.random(DATAWIDTH)] rtl_tester(inst, data0, data1, res=data0, clk_en=0, data1_delay_values=data1_delay_values)
def test_reg_delay(args): data0, data1 = args inst = asm.add(ra_mode=Mode_t.DELAY, rb_mode=Mode_t.DELAY) data1_delay_values = [UIntVector.random(DATAWIDTH)] rtl_tester(inst, data0, data1, res=data0 + data1, delay=1, data1_delay_values=data1_delay_values)
def test_lut(): pe = PE() for _ in range(NTESTS): lut_val = BitVector.random(8) inst = asm.lut(lut_val) b0 = Bit(random.choice([0,1])) b1 = Bit(random.choice([0,1])) b2 = Bit(random.choice([0,1])) data0 = UIntVector.random(DATAWIDTH) _, res_p,_ = pe(inst, data0=data0,bit0=b0,bit1=b1,bit2=b2) assert res_p== lut_val[int(BitVector[3]([b0,b1,b2]))]
def test_operator_int_shift(op, reference, width): for _ in range(NTESTS): I0, I1 = SIntVector.random(width), UIntVector.random(width) expected = signed(reference(int(I0), int(I1)), width) assert expected == int(op(I0, I1))
def test_operator_comparison(op, reference, width): for _ in range(NTESTS): I0, I1 = UIntVector.random(width), UIntVector.random(width) expected = Bit(reference(int(I0), int(I1))) assert expected == bool(op(I0, I1))
def test_operator_uint1(op, reference, width): for _ in range(NTESTS): I = UIntVector.random(width) expected = unsigned(reference(int(I)), width) assert expected == int(op(I))
def test_reg_const(args): data0, const1 = args data1 = UIntVector.random(DATAWIDTH) inst = asm.add(rb_mode=Mode_t.CONST, rb_const=const1) rtl_tester(inst, data0, data1, res=data0 + const1)
NTESTS = 4 @pytest.mark.parametrize("op", [ op(asm.and_(), lambda x, y: x & y), op(asm.or_(), lambda x, y: x | y), op(asm.xor(), lambda x, y: x ^ y), op(asm.add(), lambda x, y: x + y), op(asm.sub(), lambda x, y: x - y), op(asm.lsl(), lambda x, y: x << y), op(asm.lsr(), lambda x, y: x >> y), op(asm.umin(), lambda x, y: (x < y).ite(x, y)), op(asm.umax(), lambda x, y: (x > y).ite(x, y)) ]) @pytest.mark.parametrize( "args", [(UIntVector.random(DATAWIDTH), UIntVector.random(DATAWIDTH)) for _ in range(NTESTS)]) def test_unsigned_binary(op, args): x, y = args res, _, _ = pe(op.inst, Data(x), Data(y)) assert res == op.func(x, y) rtl_tester(op, x, y, res=res) @pytest.mark.parametrize("op", [ op(asm.lsl(), lambda x, y: x << y), op(asm.asr(), lambda x, y: x >> y), op(asm.smin(), lambda x, y: (x < y).ite(x, y)), op(asm.smax(), lambda x, y: (x > y).ite(x, y)), ]) @pytest.mark.parametrize(