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
9 """ dut is design under test """
13 def pinmux_basic_test(dut
):
16 # mux selection lines, each input two bit wide
17 dut
.mux_lines_cell0_mux_in
= 1
18 dut
.mux_lines_cell1_mux_in
= 2
19 dut
.mux_lines_cell2_mux_in
= 0
21 # enable input for mux
22 dut
.EN_mux_lines_cell0_mux
= 1
23 dut
.EN_mux_lines_cell1_mux
= 1
24 dut
.EN_mux_lines_cell2_mux
= 1
29 # GPIO is inout peripheral
30 dut
.peripheral_side_gpioa_a2_out_in
= 0
31 dut
.peripheral_side_gpioa_a2_outen_in
= 1
35 if dut
.iocell_side_io2_cell_out
!= 0: # output of iopad
37 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 0" %
38 str(dut
.iocell_side_io2_cell_out
))
40 dut
.peripheral_side_gpioa_a2_out_in
= 1
44 if dut
.iocell_side_io2_cell_out
!= 1:
46 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 1" %
47 str(dut
.iocell_side_io2_cell_out
))
49 # GPIO2-in test (first see if it's tri-state)
50 if str(dut
.peripheral_side_gpioa_a2_in
) != "x":
52 "gpioa_a2=0/mux=0/out=1 %s gpio_a2_in != x" %
53 str(dut
.peripheral_side_gpioa_a2_in
))
55 dut
.peripheral_side_gpioa_a2_outen_in
= 0
56 dut
.iocell_side_io2_cell_in_in
= 0
59 if dut
.peripheral_side_gpioa_a2_in
!= 0:
61 "iocell_io2=0/mux=0/out=0 %s gpioa_a2 != 0" %
62 str(dut
.peripheral_side_gpioa_a2_in
))
64 dut
.iocell_side_io2_cell_in_in
= 1
67 if dut
.peripheral_side_gpioa_a2_in
!= 1:
69 "iocell_io2=1/mux=0/out=0 %s gpioa_a2 != 1" %
70 str(dut
.peripheral_side_gpioa_a2_in
))
72 dut
.peripheral_side_gpioa_a2_outen_in
= 1
73 dut
.iocell_side_io2_cell_in_in
= 0
75 dut
._log
.info("gpioa_a2_in %s" % dut
.peripheral_side_gpioa_a2_in
)
77 if dut
.iocell_side_io2_cell_out
!= 1:
79 "gpioa_a2=0/mux=0/out=1 %s iocell_io2 != 1" %
80 str(dut
.iocell_side_io2_cell_out
))
84 dut
.peripheral_side_uart_tx_in
= 1
85 dut
.peripheral_side_gpioa_a0_outen_in
= 1
89 if dut
.iocell_side_io0_cell_out
!= 1:
91 "uart_tx=1/mux=0/out=1 %s iocell_io0 != 1" %
92 str(dut
.iocell_side_io0_cell_out
))
94 dut
.peripheral_side_uart_tx_in
= 0
98 if dut
.iocell_side_io0_cell_out
!= 0:
100 "uart_tx=0/mux=0/out=1 %s iocell_io0 != 0" %
101 str(dut
.iocell_side_io0_cell_out
))
105 # define input variables
106 dut
.peripheral_side_twi_sda_out_in
= 0
107 dut
.peripheral_side_twi_sda_outen_in
= 1
111 dut
._log
.info("io1_out %s" % dut
.iocell_side_io1_cell_out
)
112 # Test for out for twi_sda
113 if dut
.iocell_side_io1_cell_out
!= 0:
115 "twi_sda=0/mux=0/out=1 %s iocell_io1 != 0" %
116 str(dut
.iocell_side_io1_cell_out
))
118 dut
.peripheral_side_twi_sda_out_in
= 1
121 if dut
.iocell_side_io1_cell_out
!= 1:
123 "twi_sda=1/mux=0/out=1 %s iocell_io1 != 1" %
124 str(dut
.iocell_side_io1_cell_out
))
127 # first check for tristate
128 if str(dut
.peripheral_side_twi_sda_in
) != "x":
130 "twi_sda=0/mux=0/out=1 %s twi_sda_in != x" %
131 str(dut
.peripheral_side_twi_sda_in
))
133 dut
.peripheral_side_twi_sda_outen_in
= 0
134 dut
.iocell_side_io1_cell_in_in
= 0
137 if dut
.peripheral_side_twi_sda_in
!= 0:
139 "iocell_io1=0/mux=0/out=0 %s twi_sda != 0" %
140 str(dut
.peripheral_side_twi_sda_in
))
142 dut
.iocell_side_io1_cell_in_in
= 1
145 if dut
.peripheral_side_twi_sda_in
!= 1:
147 "iocell_io1=0/mux=0/out=0 %s twi_sda != 0" %
148 str(dut
.peripheral_side_twi_sda_in
))
150 dut
.peripheral_side_twi_sda_outen_in
= 1
151 dut
.iocell_side_io1_cell_in_in
= 0
153 dut
._log
.info("twi_sda_in %s" % dut
.peripheral_side_twi_sda_in
)
155 if dut
.iocell_side_io1_cell_out
!= 1:
157 "twi_sda=0/mux=0/out=1 %s iocell_io1 != 1" %
158 str(dut
.iocell_side_io1_cell_out
))
162 # Test for out for twi_scl
163 dut
.peripheral_side_twi_scl_out_in
= 0
164 dut
.peripheral_side_twi_scl_outen_in
= 1
167 if dut
.iocell_side_io2_cell_out
!= 0:
169 "twi_scl=0/mux=0/out=1 %s iocell_io2 != 0" %
170 str(dut
.iocell_side_io2_cell_out
))
172 dut
.peripheral_side_twi_scl_out_in
= 1
175 if dut
.iocell_side_io2_cell_out
!= 1:
177 "twi_scl=0/mux=0/out=1 %s iocell_io2 != 0" %
178 str(dut
.iocell_side_io2_cell_out
))
181 # first check for tristate
182 if str(dut
.peripheral_side_twi_scl_in
) != "x":
184 "twi_scl=0/mux=0/out=1 %s twi_scl_in != x" %
185 str(dut
.peripheral_side_twi_scl_in
))
187 dut
.peripheral_side_twi_scl_outen_in
= 0
188 dut
.iocell_side_io2_cell_in_in
= 0
191 if dut
.peripheral_side_twi_scl_in
!= 0:
193 "iocell_io2=0/mux=0/out=0 %s twi_scl != 0" %
194 str(dut
.peripheral_side_twi_scl_in
))
196 dut
.iocell_side_io2_cell_in_in
= 1
199 if dut
.peripheral_side_twi_scl_in
!= 1:
201 "iocell_io2=1/mux=0/out=0 %s twi_scl != 1" %
202 str(dut
.peripheral_side_twi_scl_in
))
204 dut
.peripheral_side_twi_scl_outen_in
= 1
205 dut
.iocell_side_io2_cell_in_in
= 0
207 dut
._log
.info("twi_scl_in %s" % dut
.peripheral_side_twi_scl_in
)
209 if dut
.iocell_side_io2_cell_out
!= 1:
211 "twi_scl=0/mux=0/out=1 %s iocell_io2 != 1" %
212 str(dut
.iocell_side_io2_cell_out
))
219 def pinmux_randomised_test(dut
):
220 """Test for adding 2 random numbers multiple times"""
227 A
= random
.randint(0, 15)
228 B
= random
.randint(0, 15)
235 if int(dut
.X
) != pinmux_model(A
, B
):
237 "Randomised test failed with: %s + %s = %s" %
238 (int(dut
.A
), int(dut
.B
), int(dut
.X
)))
239 else: # these last two lines are not strictly necessary