1 # Simple tests for an pinmux module
3 from cocotb
.triggers
import Timer
4 from cocotb
.result
import TestFailure
5 #from pinmux_model import pinmux_model
10 def pinmux_basic_test(dut
):
14 dut
.mux_lines_cell0_mux_in
= 1
15 dut
.mux_lines_cell1_mux_in
= 2
16 dut
.mux_lines_cell2_mux_in
= 0
18 dut
.EN_mux_lines_cell0_mux
= 1
19 dut
.EN_mux_lines_cell1_mux
= 1
20 dut
.EN_mux_lines_cell2_mux
= 1
25 dut
.peripheral_side_gpioa_a2_out_in
= 0
26 dut
.peripheral_side_gpioa_a2_outen_in
= 1
30 if dut
.iocell_side_io2_cell_out
!= 0:
32 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 0" %
33 str(dut
.iocell_side_io2_cell_out
))
35 dut
.peripheral_side_gpioa_a2_out_in
= 1
39 if dut
.iocell_side_io2_cell_out
!= 1:
41 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 1" %
42 str(dut
.iocell_side_io2_cell_out
))
44 # GPIO2-in test (first see if it's tri-state)
45 if str(dut
.peripheral_side_gpioa_a2_in
) != "x":
47 "gpioa_a2=0/mux=0/out=1 %s gpio_a2_in != x" %
48 str(dut
.peripheral_side_gpioa_a2_in
))
50 dut
.peripheral_side_gpioa_a2_outen_in
= 0
51 dut
.iocell_side_io2_cell_in_in
= 0
54 if dut
.peripheral_side_gpioa_a2_in
!= 0:
56 "iocell_io2=0/mux=0/out=0 %s gpioa_a2 != 0" %
57 str(dut
.peripheral_side_gpioa_a2_in
))
59 dut
.iocell_side_io2_cell_in_in
= 1
62 if dut
.peripheral_side_gpioa_a2_in
!= 1:
64 "iocell_io2=1/mux=0/out=0 %s gpioa_a2 != 1" %
65 str(dut
.peripheral_side_gpioa_a2_in
))
67 dut
.peripheral_side_gpioa_a2_outen_in
= 1
68 dut
.iocell_side_io2_cell_in_in
= 0
70 dut
._log
.info("gpioa_a2_in %s" % dut
.peripheral_side_gpioa_a2_in
)
72 if dut
.iocell_side_io2_cell_out
!= 1:
74 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 1" %
75 str(dut
.iocell_side_io2_cell_out
))
79 dut
.peripheral_side_uart_tx_in
= 1
80 dut
.peripheral_side_gpioa_a0_outen_in
= 1
84 if dut
.iocell_side_io0_cell_out
!= 1:
86 "uart_tx=1/mux=0/out=1 %s iocell_io0 != 1" %
87 str(dut
.iocell_side_io0_cell_out
))
89 dut
.peripheral_side_uart_tx_in
= 0
93 if dut
.iocell_side_io0_cell_out
!= 0:
95 "uart_tx=0/mux=0/out=1 %s iocell_io0 != 0" %
96 str(dut
.iocell_side_io0_cell_out
))
103 # define input variables
104 dut
.peripheral_side_twi_sda_out_in
= 0
105 dut
.peripheral_side_twi_sda_outen_in
= 1
106 dut
.peripheral_side_twi_scl_out_in
= 0
107 dut
.peripheral_side_twi_scl_outen_in
= 1
111 if dut
.iocell_side_io1_cell_out
!= 0:
113 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 0" %
114 str(dut
.iocell_side_io1_cell_out
))
116 dut
.peripheral_side_twi_sda_out_in
= 1
118 if dut
.iocell_side_io1_cell_out
!= 1:
120 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 0" %
121 str(dut
.iocell_side_io1_cell_out
))
124 # first check for tristate
125 if str(dut
.peripheral_side_twi_sda_in
) != "x":
127 "gpioa_a2=0/mux=0/out=1 %s gpio_a2_in != x" %
128 str(dut
.peripheral_side_twi_sda_in
))
130 dut
.peripheral_side_twi_sda_outen_in
= 0
131 dut
.iocell_side_io1_cell_in_in
= 0
134 if dut
.peripheral_side_twi_sda_in
!= 0:
136 "iocell_io2=0/mux=0/out=0 %s gpioa_a2 != 0" %
137 str(dut
.peripheral_side_twi_sda_in
))
139 dut
.iocell_side_io1_cell_in_in
= 1
142 if dut
.peripheral_side_twi_sda_in
!= 1:
144 "iocell_io2=1/mux=0/out=0 %s gpioa_a2 != 1" %
145 str(dut
.peripheral_side_twi_sda_in
))
147 dut
.peripheral_side_twi_sda_outen_in
= 1
148 dut
.iocell_side_io1_cell_in_in
= 0
150 dut
._log
.info("gpioa_a2_in %s" % dut
.peripheral_side_twi_sda_in
)
152 if dut
.iocell_side_io1_cell_out
!= 1:
154 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 1" %
155 str(dut
.iocell_side_io1_cell_out
))
160 if dut
.iocell_side_io2_cell_out
!= 0:
162 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 0" %
163 str(dut
.iocell_side_io2_cell_out
))
165 dut
.peripheral_side_twi_scl_out_in
= 1
167 if dut
.iocell_side_io2_cell_out
!= 1:
169 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 0" %
170 str(dut
.iocell_side_io2_cell_out
))
173 # first check for tristate
174 if str(dut
.peripheral_side_twi_scl_in
) != "x":
176 "gpioa_a2=0/mux=0/out=1 %s gpio_a2_in != x" %
177 str(dut
.peripheral_side_twi_scl_in
))
179 dut
.peripheral_side_twi_scl_outen_in
= 0
180 dut
.iocell_side_io2_cell_in_in
= 0
183 if dut
.peripheral_side_twi_scl_in
!= 0:
185 "iocell_io2=0/mux=0/out=0 %s gpioa_a2 != 0" %
186 str(dut
.peripheral_side_twi_scl_in
))
188 dut
.iocell_side_io2_cell_in_in
= 1
191 if dut
.peripheral_side_twi_scl_in
!= 1:
193 "iocell_io2=1/mux=0/out=0 %s gpioa_a2 != 1" %
194 str(dut
.peripheral_side_twi_scl_in
))
196 dut
.peripheral_side_twi_scl_outen_in
= 1
197 dut
.iocell_side_io2_cell_in_in
= 0
199 dut
._log
.info("gpioa_a2_in %s" % dut
.peripheral_side_twi_scl_in
)
201 if dut
.iocell_side_io2_cell_out
!= 1:
203 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 1" %
204 str(dut
.iocell_side_io2_cell_out
))
211 def pinmux_randomised_test(dut
):
212 """Test for adding 2 random numbers multiple times"""
219 A
= random
.randint(0, 15)
220 B
= random
.randint(0, 15)
227 if int(dut
.X
) != pinmux_model(A
, B
):
229 "Randomised test failed with: %s + %s = %s" %
230 (int(dut
.A
), int(dut
.B
), int(dut
.X
)))
231 else: # these last two lines are not strictly necessary