from cocotb.triggers import Timer
from cocotb.binary import BinaryValue
+
class JTAGException(Exception):
pass
+
class JTAG_Clock(object):
"""
Class for the JTAG clock, run cycle by cycle
self.signal <= 0
yield self.t
+
class JTAG_Master(object):
"""
Class that will run JTAG commands, shift in and out data
"""
#TODO: Handle a JTAG chain with more than one device
- def __init__(self, tck, tms, tdi, tdo, trst_n=None, clk_period=1000):
+ def __init__(self, tck, tms, tdi, tdo, trst_n=None, clk_period=1000, ir_width=2):
self.tck = tck
self.clkgen = JTAG_Clock(tck, clk_period)
tck <= 0
self.period = Timer(clk_period)
# Standard commands
- # TODO: make IR length configurable; now 2 is assumed
- self.BYPASS = [1, 1]
- self.IDCODE = [0, 1]
- self.SAMPLEPRELOAD = [1, 0]
- self.EXTEST = [0, 0]
+ # TODO: Make values configurable
+ self.BYPASS = [1 for _ in range(ir_width)]
+ self.IDCODE = [1 if i == ir_width-1 else 0 for i in range(ir_width)]
+ self.SAMPLEPRELOAD = [1 if i == ir_width-2 else 0 for i in range(ir_width)]
+ self.EXTEST = [0 for _ in range(ir_width)]
# After command we always leave the controller in reset or runidle state
# If value is None we will always reset the interface
isreset = False
if self.state is None:
yield self.reset()
- if self.state is "Reset":
+ if self.state == "Reset":
isreset = True
self.tms <= 0
yield self.cycle_clock()
@cocotb.coroutine
def load_ir(self, cmd):
- cmd_copy = list(cmd)
- result = BinaryValue(bits=len(cmd_copy))
+ if isinstance(cmd, BinaryValue):
+ cmd_copy = [int(c) for c in cmd.binstr]
+ else:
+ cmd_copy = list(cmd)
+ result = BinaryValue(n_bits=len(cmd_copy))
l_result = list()
yield self.change_to_run()
result will contain the 32 bit IDCODE of the device
"""
- result = BinaryValue(bits=32)
+ result = BinaryValue(n_bits=32)
l_result = list()
# Keep tdi 0 for the whole run