+# Method to test a particular bank port
+# when rand_order is True, previous and consecutive banks are
+# random (but NOT equal to given bank)
+def test_single_bank(dut, bank, rand_order=True, delay=1e-6):
+ if rand_order:
+ print("Randomising the prev and next banks")
+ prev_bank=bank
+ while(prev_bank == bank):
+ prev_bank = randint(0, dut.n_banks-1)
+ next_bank=bank
+ while(next_bank == bank):
+ next_bank = randint(0, dut.n_banks-1)
+ else:
+ # Set the prev and next banks as consecutive banks
+ if bank == 0:
+ prev_bank = dut.n_banks - 1
+ else:
+ prev_bank = bank - 1
+
+ if bank == dut.n_banks:
+ next_bank = 0
+ else:
+ next_bank = bank + 1
+
+ print("Prev=%d, Given=%d, Next=%d" % (prev_bank, bank, next_bank))
+
+ # Clear o/oe, delay, set port i
+ # Set to previous bank, delay
+ # Assert bank i == 0
+ # Set to desired bank
+ # Assert bank i == 1
+ # Set o/oe, delay
+ # Assert o, oe == 1
+ # Set to next bank, delay
+ # Assert bank i == 0
+ yield dut.bank_ports[bank].o.eq(0)
+ yield Delay(delay)
+ yield dut.bank_ports[bank].oe.eq(0)
+ yield Delay(delay)
+ yield dut.out_port.i.eq(1)
+ yield Delay(delay)
+
+ yield dut.bank.eq(prev_bank)
+ yield Delay(delay)
+
+ test_i = yield dut.bank_ports[bank].i
+ assert(test_i == 0)
+
+ yield dut.bank.eq(bank)
+ yield Delay(delay)
+
+ test_o = yield dut.out_port.o
+ test_oe = yield dut.out_port.oe
+ test_i = yield dut.bank_ports[bank].i
+ assert(test_o == 0)
+ assert(test_oe == 0)
+ assert(test_i == 1)
+
+ yield dut.bank_ports[bank].o.eq(1)
+ yield Delay(delay)
+ yield dut.bank_ports[bank].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.bank.eq(next_bank)
+ yield Delay(delay)
+
+ test_i = yield dut.bank_ports[bank].i
+ assert(test_i == 0)
+
+def test_iomux(dut, rand_order=True):
+ print("------START----------------------")
+ #print(dir(dut.bank_ports[0]))
+ #print(dut.bank_ports[0].fields)
+
+ # Produce a test list of bank values
+ test_bank_vec = list(range(0, dut.n_banks))
+ #print(test_bank_vec)
+ # Randomise for wider testing
+ if rand_order:
+ shuffle(test_bank_vec)
+ #print(test_bank_vec)
+ for i in range(dut.n_banks):
+ yield from test_single_bank(dut, test_bank_vec[i], rand_order)
+
+ print("Finished the 1-bit IO mux block test!")
+