Open rswarbrick opened 5 months ago
Thanks yes I think we only designed it to work for JTAG clock frequency < System Clock frequency
. Not intentionally, but rather by coincidence: because we never saw JTAG being driven faster except in synthetic testbench setups.
Cool, that makes sense. To avoid the next confused user (after me!), would it make sense to add a note to the README.md
file?
Definitely
Updated the README.md but I'll leave this issue open for further discussion
I'm trying to debug a failure that's showing up in "rv_dm", a small wrapper around the
riscv-dbg
module in OpenTitan. The issue comes up when the JTAG clock is being driven at a higher frequency than the system clock.The JTAG-based DMI agent sends a request (DTM_WRITE). A short time later, it sends another JTAG message with request DTM_NOP. The response in that second JTAG transaction is DTM_SUCCESS, which the agent interprets as meaning that the write operation has completed. When we send another JTAG message, we get a response of DTM_BUSY and everything is very confused: what were we busy with?!
Here is a screenshot of the waves that we see:
The timing comes out as:
DTM_WRITE
requestdmi_req_valid
indmi_jtag
goes high to send DMI request to debug moduleCaptureDr
(andcapture_o
goes high)dr_d
in the DTM gets filled withDMINoError
DTM_SUCCESS
response (from theDMINoError
)I'm a bit surprised that there isn't a "busy" status that we put into
dr_d
when the DTM is still in theWaitWriteValid
FSM state. But maybe I'm missing some other method of synchronisation that the agent could be using.What's wrong here? :-)