x393  1.0
FPGAcodeforElphelNC393camera
ahci_dma.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module ahci_dma (
42 // input rst,
43  input mrst, // @posedge mclk - sync reset
44  input hrst, // @posedge hclk - sync reset
45 
46  input mclk, // for command/status
47  input hclk, // global clock to run axi_hp @ 150MHz
48  // Control interface (@mclk)
49  // Documentation insists 6 LSBs should be 0, but AHCI driver seems to ignore it. Will align to just 128 bits.
50 // input [31:7] ctba, // command table base address
51  input [31:4] ctba, // command table base address
52  input ctba_ld, // load command table base address
53  input [15:0] prdtl, // number of entries in PRD table (valid at cmd_start)
54  input dev_wr, // write to device (valid at start)
55  input cmd_start, // start processing command table, reset prdbc
56  input prd_start, // at or after cmd_start - enable reading PRD/data (if any)
57  input cmd_abort, // try to abort a command: Will keep afi_rready on until RD FIFO is empty and
58  // afi_awvalid (slowly one by one?) until afi_wacount is empty, keeping afi_wlast on
59 
60 // Optional control of the AXI cache mode, default will be set to 4'h3, 4'h3 at mrst
61  input [3:0] axi_wr_cache_mode,
62  input [3:0] axi_rd_cache_mode,
65 
66  // Some data from the command table will be used internally, data will be available on the general
67  // sys_out[31:0] port and should be consumed
68  output reg ct_busy, // cleared after 0x20 DWORDs are read out
69  // reading out command table data
70  input [ 4:0] ct_addr, // DWORD address
71  input [ 1:0] ct_re, // [0] - re, [1]-regen
72  output reg [31:0] ct_data, //
73 
74  // After the first 0x80 bytes of the Command Table are read out, this module will read/process PRDs,
75  // not forwarding them to the output
76  output prd_done, // @mclk prd done (regardless of the interrupt) - data transfer of one PRD is finished (any direction)
77  input prd_irq_clear, // reset pending prd_irq
78  output reg prd_irq_pend, // prd interrupt pending. This is just a condition for irq - actual will be generated after FIS OK
79  output reg cmd_busy, // all commands
80  output cmd_done, // @ mclk
81  output abort_busy,
82  output abort_done,
83  output axi_mismatch, // axi hp counters where empty when calculated counters were not (handled, but seems to be a bug - catch it)
84 
85  // Data System memory -> HBA interface @ mclk
86  output [31:0] sys_out, // 32-bit data from the system memory to HBA (dma data)
87  output sys_dav, // at least one dword is ready to be read
88 // output sys_dav_many, // several DWORDs are in the FIFO (TODO: decide how many)
89  input sys_re, // sys_out data read, advance internal FIFO
90  output last_h2d_data,// when active and no new data for 2 clocks - that was the last one
91 
92  // Data HBA -> System memory interface @ mclk
93  input [31:0] sys_in, // HBA -> system memory
94  output sys_nfull, // internal FIFO has room for more data (will decide - how big reserved space to keep)
95  input sys_we,
96 
97  output extra_din, // all DRDs are transferred to memory, but FIFO has some data. Valid when transfer is stopped
98 
99  // axi_hp signals write channel
100  // write address
101  output [31:0] afi_awaddr,
102  output afi_awvalid,
103  input afi_awready, // @SuppressThisWarning VEditor unused - used FIF0 level
104  output [ 5:0] afi_awid,
105  output [ 1:0] afi_awlock,
106  output reg [ 3:0] afi_awcache,
107  output [ 2:0] afi_awprot,
108  output [ 3:0] afi_awlen,
109  output [ 1:0] afi_awsize,
110  output [ 1:0] afi_awburst,
111  output [ 3:0] afi_awqos,
112  // write data
113  output [63:0] afi_wdata,
114  output afi_wvalid,
115  input afi_wready, // @SuppressThisWarning VEditor unused - used FIF0 level
116  output [ 5:0] afi_wid,
117  output afi_wlast,
118  output [ 7:0] afi_wstrb,
119  // write response
120  input afi_bvalid, // @SuppressThisWarning VEditor unused
121  output afi_bready,
122  input [ 5:0] afi_bid, // @SuppressThisWarning VEditor unused
123  input [ 1:0] afi_bresp, // @SuppressThisWarning VEditor unused
124  // PL extra (non-AXI) signals
125  input [ 7:0] afi_wcount,
126  input [ 5:0] afi_wacount,
128  // AXI_HP signals - read channel
129  // read address
130  output [31:0] afi_araddr,
131  output afi_arvalid,
132  input afi_arready, // @SuppressThisWarning VEditor unused - used FIF0 level
133  output [ 5:0] afi_arid,
134  output [ 1:0] afi_arlock,
135  output reg [ 3:0] afi_arcache,
136  output [ 2:0] afi_arprot,
137  output [ 3:0] afi_arlen,
138  output [ 1:0] afi_arsize,
139  output [ 1:0] afi_arburst,
140  output [ 3:0] afi_arqos,
141  // read data
142  input [63:0] afi_rdata,
143  input afi_rvalid,
144  output afi_rready,
145  input [ 5:0] afi_rid, // @SuppressThisWarning VEditor unused
146  input afi_rlast, // @SuppressThisWarning VEditor unused
147  input [ 1:0] afi_rresp, // @SuppressThisWarning VEditor unused
148  // PL extra (non-AXI) signals
149  input [ 7:0] afi_rcount,
150  input [ 2:0] afi_racount,
152 
153  output [31:0] debug_out,
154  output [31:0] debug_out1
155 
156  ,output [31:0] debug_dma_h2d
157 
158 );
159 
160 
161 // Read command table
162 // localparam AFI_FIFO_LAT = 2; // >=2
163  localparam SAFE_RD_BITS = 3; //2; // 3;
164 
165  reg [31:0] ct_data_ram [0:31];
166  reg [3:0] int_data_addr; // internal (ct,prd) data address
167 // reg [31:7] ctba_r;
168  reg [31:4] ctba_r; // Seems that AHCI driver ignores requirement to have 6 LSB==0
169  reg [15:0] prdtl_mclk;
173  reg prd_start_hclk_r; // to make sure it is with/after prd_start_hclk if in mclk they are in the same cycle
174  wire cmd_abort_hclk; // TODO: Implement as graceful as possible command abort
176  reg [1:0] ct_over_prd_enabled; // prd read and data r/w enabled, command table fetch done
177 
178  reg [31:4] ct_maddr; // granularity matches PRDT entry - 4xDWORD, 2xQWORD
179  wire ct_done;
180  wire first_prd_fetch; // CT read done, prd enabled
181  reg [31:0] afi_addr; // common for afi_araddr and afi_awaddr
182  wire axi_set_raddr_ready = !(|afi_racount[2:1]) && (!axi_set_raddr_r || !afi_racount[0]); // What is the size of ra fifo - just 4? Latency?
183 // wire axi_set_raddr_ready = !(|afi_racount) && !axi_set_raddr_r); // Most pessimistic
184  wire axi_set_waddr_ready = !afi_wacount[5] && !afi_wacount[4]; // What is the size of wa fifo - just 32? Using just half - safe
188 
189  reg axi_set_raddr_r; // [0] - actual write address to fifo
190  reg axi_set_waddr_r; // [0] - actual write address to fifo
191  reg is_ct_addr; // current address is ct address
192  reg is_prd_addr; // current address is prd address
193  reg is_data_addr; // current address is data address (r or w)
194 
195  reg [31:1] data_addr; // 2 lower addresses will be used in in/out fifo modules
196  reg [3:0] data_len; //
197  reg data_irq; // interrupt at the end of this PRD
198  reg [21:1] wcount; // Word count
200  reg [22:1] qwcount; // only [21:3] are used ([22] - carry from subtraction )
202 
203  reg [21:3] qw_datawr_left;
204  reg [ 3:0] qw_datawr_burst;
206 
208 
209  reg [15:0] prds_left;
210  reg last_prd;
211 
212  reg [1:0] afi_rd_ctl; // read non-data (CT or PRD)
213  reg [1:0] ct_busy_r;
214  reg prd_rd_busy; // reading PRD
215 
218  reg prd_wr; // write PRD data to memory
219  reg prd_rd; // read PRD data from memory
220  wire [3:0] afi_wstb4;
221 
222  wire done_dev_wr; // finished PRD mem -> device
223  wire done_dev_rd; // finished PRD device -> mem
225  wire done_flush; // done flushing last partial dword
228  reg [3:0] afi_alen;
229  wire afi_wcount_many = !afi_wcount[7] && !(&afi_wcount[6:4]);
230 
232 
233 // wire raddr_prd_rq = (|prds_left) && (ct_done || prd_done);
235 
237 
240 
241 /*
242  wire addr_data_rq = (wcount_set || data_next_burst);
243 
244  wire waddr_data_rq = !dev_wr_hclk && addr_data_rq;
245  wire raddr_data_rq = dev_wr_hclk && addr_data_rq;
246 
247 */
250 
253 
256  // count different types of AXI ID separately - just for debugging
257  reg [3:0] ct_id;
258  reg [3:0] prd_id;
259  reg [3:0] dev_wr_id;
260  reg [3:0] dev_rd_id;
261  reg [5:0] afi_id; // common for 3 channels
262 
265  reg [31:0] ct_data_reg;
266 // reg abort_busy_hclk;
267  reg hrst_r;
269 // reg axi_dirty_r; // afi_wacount of afi_rcount are non-zero (assuming afi_wcount should be zero as addresses are posted first
270 
271  wire afi_dirty;
276  wire aborting;
279  wire [5:0] afi_wid_abort;
282 // wire abort_done;
285  wire [21:0] abort_debug;
286  reg rwaddr_rq_r; // next cycle after requesting waddr_data_rq, raddr_data_rq, raddr_ct_rq and raddr_prd_rq (*-pend is valid)
287 
289  assign afi_wid = aborting ? afi_wid_abort: afi_id;
293  assign abort_busy = abort_busy_mclk;
294 
295 
296 // assign prd_done = done_dev_wr || done_dev_rd;
297  assign cmd_done_hclk = ((ct_busy_r==2'b10) && (prdtl_mclk == 0)) || ((done_flush || done_dev_rd) && last_prd);
298  assign ct_done = (ct_busy_r == 2'b10);
299  assign first_prd_fetch = ct_over_prd_enabled == 2'b01;
301 /// assign axi_set_waddr_w = axi_set_raddr_ready && raddr_data_pend;
304 
305 
306  assign afi_awaddr = afi_addr;
307  assign afi_araddr = afi_addr;
308  assign afi_arlen = afi_alen;
309  assign afi_awlen = afi_alen;
310  assign afi_arvalid = axi_set_raddr_r;
311  assign afi_awvalid = axi_set_waddr_r;
312 /// assign afi_rready = afi_rd_ctl[0] || data_afi_re;
313  assign afi_wstrb = {{2{afi_wstb4[3]}},{2{afi_wstb4[2]}},{2{afi_wstb4[1]}},{2{afi_wstb4[0]}}};
314 /// assign afi_wlast = qw_datawr_last;
315 
316  assign afi_awid = afi_id;
317 // assign afi_wid = afi_id;
318  assign afi_arid = afi_id;
319 
320 // Unused or static output signals
321  assign afi_bready = 1'b1;
322  assign afi_awlock = 2'h0;
323 // assign afi_awcache = 4'h3;
324  assign afi_awprot = 3'h0;
325  assign afi_awsize = 2'h3;
326  assign afi_awburst = 2'h1;
327  assign afi_awqos = 4'h0;
328  assign afi_wrissuecap1en = 1'b0;
329 
330  assign afi_arlock = 2'h0;
331 // assign afi_arcache = 4'h3;
332  assign afi_arprot = 3'h0;
333  assign afi_arsize = 2'h3;
334  assign afi_arburst = 2'h1;
335  assign afi_arqos = 4'h0;
336  assign afi_rdissuecap1en = 1'b0;
338 // reg [31:0] ct_data_reg;
339  always @ (posedge mclk) begin
340 
341  if (mrst) afi_dirty_mclk <= 0;
343 
345 
347  if (mrst || abort_done) abort_busy_mclk <= 0;
348  else if (cmd_abort) abort_busy_mclk <= 1;
349 
350  if (ct_re[0]) ct_data_reg <= ct_data_ram[ct_addr];
351  if (ct_re[1]) ct_data <= ct_data_reg;
352 
353 // if (ctba_ld) ctba_r <= ctba[31:7];
354  if (ctba_ld) ctba_r <= ctba[31:4];
355 
356  if (cmd_start) prdtl_mclk <= prdtl;
357 
358  if (cmd_start) dev_wr_mclk <= dev_wr;
359 
360  if (mrst || cmd_abort) cmd_busy <= 0;
361  else if (cmd_start) cmd_busy <= 1;
362  else if (cmd_done) cmd_busy <= 0;
363 
364  if (mrst || cmd_abort) ct_busy <= 0;
365  else if (cmd_start) ct_busy <= 1;
366  else if (ct_done_mclk) ct_busy <= 0;
367 
368  if (mrst) afi_arcache <= 4'h3;
370 
371  if (mrst) afi_awcache <= 4'h3;
373 
375 
377  else if (data_irq && prd_done) prd_irq_pend <= 1;
378 
379  if (mrst || cmd_start || cmd_abort) en_extra_din_r <= 0;
380  else if (cmd_done) en_extra_din_r <= 1;
381 
382 
383  end
384 
385 // afi_rd_ctl <= { afi_rd_ctl[0],(ct_busy_r[0] || prd_rd_busy) && ((|afi_rcount[7:SAFE_RD_BITS]) || (afi_rvalid && !(|afi_rd_ctl)))};
388  wire debug_03 = (afi_rvalid && !(|afi_rd_ctl));
389 
390  wire [21:1] wcount_plus_data_addr = wcount[21:1] + data_addr[2:1];
391 
392  always @ (posedge hclk) begin
393  hrst_r <= hrst;
394 
395  if (hrst) rwaddr_rq_r <= 0;
397 
399 
401 
402  if (hrst || abort_or_reset) prd_enabled <= 0;
403  else if (prd_start_hclk_r) prd_enabled <= 1; // precedence over cmd_start_hclk
404  else if (cmd_start_hclk) prd_enabled <= 0;
405 
406 
407 // if (cmd_start_hclk) ct_maddr[31:4] <= {ctba_r[31:7],3'b0};
408  if (cmd_start_hclk) ct_maddr[31:4] <= ctba_r[31:4];
409  else if (ct_done) ct_maddr[31:4] <= ct_maddr[31:4] + 8; // 16;
410  else if (wcount_set) ct_maddr[31:4] <= ct_maddr[31:4] + 1;
411 
412  // overall sequencing makes sure that there will be no new requests until older served
413  // additionally they are mutuially exclusive - only one may be pending at a time
414  if (hrst || cmd_abort_hclk) raddr_ct_pend <= 0;
415  else if (raddr_ct_rq) raddr_ct_pend <= 1;
416  else if (axi_set_raddr_ready) raddr_ct_pend <= 0;
417 
418  if (hrst || cmd_abort_hclk) raddr_prd_pend <= 0;
419  else if (raddr_prd_rq) raddr_prd_pend <= 1;
420  else if (axi_set_raddr_ready) raddr_prd_pend <= 0;
421 
422  if (hrst || cmd_abort_hclk) raddr_data_pend <= 0;
423  else if (raddr_data_rq) raddr_data_pend <= 1;
424  else if (axi_set_raddr_ready) raddr_data_pend <= 0;
425 
426  if (hrst || cmd_abort_hclk) waddr_data_pend <= 0;
427  else if (waddr_data_rq) waddr_data_pend <= 1;
428  else if (axi_set_waddr_ready) waddr_data_pend <= 0;
429 
430  if (hrst) {is_ct_addr, is_prd_addr, is_data_addr} <= 0;
432 
433 /// if (axi_set_raddr_w || axi_set_waddr_w) begin
434  if (rwaddr_rq_r) begin // first cycle one of the *_pend is set
435 
436  if (raddr_data_pend || waddr_data_pend) afi_addr <= {data_addr[31:3], 3'b0};
437  else afi_addr <= {ct_maddr[31:4], 4'b0};
438 
440  else if (raddr_ct_pend) afi_alen <= 4'hf; // 16 QWORDS (128 bytes)
441  else afi_alen <= 4'h1; // 2 QWORDS
442 
444  else afi_id <= raddr_ct_pend ? {2'h0, ct_id} : {2'h1, prd_id};
445  end
446 
447 
448  if (hrst) axi_set_raddr_r <= 0;
450 
451  if (hrst) axi_set_waddr_r <= 0;
453 
454 /// if (addr_data_rq) data_len <= ((|qwcount[21:7]) || (&qwcount[6:3]))? 4'hf: qwcount[6:3]; // early calculate
455  if (addr_data_rq_r) data_len <= ((|qwcount[21:7]) || (&qwcount[6:3]))? 4'hf: qwcount[6:3]; // early calculate
456 
457 
458  if (wcount_set) qwcount[22:7] <= {1'b0,wcount_plus_data_addr[21:7]}; // wcount[21:1] + data_addr[2:1]; //minus 1
459  else if (axi_set_addr_data_w) qwcount[22:7] <= qwcount[22:7] - 1; // may get negative
460 
461  if (wcount_set) qwcount[ 6:1] <= wcount_plus_data_addr[6:1]; // wcount[21:1] + data_addr[2:1]; //minus 1
462 
463  if (wcount_set) qwcount_done <= 0;
464  else if (axi_set_addr_data_w && (qwcount[21:7]==0)) qwcount_done <= 1;
465 
466 
467 
468 //wcount_plus_data_addr
469 
470 /// data_next_burst <= !qwcount[22] && axi_set_addr_data_w && (|qwcount[21:7]); // same time as afi_awvalid || afi_arvalid
471  data_next_burst <= !qwcount_done && axi_set_addr_data_w && (|qwcount[21:7]); // same time as afi_awvalid || afi_arvalid
472 
473 // Get PRD data
474  // store data address from PRD, increment when needed
475  if (afi_rd_ctl[0] && is_prd_addr && (!int_data_addr[0])) data_addr[31:1] <= afi_rdata[31:1];
476  if (axi_set_addr_data_w) data_addr[31:7] <= data_addr[31:7] + 1;
477 
478  if (afi_rd_ctl[0] && is_prd_addr && (int_data_addr[0])) data_irq <= afi_rdata[63];
479 
480  if (afi_rd_ctl[0] && is_prd_addr && (int_data_addr[0])) wcount[21:1] <= afi_rdata[53:33];
481 
483 
485  else if (raddr_prd_rq) prds_left <= prds_left - 1;
486 
487  if (raddr_prd_rq) last_prd <= prds_left[15:1] == 0;
488 
489  // Set/increment address to store (internally) CT and PRD data
490  if (axi_set_raddr_r) int_data_addr <= 0;
491  else if (afi_rd_ctl[0] && !is_data_addr) int_data_addr <= int_data_addr + 1;
492 
493  if (afi_rd_ctl[0] && is_ct_addr) {ct_data_ram[{int_data_addr,1'b1}],ct_data_ram[{int_data_addr,1'b0}]} <= afi_rdata; // make sure it is synthesized correctly
494 
495  // generate busy for command table (CT) read
496  if (hrst) ct_busy_r[0] <= 0;
497  else if (cmd_start_hclk) ct_busy_r[0] <= 1;
498  else if (afi_rd_ctl[0] && is_ct_addr && (&int_data_addr)) ct_busy_r[0] <= 0;
499  ct_busy_r[1] <= ct_busy_r[0]; // delayed version to detect end of command
500 
501  if (hrst || ct_busy_r[0]) ct_over_prd_enabled[0] <= 0;
502  else if (prd_enabled) ct_over_prd_enabled[0] <= 1;
503  ct_over_prd_enabled[1] <= ct_over_prd_enabled[0]; // detecting 0->1 transition
504 
505  // generate busy for PRD table entry read
506  if (hrst) prd_rd_busy <= 0;
507 // else if (prd_rd_busy) prd_rd_busy <= 1;
508  else if (raddr_prd_rq && axi_set_raddr_ready) prd_rd_busy <= 1;
509  else if (wcount_set) prd_rd_busy <= 0;
510 
511  if (cmd_start_hclk) dev_wr_hclk <= dev_wr_mclk; // 1: memory -> device, 0: device -> memory
512 
515 
516  afi_rd_ctl <= { afi_rd_ctl[0],(ct_busy_r[0] || prd_rd_busy) && ((|afi_rcount[7:SAFE_RD_BITS]) || (afi_rvalid && !(|afi_rd_ctl)))};
517 
518  // calculate afi_wlast - it is (qw_datawr_burst == 0), just use register qw_datawr_last
519 
520  if (prd_wr) qw_datawr_last <= (qwcount[21:3] == 0);
521  else if (afi_wvalid_data) qw_datawr_last <= (qw_datawr_burst == 1) || (qw_datawr_last && (qw_datawr_left[21:3] == 16)); // last case - n*16 + 1 (last burst single)
522 
523  if (prd_wr) qw_datawr_burst <= (|qwcount[21:7])? 4'hf: qwcount[6:3];
524  else if (afi_wvalid_data && qw_datawr_last && (qw_datawr_left[21:7] == 1)) qw_datawr_burst <= qw_datawr_left[6:3]; // if not last roll over to 'hf
526 
527  if (prd_wr) qw_datawr_left[21:3] <= qwcount[21:3];
528  else if (afi_wvalid_data && qw_datawr_last) qw_datawr_left[21:7] <= qw_datawr_left[21:7] - 1; // can go negative - OK?
529 
530  // Count AXI IDs
531  if (hrst) ct_id <= 0;
532  else if (ct_busy_r==2'b10) ct_id <= ct_id + 1;
533 
534  if (hrst) prd_id <= 0;
535  else if (wcount_set) prd_id <= prd_id + 1;
536 
537  if (hrst) dev_wr_id <= 0;
538  else if (done_dev_wr) dev_wr_id <= dev_wr_id + 1;
539 
540  if (hrst) dev_rd_id <= 0;
541  else if (done_dev_rd) dev_rd_id <= dev_rd_id + 1;
542 
543 
544  end
545 
546  // Flushing AXI HP - there is no easy way to reset it, so if there was an error in SATA communication we need to read any data
547  // that was already requested (over AXI read adderss channel) and send junk data (with appropriate afi_wlast bit) to the write
548  // channel. THis module is not reset and even bitsteram relaod will not work, so hrst input is used just as disable paying attention
549  // to other inputs, doe s not reset anything inside.
550  // FPGA should not be reset /reloaded if there are any outstanding transactions not aborted
551  // Current implementation counts all transactions and relies on it - not on afi_*count. TODO: Implement recovering from mismatch
552 
553  axi_hp_abort axi_hp_abort_i (
554  .hclk (hclk), // input
555  .hrst (hrst), // input
556  .abort (abort_or_reset), // input
557  .busy (aborting), // output
558  .done (abort_done_hclk), // output reg
559  .afi_awvalid (afi_awvalid), // input
560  .afi_awready (afi_awready), // input
561  .afi_awid (afi_awid), // input[5:0]
562  .afi_awlen (afi_awlen), // input[3:0]
563  .afi_wvalid_in (afi_wvalid), // input
564  .afi_wready (afi_wready), // input
565  .afi_wvalid (afi_wvalid_abort), // output
566  .afi_wid (afi_wid_abort), // output[5:0] reg
567  .afi_arvalid (afi_arvalid), // input
568  .afi_arready (afi_arready), // input
569  .afi_arlen (afi_arlen), // input[3:0]
570  .afi_rready_in (afi_rready), // input
571  .afi_rvalid (afi_rvalid), // input
572  .afi_rready (afi_rready_abort), // output
573  .afi_wlast (afi_wlast_abort), // output
574  .afi_racount (afi_racount), // input[2:0]
575  .afi_rcount (afi_rcount), // input[7:0]
576  .afi_wacount (afi_wacount), // input[5:0]
577  .afi_wcount (afi_wcount), // input[7:0]
578  .dirty (afi_dirty), // output reg
579  .axi_mismatch (axi_mismatch), // output_reg
580  .debug (abort_debug) // output[21:0]
581  );
582 
583 
584  ahci_dma_rd_fifo #( // memory to device
585  .WCNT_BITS (21),
586  .ADDRESS_BITS (3)
587  ) ahci_dma_rd_fifo_i (
588  .mrst (mrst || abort_busy_mclk), // input
589  .hrst (hrst || cmd_abort_hclk), // input
590  .mclk (mclk), // input
591  .hclk (hclk), // input
592  .wcnt (wcount[21:1]), // input[20:0]
593  .woffs (data_addr[2:1]), // input[1:0]
594  .start (prd_rd), // input
595  .din (afi_rdata), // input[63:0]
596  .din_av (afi_rvalid), // input
597  .din_av_many (|afi_rcount[7:SAFE_RD_BITS]), // input
598  .last_prd (last_prd), // input
599  .din_re (data_afi_re), // output
600  .done (done_dev_wr), // output reg // @ hclk
601  .done_flush (done_flush), // output // @ hclk
602  .dout (sys_out), // output[31:0]
603  .dout_vld (sys_dav), // output
604  .dout_re (sys_re), // input
605  .last_DW (last_h2d_data) // output
606  ,.debug_dma_h2d(debug_dma_h2d) // output[31:0]
607 
608  );
609 
610  ahci_dma_wr_fifo #( // device to memory
611  .WCNT_BITS (21),
612  .ADDRESS_BITS (3)
613  ) ahci_dma_wr_fifo_i (
614  .mrst (mrst || abort_busy_mclk), // input
615  .hrst (hrst ||cmd_abort_hclk), // input
616  .mclk (mclk), // input
617  .hclk (hclk), // input
618  .wcnt (wcount[21:1]), // input[20:0]
619  .woffs (data_addr[2:1]), // input[1:0]
620  .init (cmd_start_hclk), // input
621  .start (prd_wr), // input
622  .dout (afi_wdata), // output[63:0] reg
623 // .dout_av (), // input
624  .dout_av_many (afi_wcount_many), // input
625  .last_prd (last_prd), // input
626  .dout_we (afi_wvalid_data), // output
627  .dout_wstb (afi_wstb4), // output[3:0] reg
628  .done (done_dev_rd), // output reg
629  .busy (), // output
630  .fifo_nempty_mclk (fifo_nempty_mclk), // output reg
631  .din (sys_in), // input[31:0]
632  .din_rdy (sys_nfull), // output
633  .din_avail (sys_we) // input
634  );
635  // mclk -> hclk cross-clock synchronization
637  .EXTRA_DLY(0)
638  ) cmd_start_hclk_i (
639  .rst (mrst), // input
640  .src_clk (mclk), // input
641  .dst_clk (hclk), // input
642  .in_pulse (cmd_start), // input
643  .out_pulse (cmd_start_hclk), // output
644  .busy() // output
645  );
647  .EXTRA_DLY(0)
648  ) cmd_abort_hclk_i (
649  .rst (mrst), // input
650  .src_clk (mclk), // input
651  .dst_clk (hclk), // input
652  .in_pulse (abort_rq_mclk), // input
653  .out_pulse (cmd_abort_hclk), // output
654  .busy() // output
655  );
657  .EXTRA_DLY(0)
658  ) prd_start_hclk_i (
659  .rst (mrst), // input
660  .src_clk (mclk), // input
661  .dst_clk (hclk), // input
662  .in_pulse (prd_start_r), // input
663  .out_pulse (prd_start_hclk), // output
664  .busy() // output
665  );
666 
667 
668 
669  // hclk -> mclk;
671  .EXTRA_DLY(0)
672  ) cmd_done_i (
673  .rst (hrst), // input
674  .src_clk (hclk), // input
675  .dst_clk (mclk), // input
676  .in_pulse (cmd_done_hclk), // input
677  .out_pulse (cmd_done), // output
678  .busy() // output
679  );
680 
682  .EXTRA_DLY(0)
683  ) ct_done_mclk_i (
684  .rst (hrst), // input
685  .src_clk (hclk), // input
686  .dst_clk (mclk), // input
687  .in_pulse (ct_done), // input
688  .out_pulse (ct_done_mclk), // output
689  .busy() // output
690  );
691 
693  .EXTRA_DLY(0)
694  ) prd_done_mclk_i (
695  .rst (hrst), // input
696  .src_clk (hclk), // input
697  .dst_clk (mclk), // input
698  .in_pulse (prd_done_hclk), // input
699  .out_pulse (prd_done), // output
700  .busy() // output
701  );
702 
704  .EXTRA_DLY(0)
705  ) abort_done_i (
706  .rst (hrst), // input
707  .src_clk (hclk), // input
708  .dst_clk (mclk), // input
709  .in_pulse (abort_done_hclk), // input
710  .out_pulse (abort_done_mclk), // output
711  .busy() // output
712  );
713 
714 //abort_done_hclk
716 reg [7:0] dbg_qwcount;
721 // if (axi_set_raddr_w || axi_set_waddr_w) begin
722 //data_next_burst
723 always @ (posedge hclk) begin
724  if (hrst) dbg_afi_awvalid_cntr <= 0;
726 
727 // if (hrst) dbg_last_afi_len <= 0;
728  if (axi_set_raddr_w || axi_set_waddr_w) begin
729  end
731 // if (wcount_set) qwcount[22:7] <= {1'b0,wcount_plus_data_addr[21:7]}; // wcount[21:1] + data_addr[2:1]; //minus 1
732 
733  if (hrst) dbg_qwcount_cntr <= 0;
734 // else if (wcount_set) dbg_qwcount_cntr <= dbg_qwcount_cntr + 1;
735 // else if (data_next_burst) dbg_qwcount_cntr <= dbg_qwcount_cntr + 1;
736  else if (!qwcount[22] && axi_set_addr_data_w && (|qwcount[21:7])) dbg_qwcount_cntr <= dbg_qwcount_cntr + 1;
737 
738 
739  if (hrst) dbg_set_raddr_count <= 0;
740 // else if (axi_set_raddr_w) dbg_set_raddr_count <= dbg_set_raddr_count + 1;
742 
743 
744  if (hrst) dbg_set_waddr_count <= 0;
745 // else if (axi_set_waddr_w) dbg_set_waddr_count <= dbg_set_waddr_count + 1;
746 // else if (axi_set_waddr_ready && waddr_data_pend) dbg_set_waddr_count <= dbg_set_waddr_count + 1; //0x14
748 
749  if (hrst) dbg_was_mismatch <= 0;
750  else if (axi_mismatch) dbg_was_mismatch <= 1;
751 
752 end
753 
754 assign debug_out = {int_data_addr [3:0],
755  qwcount_done, // prd_rd_busy,
756  afi_racount [2:0],
757  //--
758  afi_rcount [7:0],
759  //--
760  ct_busy,
761  cmd_busy,
762  afi_wacount [5:0],
763  //--
764  afi_wcount [7:0]};
765 /*
766 assign debug_out = {
767  qwcount[22:7],
768  dev_rd_id,
769  dev_wr_id,
770  prd_id,
771  ct_id
772 };
773 
774 assign debug_out = {qwcount_done,
775  2'b0,
776  dev_wr_id,
777  prd_id,
778  wcount[21:1]
779 };
780 
781 assign debug_out1 = { //dbg_set_raddr_count[7:0],
782  qwcount_done,
783  afi_rcount[6:0],
784  //{qwcount[22], qwcount[13:7]},
785  dbg_set_waddr_count[7:0],
786  dbg_qwcount[3:0],
787  afi_alen[3:0],
788  dbg_qwcount_cntr[7:0]};
789 */
790 assign debug_out1 = { //dbg_set_raddr_count[7:0]
791  8'b0 ,
793  1'b0,
794  abort_debug[21:0]}; // {aw_count[5:0], w_count[7:0], r_count[7:0]};
795 
796 //
797 endmodule
798 
12893afi_rready
Definition: ahci_dma.v:144
[15:0] 12827prdtl
Definition: ahci_dma.v:53
12948prd_rdreg
Definition: ahci_dma.v:219
[ 1:0] 12838ct_re
Definition: ahci_dma.v:71
12992abort_debugwire[21:0]
Definition: ahci_dma.v:285
12987afi_wid_abortwire[5:0]
Definition: ahci_dma.v:279
reg [63:0] 13108dout
12826ctba_ld
Definition: ahci_dma.v:52
12971dev_wr_idreg[3:0]
Definition: ahci_dma.v:259
[31:0] 12900debug_out
Definition: ahci_dma.v:153
[ 2:0] 12886afi_arprot
Definition: ahci_dma.v:136
12840prd_done
Definition: ahci_dma.v:76
12924axi_set_raddr_rreg
Definition: ahci_dma.v:189
[ 1:0] 12888afi_arsize
Definition: ahci_dma.v:138
axi_hp_abort_i axi_hp_abort
Definition: ahci_dma.v:553
12978abort_or_resetwire
Definition: ahci_dma.v:268
[31:0] 12901debug_out1
Definition: ahci_dma.v:154
[ 1:0] 12889afi_arburst
Definition: ahci_dma.v:139
13003dbg_was_mismatchreg
Definition: ahci_dma.v:720
12923axi_set_addr_data_wwire
Definition: ahci_dma.v:187
[ 7:0] 12877afi_wcount
Definition: ahci_dma.v:125
12925axi_set_waddr_rreg
Definition: ahci_dma.v:190
[31:0] 12856afi_awaddr
Definition: ahci_dma.v:101
12881afi_arvalid
Definition: ahci_dma.v:131
12991abort_busy_mclkreg
Definition: ahci_dma.v:284
[31:4] 12825ctba
Definition: ahci_dma.v:51
12850sys_re
Definition: ahci_dma.v:89
12854sys_we
Definition: ahci_dma.v:95
12966raddr_data_rqwire
Definition: ahci_dma.v:252
12941last_prdreg
Definition: ahci_dma.v:210
[21:0] 14184debug
Definition: axi_hp_abort.v:60
[ 5:0] 12875afi_bid
Definition: ahci_dma.v:122
[ 5:0] 14165afi_awid
Definition: axi_hp_abort.v:40
12835set_axi_rd_cache_mode
Definition: ahci_dma.v:64
12962raddr_ct_pendreg
Definition: ahci_dma.v:239
[ 2:0] 12862afi_awprot
Definition: ahci_dma.v:107
12916ct_donewire
Definition: ahci_dma.v:179
12939data_afi_rewire
Definition: ahci_dma.v:207
[ 1:0] 12884afi_arlock
Definition: ahci_dma.v:134
12874afi_bready
Definition: ahci_dma.v:121
12937qw_datawr_burstreg[3:0]
Definition: ahci_dma.v:204
ahci_dma_wr_fifo_i ahci_dma_wr_fifo
Definition: ahci_dma.v:610
12951done_dev_rdwire
Definition: ahci_dma.v:223
12905int_data_addrreg[3:0]
Definition: ahci_dma.v:166
12909prd_start_rreg
Definition: ahci_dma.v:171
[ 1:0] 12896afi_rresp
Definition: ahci_dma.v:147
[ 3:0] 12887afi_arlen
Definition: ahci_dma.v:137
12846abort_done
Definition: ahci_dma.v:82
12994debug_01wire
Definition: ahci_dma.v:386
12983abort_done_unneededreg
Definition: ahci_dma.v:275
12989afi_wlast_abortwire
Definition: ahci_dma.v:281
[ 1:0] 12865afi_awburst
Definition: ahci_dma.v:110
12915ct_maddrreg[31:4]
Definition: ahci_dma.v:178
[ 2:0] 12898afi_racount
Definition: ahci_dma.v:150
12868afi_wvalid
Definition: ahci_dma.v:114
[ 5:0] 12859afi_awid
Definition: ahci_dma.v:104
reg [3:0] 13112dout_wstb
12969ct_idreg[3:0]
Definition: ahci_dma.v:257
12963addr_data_rq_wwire
Definition: ahci_dma.v:248
[ 3:0] 14173afi_arlen
Definition: axi_hp_abort.v:48
12926is_ct_addrreg
Definition: ahci_dma.v:191
12950done_dev_wrwire
Definition: ahci_dma.v:222
[ 1:0] 12864afi_awsize
Definition: ahci_dma.v:109
[31:0] 12902debug_dma_h2d
Definition: ahci_dma.v:156
[31:0] 12880afi_araddr
Definition: ahci_dma.v:130
12936qw_datawr_leftreg[21:3]
Definition: ahci_dma.v:203
12972dev_rd_idreg[3:0]
Definition: ahci_dma.v:260
12997wcount_plus_data_addrwire[21:1]
Definition: ahci_dma.v:390
12921axi_set_raddr_wwire
Definition: ahci_dma.v:185
reg 12842prd_irq_pend
Definition: ahci_dma.v:78
12955ct_done_mclkwire
Definition: ahci_dma.v:227
[ 1:0] 12876afi_bresp
Definition: ahci_dma.v:123
12822hrst
Definition: ahci_dma.v:44
12988afi_rready_abortwire
Definition: ahci_dma.v:280
12960raddr_prd_pendreg
Definition: ahci_dma.v:236
12970prd_idreg[3:0]
Definition: ahci_dma.v:258
12927is_prd_addrreg
Definition: ahci_dma.v:192
reg 14183axi_mismatch
Definition: axi_hp_abort.v:59
[3:0] 12833axi_rd_cache_mode
Definition: ahci_dma.v:62
abort_done_i pulse_cross_clock
Definition: ahci_dma.v:703
12959raddr_prd_rqwire
Definition: ahci_dma.v:234
12940prds_leftreg[15:0]
Definition: ahci_dma.v:209
12964addr_data_rq_rreg
Definition: ahci_dma.v:249
12857afi_awvalid
Definition: ahci_dma.v:102
[WCNT_BITS-1:0] 13104wcnt
reg [ 3:0] 12861afi_awcache
Definition: ahci_dma.v:106
12979afi_dirtywire
Definition: ahci_dma.v:271
12892afi_rvalid
Definition: ahci_dma.v:143
12919axi_set_raddr_readywire
Definition: ahci_dma.v:182
12990abort_rq_mclkreg
Definition: ahci_dma.v:283
12961raddr_ct_rqwire
Definition: ahci_dma.v:238
[ 7:0] 12872afi_wstrb
Definition: ahci_dma.v:118
[ 7:0] 14179afi_rcount
Definition: axi_hp_abort.v:55
[0:31] 12904ct_data_ramreg[31:0]
Definition: ahci_dma.v:165
12871afi_wlast
Definition: ahci_dma.v:117
12974fifo_nempty_mclkwire
Definition: ahci_dma.v:263
12831cmd_abort
Definition: ahci_dma.v:57
reg 14162done
Definition: axi_hp_abort.v:37
12821mrst
Definition: ahci_dma.v:43
12823mclk
Definition: ahci_dma.v:46
13002dbg_set_waddr_countreg[7:0]
Definition: ahci_dma.v:719
12967waddr_data_pendreg
Definition: ahci_dma.v:254
12907prdtl_mclkreg[15:0]
Definition: ahci_dma.v:169
[ 5:0] 12870afi_wid
Definition: ahci_dma.v:116
12910prd_start_hclkwire
Definition: ahci_dma.v:172
reg [31:0] 12839ct_data
Definition: ahci_dma.v:72
13000dbg_qwcount_cntrreg[7:0]
Definition: ahci_dma.v:717
12956afi_alenreg[3:0]
Definition: ahci_dma.v:228
reg [ 5:0] 14170afi_wid
Definition: axi_hp_abort.v:45
12929data_addrreg[31:1]
Definition: ahci_dma.v:195
ahci_dma_rd_fifo_i ahci_dma_rd_fifo
Definition: ahci_dma.v:584
12920axi_set_waddr_readywire
Definition: ahci_dma.v:184
[ 7:0] 12897afi_rcount
Definition: ahci_dma.v:149
12984abortingwire
Definition: ahci_dma.v:276
12934qwcountreg[22:1]
Definition: ahci_dma.v:200
12952prd_done_hclkwire
Definition: ahci_dma.v:224
12938qw_datawr_lastreg
Definition: ahci_dma.v:205
12906ctba_rreg[31:4]
Definition: ahci_dma.v:168
13001dbg_set_raddr_countreg[7:0]
Definition: ahci_dma.v:718
reg [ 3:0] 12885afi_arcache
Definition: ahci_dma.v:135
12849sys_dav
Definition: ahci_dma.v:87
[63:0] 12867afi_wdata
Definition: ahci_dma.v:113
12914ct_over_prd_enabledreg[1:0]
Definition: ahci_dma.v:176
12980afi_dirty_mclkreg
Definition: ahci_dma.v:272
[ 1:0] 12860afi_awlock
Definition: ahci_dma.v:105
12935qwcount_donereg
Definition: ahci_dma.v:201
12958data_next_burstreg
Definition: ahci_dma.v:231
12981abort_done_hclkwire
Definition: ahci_dma.v:273
12882afi_arready
Definition: ahci_dma.v:132
12858afi_awready
Definition: ahci_dma.v:103
12996debug_03wire
Definition: ahci_dma.v:388
12879afi_wrissuecap1en
Definition: ahci_dma.v:127
12922axi_set_waddr_wwire
Definition: ahci_dma.v:186
12998dbg_afi_awvalid_cntrreg[7:0]
Definition: ahci_dma.v:715
[ 3:0] 12866afi_awqos
Definition: ahci_dma.v:111
12973afi_idreg[5:0]
Definition: ahci_dma.v:261
12930data_lenreg[3:0]
Definition: ahci_dma.v:196
12976ct_data_regreg[31:0]
Definition: ahci_dma.v:265
12911prd_start_hclk_rreg
Definition: ahci_dma.v:173
12841prd_irq_clear
Definition: ahci_dma.v:77
12918afi_addrreg[31:0]
Definition: ahci_dma.v:181
12844cmd_done
Definition: ahci_dma.v:80
[3:0] 12832axi_wr_cache_mode
Definition: ahci_dma.v:61
[ 4:0] 12837ct_addr
Definition: ahci_dma.v:70
[3:0] 14166afi_awlen
Definition: axi_hp_abort.v:41
12824hclk
Definition: ahci_dma.v:47
12853sys_nfull
Definition: ahci_dma.v:94
[ 7:0] 14181afi_wcount
Definition: axi_hp_abort.v:57
12954cmd_done_hclkwire
Definition: ahci_dma.v:226
[31:0] 12852sys_in
Definition: ahci_dma.v:93
12942afi_rd_ctlreg[1:0]
Definition: ahci_dma.v:212
12946dev_wr_hclkreg
Definition: ahci_dma.v:217
12968raddr_data_pendreg
Definition: ahci_dma.v:255
12953done_flushwire
Definition: ahci_dma.v:225
12943ct_busy_rreg[1:0]
Definition: ahci_dma.v:213
[WCNT_BITS-1:0] 13010wcnt
[63:0] 12891afi_rdata
Definition: ahci_dma.v:142
12869afi_wready
Definition: ahci_dma.v:115
reg 14182dirty
Definition: axi_hp_abort.v:58
reg 12836ct_busy
Definition: ahci_dma.v:68
12851last_h2d_data
Definition: ahci_dma.v:90
12830prd_start
Definition: ahci_dma.v:56
[ 5:0] 12878afi_wacount
Definition: ahci_dma.v:126
12847axi_mismatch
Definition: ahci_dma.v:83
12957afi_wcount_manywire
Definition: ahci_dma.v:229
12845abort_busy
Definition: ahci_dma.v:81
12895afi_rlast
Definition: ahci_dma.v:146
12928is_data_addrreg
Definition: ahci_dma.v:193
12949afi_wstb4wire[3:0]
Definition: ahci_dma.v:220
[ 5:0] 12894afi_rid
Definition: ahci_dma.v:145
[ 5:0] 12883afi_arid
Definition: ahci_dma.v:133
12945dev_wr_mclkreg
Definition: ahci_dma.v:216
12975en_extra_din_rreg
Definition: ahci_dma.v:264
12944prd_rd_busyreg
Definition: ahci_dma.v:214
[ 3:0] 12890afi_arqos
Definition: ahci_dma.v:140
12982abort_done_mclkwire
Definition: ahci_dma.v:274
12977hrst_rreg
Definition: ahci_dma.v:267
12931data_irqreg
Definition: ahci_dma.v:197
12913prd_enabledreg
Definition: ahci_dma.v:175
[ 5:0] 14180afi_wacount
Definition: axi_hp_abort.v:56
12999dbg_qwcountreg[7:0]
Definition: ahci_dma.v:716
[ 3:0] 12863afi_awlen
Definition: ahci_dma.v:108
12873afi_bvalid
Definition: ahci_dma.v:120
12947prd_wrreg
Definition: ahci_dma.v:218
12899afi_rdissuecap1en
Definition: ahci_dma.v:151
12855extra_din
Definition: ahci_dma.v:97
12912cmd_abort_hclkwire
Definition: ahci_dma.v:174
12834set_axi_wr_cache_mode
Definition: ahci_dma.v:63
[ 2:0] 14178afi_racount
Definition: axi_hp_abort.v:54
[31:0] 12848sys_out
Definition: ahci_dma.v:86
12829cmd_start
Definition: ahci_dma.v:55
12932wcountreg[21:1]
Definition: ahci_dma.v:198
12933wcount_setreg
Definition: ahci_dma.v:199
reg 12843cmd_busy
Definition: ahci_dma.v:79
12995debug_02wire
Definition: ahci_dma.v:387
12828dev_wr
Definition: ahci_dma.v:54
12908cmd_start_hclkwire
Definition: ahci_dma.v:170
12993rwaddr_rq_rreg
Definition: ahci_dma.v:286
12985afi_wvalid_datawire
Definition: ahci_dma.v:277
[31:0] 13024debug_dma_h2d
12965waddr_data_rqwire
Definition: ahci_dma.v:251
12986afi_wvalid_abortwire
Definition: ahci_dma.v:278
12917first_prd_fetchwire
Definition: ahci_dma.v:180
12903SAFE_RD_BITS3
Definition: ahci_dma.v:163