Skip to content

Commit b3b1199

Browse files
mubesdragonmux
authored andcommitted
dbgIF: Make reset pin state more persistent.
Co-Authored-By: Rachel Mant <git@dragonmux.network>
1 parent 1fb7c10 commit b3b1199

2 files changed

Lines changed: 50 additions & 42 deletions

File tree

verilog/dbgIF.v

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

verilog/testbeds/dbgIF_tb.v

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,10 @@ module dbgIF_tb;
2929
wire [7:0] pinsout_tb;
3030

3131
wire swwr_tb;
32-
wire nvsen_pin_tb;
33-
wire nvdrive_pin_tb;
34-
35-
3632

3733
// Controls
3834
reg [3:0] turnaround_tb;
3935
reg [10:0] clkDiv_tb;
40-
wire vsen_tb;
41-
wire vdrive_tb;
4236

4337
// Messages
4438
reg [1:0] addr32_tb;
@@ -61,14 +55,10 @@ module dbgIF_tb;
6155
assign swdi_tb = rx[0];
6256

6357

64-
dbgIF #(.TICKS_PER_USEC(500)) DUT (
58+
dbgIF DUT (
6559
.rst(rst_tb), // Reset synchronised to clock
6660
.clk(clk_tb),
6761

68-
// Gross control - power etc.
69-
.vsen(vsen_tb),
70-
.vdrive(vdrive_tb),
71-
7262
// Downwards interface to the DBG pins
7363
.swdi(tms_swdio_tb), // DIO pin from target
7464
.tms_swdo(tms_swdo_tb), // DIO pin to target
@@ -77,10 +67,7 @@ module dbgIF_tb;
7767
.tdi(tdi_tb), // TDI to target
7868
.tdo_swo(tdo_swo_tb), // TDO from target
7969
.tgt_reset_state(tgt_reset_state_tb), // Reset to target
80-
8170
.tgt_reset_pin(tgt_reset_tb),
82-
.nvsen_pin(nvsen_pin_tb),
83-
.nvdrive_pin(nvdrive_pin_tb),
8471

8572
// Upwards interface to command controller
8673
.addr32(addr32_tb), // Address bits 3:2 for message
@@ -108,7 +95,7 @@ module dbgIF_tb;
10895
while (done_tb==0) #1;
10996

11097
`define report\
111-
$display("Complete, err=%d",perr_tb);\
98+
$display("Complete, err=%d", perr_tb);\
11299
if (perr_tb) $finish;
113100

114101
always
@@ -129,6 +116,8 @@ module dbgIF_tb;
129116
realtime t;
130117

131118
initial begin
119+
$dumpfile("dbgIF.vcd");
120+
$dumpvars;
132121
$timeformat( -6, 1," uS", 5);
133122

134123

@@ -150,10 +139,8 @@ module dbgIF_tb;
150139
command_tb=DUT.CMD_SET_CLK;
151140
dwrite_tb<=32'd1000000;
152141

153-
154142
`go;
155143
`report;
156-
$finish;
157144

158145
// =========================================== Perform a reset
159146
$display("\nPerforming Reset;");
@@ -186,18 +173,6 @@ module dbgIF_tb;
186173
`report;
187174
$display("time=%t\n",$realtime-t);
188175

189-
// =========================================== Check error
190-
$display("\nCheck error;");
191-
command_tb=15;
192-
`go;
193-
if (perr_tb!=1)
194-
begin
195-
$display("Deliberate error failed");
196-
$finish;
197-
end
198-
else
199-
$display("CORRECT");
200-
201176
// =========================================== Clear error
202177
$display("\nClear error;");
203178
command_tb=DUT.CMD_CLR_ERR;
@@ -353,11 +328,5 @@ module dbgIF_tb;
353328
#50;
354329

355330
$finish;
356-
357-
end
358-
initial begin
359-
$dumpfile("dbgIF.vcd");
360-
361-
$dumpvars;
362331
end
363332
endmodule // swdIF_tb

0 commit comments

Comments
 (0)