2 from cocotb
.clock
import Clock
3 from cocotb
.triggers
import Timer
4 from cocotb
.utils
import get_sim_steps
5 from cocotb
.binary
import BinaryValue
7 from c4m
.cocotb
.jtag
.c4m_jtag
import JTAG_Master
8 from c4m
.cocotb
.jtag
.c4m_jtag_svfcocotb
import SVF_Executor
14 def setup_sim(dut
, *, clk_period
, run
):
15 """Initialize CPU and setup clock"""
17 clk_steps
= get_sim_steps(clk_period
, "ns")
18 cocotb
.fork(Clock(dut
.sys_clk
, clk_steps
).start())
27 yield Timer(int(10.5*clk_steps
))
29 yield Timer(int(5*clk_steps
))
31 def setup_jtag(dut
, *, tck_period
):
32 # Make this a generator
35 return JTAG_Master(dut
.jtag_tck
, dut
.jtag_tms
,
36 dut
.jtag_tdi
, dut
.jtag_tdo
,
37 clk_period
=tck_period
,
40 def execute_svf(dut
, *, jtag
, svf_filename
):
41 jtag_svf
= SVF_Executor(jtag
)
42 with
open(svf_filename
, "r") as f
:
44 yield jtag_svf
.run(svf_deck
, p
=dut
._log
.info
)
47 # IDCODE using JTAG_master
50 def idcode(dut
, *, jtag
):
51 #jtag.IDCODE = [0, 0, 0, 1]
54 dut
._log
.info("IDCODE1: {}".format(result1
))
55 assert(result1
== BinaryValue("00000000000000000001100011111111"))
59 dut
._log
.info("IDCODE2: {}".format(result2
))
61 assert(result1
== result2
)
64 def idcode_reset(dut
):
65 dut
._log
.info("Running IDCODE test; cpu in reset...")
67 clk_period
= 100 # 10MHz
68 tck_period
= 300 # 3MHz
70 yield from setup_sim(dut
, clk_period
=clk_period
, run
=False)
71 jtag
= yield from setup_jtag(dut
, tck_period
= tck_period
)
73 yield from idcode(dut
, jtag
=jtag
)
75 dut
._log
.info("IDCODE test completed")
79 dut
._log
.info("Running IDCODE test; cpu running...")
81 clk_period
= 100 # 10MHz
82 tck_period
= 300 # 3MHz
84 yield from setup_sim(dut
, clk_period
=clk_period
, run
=True)
85 jtag
= yield from setup_jtag(dut
, tck_period
= tck_period
)
87 yield from idcode(dut
, jtag
=jtag
)
89 dut
._log
.info("IDCODE test completed")
92 # Read IDCODE from SVF file
96 def idcodesvf_reset(dut
):
97 dut
._log
.info("Running IDCODE through SVF test; cpu in reset...")
99 clk_period
= 100 # 10MHz
100 tck_period
= 300 # 3MHz
102 yield from setup_sim(dut
, clk_period
=clk_period
, run
=False)
103 jtag
= yield from setup_jtag(dut
, tck_period
= tck_period
)
105 yield from execute_svf(dut
, jtag
=jtag
, svf_filename
="idcode.svf")
107 dut
._log
.info("IDCODE test completed")
111 dut
._log
.info("Running IDCODE through test; cpu running...")
113 clk_period
= 100 # 10MHz
114 tck_period
= 300 # 3MHz
116 yield from setup_sim(dut
, clk_period
=clk_period
, run
=True)
117 jtag
= yield from setup_jtag(dut
, tck_period
= tck_period
)
119 yield from execute_svf(dut
, jtag
=jtag
, svf_filename
="idcode.svf")
121 dut
._log
.info("IDCODE test completed")
123 from itertools
import chain
126 from cocotb
.clock
import Clock
127 from cocotb
.triggers
import Timer
128 from cocotb
.utils
import get_sim_steps
129 from cocotb
.binary
import BinaryValue
131 from c4m
.nmigen
.jtag
.tap
import IOType
132 from c4m
.cocotb
.jtag
.c4m_jtag
import JTAG_Master
133 from c4m
.cocotb
.jtag
.c4m_jtag_svfcocotb
import SVF_Executor
135 from soc
.config
.pinouts
import get_pinspecs
136 from soc
.debug
.jtag
import Pins
140 def wishbone_basic(dut
):
142 Test of an added Wishbone interface
144 clk_period
= 100 # 100MHz
145 tck_period
= 3000 # 0.3MHz
147 data_in
= BinaryValue()
148 # these have to match with soc.debug.jtag.JTAG ircodes
149 cmd_MEMADDRESS
= BinaryValue("0101") # 5
150 cmd_MEMREAD
= BinaryValue("0110") # 6
151 cmd_MEMREADWRITE
= BinaryValue("0111") # 7
153 info
= "Running Wishbone basic test"
154 yield from setup_sim(dut
, clk_period
=clk_period
, run
=True)
155 master
= yield from setup_jtag(dut
, tck_period
= tck_period
)
157 # Load the memory address
158 yield master
.load_ir(cmd_MEMADDRESS
)
159 dut
._log
.info("Loading address")
161 data_in
.binstr
= "000000000000000000000000000001"
162 dut
._log
.info(" input: {}".format(data_in
.binstr
))
163 yield master
.shift_data(data_in
)
164 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
167 yield master
.load_ir(cmd_MEMREADWRITE
)
168 dut
._log
.info("Writing memory")
170 data_in
.binstr
= "01010101" * 8
171 dut
._log
.info(" input: {}".format(data_in
.binstr
))
172 yield master
.shift_data(data_in
)
173 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
175 data_in
.binstr
= "10101010" * 8
176 dut
._log
.info(" input: {}".format(data_in
.binstr
))
177 yield master
.shift_data(data_in
)
178 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
180 # Load the memory address
181 yield master
.load_ir(cmd_MEMADDRESS
)
182 dut
._log
.info("Loading address")
184 data_in
.binstr
= "000000000000000000000000000001"
185 dut
._log
.info(" input: {}".format(data_in
.binstr
))
186 yield master
.shift_data(data_in
)
187 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
188 assert master
.result
.binstr
== "000000000000000000000000000000"
191 yield master
.load_ir(cmd_MEMREADWRITE
)
192 dut
._log
.info("Reading and writing memory")
194 data_in
.binstr
= "10101010" * 4
195 dut
._log
.info(" input: {}".format(data_in
.binstr
))
196 yield master
.shift_data(data_in
)
197 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
198 assert master
.result
.binstr
== "01010101" * 4
200 data_in
.binstr
= "01010101" * 4
201 dut
._log
.info(" input: {}".format(data_in
.binstr
))
202 yield master
.shift_data(data_in
)
203 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
204 assert master
.result
.binstr
== "10101010" * 4
206 # Load the memory address
207 yield master
.load_ir(cmd_MEMADDRESS
)
208 dut
._log
.info("Loading address")
210 data_in
.binstr
= "000000000000000000000000000001"
211 dut
._log
.info(" input: {}".format(data_in
.binstr
))
212 yield master
.shift_data(data_in
)
213 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
214 #assert master.result.binstr == "000000000000000000000000000010"
217 yield master
.load_ir(cmd_MEMREAD
)
218 dut
._log
.info("Reading memory")
219 data_in
.binstr
= "00000000" * 4
221 dut
._log
.info(" input: {}".format(data_in
.binstr
))
222 yield master
.shift_data(data_in
)
223 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
224 #assert master.result.binstr == "10101010" * 4
226 dut
._log
.info(" input: {}".format(data_in
.binstr
))
227 yield master
.shift_data(data_in
)
228 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
229 #assert master.result.binstr == "01010101" * 4
231 # Load the memory address
232 yield master
.load_ir(cmd_MEMADDRESS
) # MEMADDR
233 dut
._log
.info("Loading address")
235 data_in
.binstr
= "0000000000000000000000000000001"
236 dut
._log
.info(" input: {}".format(data_in
.binstr
))
237 yield master
.shift_data(data_in
)
238 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
239 #assert master.result.binstr == "000000000000000000000000000010"
242 yield master
.load_ir(cmd_MEMREAD
) # MEMREAD
243 dut
._log
.info("Reading memory")
244 data_in
.binstr
= "00000000" * 4
246 dut
._log
.info(" input: {}".format(data_in
.binstr
))
247 yield master
.shift_data(data_in
)
248 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
249 #assert master.result.binstr == "10101010" * 4
251 dut
._log
.info(" input: {}".format(data_in
.binstr
))
252 yield master
.shift_data(data_in
)
253 dut
._log
.info(" output: {}".format(master
.result
.binstr
))
254 #assert master.result.binstr == "01010101" * 4
256 dut
._log
.info("{!r}".format(wbmem
))
259 # demo / debug how to get boundary scan names. run "python3 test.py"
260 if __name__
== '__main__':
261 pinouts
= get_jtag_boundary()
263 # example: ('eint', '2', <IOType.In: 1>, 'eint_2', 125)