462fc4928e9b21f0c3cee552be9d76a5f054df3a
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
10 from soc
.config
.pinouts
import get_pinspecs
11 from soc
.debug
.jtag
import Pins
17 def get_jtag_boundary():
18 """gets the list of information for jtag boundary scan
20 # currently only a subset of pins is enabled. nuisance
23 'eint', 'gpio', 'mspi0',
24 # 'mspi1', - disabled for now
25 # 'pwm', 'sd0', - disabled for now
27 pins
= Pins(get_pinspecs(subset
=subset
))
31 def setup_sim(dut
, *, clk_period
, run
):
32 """Initialize CPU and setup clock"""
34 clk_steps
= get_sim_steps(clk_period
, "ns")
35 cocotb
.fork(Clock(dut
.sys_clk
, clk_steps
).start())
40 yield Timer(int(10.5*clk_steps
))
42 yield Timer(int(5*clk_steps
))
44 def setup_jtag(dut
, *, tck_period
):
45 # Make this a generator
48 return JTAG_Master(dut
.jtag_tck
, dut
.jtag_tms
,
49 dut
.jtag_tdi
, dut
.jtag_tdo
,
50 clk_period
=tck_period
,
53 def execute_svf(dut
, *, jtag
, svf_filename
):
56 jtag_svf
= SVF_Executor(jtag
)
57 with
open(svf_filename
, "r") as f
:
59 yield jtag_svf
.run(svf_deck
, p
=dut
._log
.info
)
62 # IDCODE using JTAG_master
65 def idcode(dut
, *, jtag
):
68 dut
._log
.info("IDCODE1: {}".format(result1
))
69 assert(result1
== BinaryValue("00000000000000000001100011111111"))
73 dut
._log
.info("IDCODE2: {}".format(result2
))
75 assert(result1
== result2
)
78 def idcode_reset(dut
):
79 dut
._log
.info("Running IDCODE test; cpu in reset...")
81 clk_period
= 100 # 10MHz
82 tck_period
= 300 # 3MHz
84 yield from setup_sim(dut
, clk_period
=clk_period
, run
=False)
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")
93 dut
._log
.info("Running IDCODE test; cpu running...")
95 clk_period
= 100 # 10MHz
96 tck_period
= 300 # 3MHz
98 yield from setup_sim(dut
, clk_period
=clk_period
, run
=True)
99 jtag
= yield from setup_jtag(dut
, tck_period
= tck_period
)
101 yield from idcode(dut
, jtag
=jtag
)
103 dut
._log
.info("IDCODE test completed")
106 # Read IDCODE from SVF file
110 def idcodesvf_reset(dut
):
111 dut
._log
.info("Running IDCODE through SVF test; cpu in reset...")
113 clk_period
= 100 # 10MHz
114 tck_period
= 300 # 3MHz
116 yield from setup_sim(dut
, clk_period
=clk_period
, run
=False)
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")
124 def idcodesvf_run(dut
):
125 dut
._log
.info("Running IDCODE through SVF test; cpu running...")
127 clk_period
= 100 # 10MHz
128 tck_period
= 300 # 3MHz
130 yield from setup_sim(dut
, clk_period
=clk_period
, run
=True)
131 jtag
= yield from setup_jtag(dut
, tck_period
= tck_period
)
133 yield from execute_svf(dut
, jtag
=jtag
, svf_filename
="idcode.svf")
135 dut
._log
.info("IDCODE test completed")
138 # demo / debug how to get boundary scan names. run "python3 test.py"
139 if __name__
== '__main__':
140 pinouts
= get_jtag_boundary()
142 # example: ('eint', '2', <IOType.In: 1>, 'eint_2', 125)