@@ -110,7 +110,7 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
110110 input [4 :0 ] command, // Command to be performed
111111 input go, // Trigger
112112 output done, // Response
113- output reg perr, // Indicator of a error in the transfer
113+ output reg perr // Indicator of a error in the transfer
114114 // ================================================================================================
115115 );
116116
@@ -174,10 +174,10 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
174174 reg [31 :0 ] divreg; // Division register
175175 reg [22 :0 ] usecsdown; // usec downcounter
176176 reg cdc_go; // Clock domain crossed go
177- reg [2 :0 ] rst_filter; // Bounce removed reset signal
177+ reg [2 :0 ] rst_filter; // Bounce removed reset signal
178178 reg JTAG_trans_os; // If there is a JTAG transaction pending
179- reg fallingedge; // This is a falling edge
180- reg risingedge; // This is a rising edge
179+ reg fallingedge; // This is a falling edge
180+ reg risingedge; // This is a rising edge
181181
182182 reg [(CDIV_LOG2- 1 ):0 ] clkDiv; // Divisor per clock change to target
183183
@@ -190,7 +190,11 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
190190 reg [2 :0 ] ndevs; // Number of devices in JTAG chain
191191 reg [3 :0 ] current_dev; // The currently selected device
192192 reg [29 :0 ] irlenx; // Length of each IR-1, 5x5 bits
193- reg [3 :0 ] ir; // Last written ir contents
193+ reg [3 :0 ] ir; // Last written ir contents
194+
195+ // nRST state tracking
196+ reg reset_triggered;
197+ reg local_tgt_reset;
194198
195199 // DBG (adiv protocol level) related
196200 reg [22 :0 ] rst_timeout; // Default time for a reset
@@ -269,7 +273,7 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
269273 :(active_mode== MODE_JTAG)?jtag_tck
270274 :root_tgtclk;
271275
272- assign tgt_reset_pin = ~ ((active_mode == MODE_SWJ)?pinw_nreset:(dbg_state != ST_DBG_RESETTING)) ;
276+ assign tgt_reset_pin = local_tgt_reset ;
273277 // nReset/nSRST -- nTRST -- TDO TDI SWDIO SWCLK
274278 assign pinsout = { (rst_filter== 3'b111 ), 1'b1 , 1'b1 , swwr, tdo_swo, tdi, swdi, tck_swclk };
275279
@@ -345,6 +349,38 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
345349
346350 assign pinw_swclk = pinsin[8 + 0 ] ?pinsin[0 ]:1'b1 ;
347351
352+ always @(posedge clk, posedge rst)
353+ begin
354+ // If we're being reset, undrive the nRST pin and reset the state tracking for it
355+ if (rst)
356+ begin
357+ local_tgt_reset <= 1'b1 ;
358+ reset_triggered <= 1'b0 ;
359+ end
360+ else
361+ begin
362+ // Default to honouring the current direct write state for the pin
363+ local_tgt_reset <= ~ pinw_nreset;
364+ // If we're in a mode other than SWJ
365+ if (active_mode != MODE_SWJ)
366+ begin
367+ // And a reset is requested
368+ if (dbg_state == ST_DBG_RESETTING)
369+ begin
370+ // Actually do the reset
371+ local_tgt_reset <= 1'b0 ;
372+ reset_triggered <= 1'b1 ;
373+ end
374+ // Otherwise, if a reset was and has now been releaseed, reset the state
375+ else if (reset_triggered == 1'b1 )
376+ begin
377+ local_tgt_reset <= 1'b1 ;
378+ reset_triggered <= 1'b0 ;
379+ end
380+ end
381+ end
382+ end
383+
348384 // //////////////////////////////////////////////////////////////////////////////////////////////////////
349385 always @(posedge clk, posedge rst)
350386
@@ -359,6 +395,8 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
359395 idleCycles <= MIN_IDLE_CYCLES;
360396 turnaround <= 0 ;
361397 current_dev <= 4'b1000 ;
398+ active_mode <= MODE_LOCAL;
399+ pinw_nreset <= 1 ;
362400 end
363401 else
364402 begin
@@ -367,7 +405,8 @@ module dbgIF #(parameter CLK_FREQ=100000000, parameter DEFAULT_SWCLK=1000000, pa
367405 rst_filter <= {rst_filter[1 ],rst_filter[0 ],tgt_reset_state};
368406
369407 // Deal with any immediate writes
370- pinw_nreset <= pinsin[8 + 7 ]?pinsin[7 ]:1 ;
408+ if (pinsin[8 + 7 ])
409+ pinw_nreset <= pinsin[7 ];
371410 pinw_tdi <= pinsin[8 + 2 ]?pinsin[2 ]:1 ;
372411 pinw_swwr <= pinsin[8 + 4 ]?pinsin[4 ]:0 ;
373412 pinw_swdo <= pinsin[8 + 1 ]?pinsin[1 ]:0 ;
0 commit comments