+# Method to test a particular peripheral port
+# when rand_order is True, previous and consecutive ports are
+# random (but NOT equal to given port)
+def test_single_port(dut, port, rand_order=True, delay=1e-6):
+ if rand_order:
+ print("Randomising the prev and next ports")
+ prev_port=port
+ while(prev_port == port):
+ prev_port = randint(0, dut.n_ports-1)
+ next_port=port
+ while(next_port == port):
+ next_port = randint(0, dut.n_ports-1)
+ else:
+ # Set the prev and next ports as consecutive ports
+ if port == 0:
+ prev_port = dut.n_ports - 1
+ else:
+ prev_port = port - 1
+
+ if port == dut.n_ports:
+ next_port = 0
+ else:
+ next_port = port + 1
+
+ print("Prev=%d, Given=%d, Next=%d" % (prev_port, port, next_port))
+
+ # Clear o/oe, delay, set port i
+ # Set to previous port, delay
+ # Assert port i == 0
+ # Set to desired port
+ # Assert port i == 1
+ # Set o/oe, delay
+ # Assert o, oe == 1
+ # Set to next port, delay
+ # Assert port i == 0
+ yield dut.periph_ports[port].o.eq(0)
+ yield Delay(delay)
+ yield dut.periph_ports[port].oe.eq(0)
+ yield Delay(delay)
+ yield dut.out_port.i.eq(1)
+ yield Delay(delay)
+
+ yield dut.port.eq(prev_port)
+ yield Delay(delay)
+
+ test_i = yield dut.periph_ports[port].i
+ assert(test_i == 0)
+
+ yield dut.port.eq(port)
+ yield Delay(delay)
+
+ test_o = yield dut.out_port.o
+ test_oe = yield dut.out_port.oe
+ test_i = yield dut.periph_ports[port].i
+ assert(test_o == 0)
+ assert(test_oe == 0)
+ assert(test_i == 1)
+
+ yield dut.periph_ports[port].o.eq(1)
+ yield Delay(delay)
+ yield dut.periph_ports[port].oe.eq(1)
+ yield Delay(delay)
+
+ test_o = yield dut.out_port.o
+ test_oe = yield dut.out_port.oe
+ assert(test_o == 1)
+ assert(test_oe == 1)
+
+ yield dut.port.eq(next_port)
+ yield Delay(delay)
+
+ test_i = yield dut.periph_ports[port].i
+ assert(test_i == 0)
+
+def test_iomux(dut, rand_order=True):
+ print("------START----------------------")
+ #print(dir(dut.periph_ports[0]))
+ #print(dut.periph_ports[0].fields)
+
+ # Produce a test list of port values
+ test_port_vec = list(range(0, dut.n_ports))
+ #print(test_port_vec)
+ # Randomise for wider testing
+ if rand_order:
+ shuffle(test_port_vec)
+ #print(test_port_vec)
+ for i in range(dut.n_ports):
+ yield from test_single_port(dut, test_port_vec[i], rand_order)
+
+ print("Finished the 1-bit IO mux block test!")
+
+def gen_gtkw_doc(module_name, n_ports, filename):