test_vpi_mmap.py 1.38 KB
Newer Older
1 2
import tvm
import numpy as np
3
from tvm.contrib import verilog
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

def test_mmap():
    n = 10
    # context for VPI RAM
    ctx = tvm.vpi(0)
    a_np = np.arange(n).astype('int8')
    a = tvm.nd.array(a_np, ctx)

    # head ptr of a
    a_ptr = int(a.handle[0].data)
    sess = verilog.session([
        verilog.find_file("test_vpi_mmap.v"),
        verilog.find_file("tvm_vpi_mmap.v")
    ])
    rst = sess.main.rst
    read_addr = sess.main.read_addr
    read_data = sess.main.read_data
    write_addr = sess.main.write_addr
    write_data = sess.main.write_data
    write_en = sess.main.write_en
    mmap_addr = sess.main.mmap_addr

    # setup memory map.
    rst.put_int(1)
28
    sess.yield_until_next_cycle()
29 30 31
    rst.put_int(0)
    write_en.put_int(0)
    mmap_addr.put_int(a_ptr)
32
    sess.yield_until_next_cycle()
33 34 35 36

    # read test
    for i in range(n):
        read_addr.put_int(i)
37
        sess.yield_until_next_cycle()
38
        # read addr get set this cycle
39
        sess.yield_until_next_cycle()
40 41 42 43 44 45 46 47
        # get the data out
        assert(read_data.get_int() == i)

    # write test
    for i in reversed(range(n)):
        write_addr.put_int(i)
        write_en.put_int(1)
        write_data.put_int(i + 1)
48
        sess.yield_until_next_cycle()
49
        write_en.put_int(0)
50
        sess.yield_until_next_cycle()
51 52 53 54 55 56

    np.testing.assert_equal(a.asnumpy(), a_np + 1)


if __name__ == "__main__":
    test_mmap()