Made nmigen code independent of VHDL code.
[c4m-jtag.git] / test / nmigen / cocotb / controller / test.py
1 import cocotb
2 from cocotb.utils import get_sim_steps
3 from cocotb.binary import BinaryValue
4
5 from c4m.cocotb.jtag.c4m_jtag import JTAG_Master
6
7
8 @cocotb.test()
9 def test01_idcode(dut):
10 """
11 Test the IDCODE command
12 """
13
14 # Run @ 1MHz
15 clk_period = get_sim_steps(1, "us")
16 master = JTAG_Master(dut.tap_bus__tck, dut.tap_bus__tms, dut.tap_bus__tdi, dut.tap_bus__tdo, clk_period=clk_period)
17
18 dut._log.info("Trying to get IDCODE...")
19
20 yield master.idcode()
21 result1 = master.result
22 dut._log.info("IDCODE1: {}".format(result1))
23
24 yield master.idcode()
25 result2 = master.result
26 dut._log.info("IDCODE2: {}".format(result2))
27
28 assert(result1 == result2)
29
30
31 @cocotb.test()
32 def test02_bypass(dut):
33 """
34 Test of BYPASS mode
35 """
36
37 # Run @ 1MHz
38 clk_period = get_sim_steps(1, "us")
39 master = JTAG_Master(dut.tap_bus__tck, dut.tap_bus__tms, dut.tap_bus__tdi, dut.tap_bus__tdo, clk_period=clk_period)
40
41 dut._log.info("Loading BYPASS command")
42 yield master.load_ir(master.BYPASS)
43
44 dut._log.info("Sending data")
45
46 data_in = BinaryValue()
47 data_in.binstr = "01001101"
48 yield master.shift_data(data_in)
49
50 dut._log.info("bypass out: {}".format(master.result.binstr))
51 assert(master.result.binstr[:-1] == data_in.binstr[1:])
52
53
54 @cocotb.test()
55 def test03_sample(dut):
56 """
57 Test of SAMPLEPRELOAD and EXTEST
58 """
59 data_in = BinaryValue()
60
61 # Run @ 1MHz
62 clk_period = get_sim_steps(1, "us")
63 master = JTAG_Master(dut.tap_bus__tck, dut.tap_bus__tms, dut.tap_bus__tdi, dut.tap_bus__tdo, clk_period=clk_period)
64
65
66 dut._log.info("Load SAMPLEPRELOAD command")
67 yield master.load_ir(master.SAMPLEPRELOAD)
68
69 data_in.binstr = "0100110"
70 dut._log.info(" preloading data {}".format(data_in.binstr))
71
72 # Set the ios pins
73 dut.tap_ioconn0__pad__i = 1
74 dut.tap_ioconn1__core__o = 0
75 dut.tap_ioconn2__core__o = 1
76 dut.tap_ioconn2__core__oe = 1
77 dut.tap_ioconn3__pad__i = 0
78 dut.tap_ioconn3__core__o = 0
79 dut.tap_ioconn3__core__oe = 1
80 yield master.shift_data(data_in)
81 dut._log.info(" output: {}".format(master.result.binstr))
82 assert(master.result.binstr == "1011001")
83
84 assert dut.tap_ioconn0__core__i == 1
85 assert dut.tap_ioconn1__pad__o == 0
86 assert dut.tap_ioconn2__pad__o == 1
87 assert dut.tap_ioconn2__pad__oe == 1
88 assert dut.tap_ioconn3__core__i == 0
89 assert dut.tap_ioconn3__pad__o == 0
90 assert dut.tap_ioconn3__pad__oe == 1
91
92 dut._log.info("Load EXTEST command")
93 yield master.load_ir(master.EXTEST)
94
95 assert dut.tap_ioconn0__core__i == 0
96 assert dut.tap_ioconn1__pad__o == 1
97 assert dut.tap_ioconn2__pad__o == 0
98 assert dut.tap_ioconn2__pad__oe == 0
99 assert dut.tap_ioconn3__core__i == 1
100 assert dut.tap_ioconn3__pad__o == 1
101 assert dut.tap_ioconn3__pad__oe == 0
102
103 data_in.binstr = "1011001"
104 dut._log.info(" input data {}".format(data_in.binstr))
105
106 # Set the ios pins
107 dut.tap_ioconn0__pad__i = 0
108 dut.tap_ioconn1__core__o = 1
109 dut.tap_ioconn2__core__o = 0
110 dut.tap_ioconn2__core__oe = 0
111 dut.tap_ioconn3__pad__i = 1
112 dut.tap_ioconn3__core__o = 1
113 dut.tap_ioconn3__core__oe = 0
114 yield master.shift_data(data_in)
115 dut._log.info(" output: {}".format(master.result.binstr))
116 assert(master.result.binstr == "0100110")
117
118 assert dut.tap_ioconn0__core__i == 1
119 assert dut.tap_ioconn1__pad__o == 0
120 assert dut.tap_ioconn2__pad__o == 1
121 assert dut.tap_ioconn2__pad__oe == 1
122 assert dut.tap_ioconn3__core__i == 0
123 assert dut.tap_ioconn3__pad__o == 0
124 assert dut.tap_ioconn3__pad__oe == 1
125
126 yield master.reset()
127
128 assert dut.tap_ioconn0__core__i == 0
129 assert dut.tap_ioconn1__pad__o == 1
130 assert dut.tap_ioconn2__pad__o == 0
131 assert dut.tap_ioconn2__pad__oe == 0
132 assert dut.tap_ioconn3__core__i == 1
133 assert dut.tap_ioconn3__pad__o == 1
134 assert dut.tap_ioconn3__pad__oe == 0
135
136