@@ -40,24 +40,31 @@ module axi_dmac #(
40
40
parameter ID = 0 ,
41
41
parameter DMA_DATA_WIDTH_SRC = 64 ,
42
42
parameter DMA_DATA_WIDTH_DEST = 64 ,
43
+ parameter DMA_DATA_WIDTH_SG = 64 ,
43
44
parameter DMA_LENGTH_WIDTH = 24 ,
44
45
parameter DMA_2D_TRANSFER = 0 ,
46
+ parameter DMA_SG_TRANSFER = 0 ,
45
47
parameter ASYNC_CLK_REQ_SRC = 1 ,
46
48
parameter ASYNC_CLK_SRC_DEST = 1 ,
47
49
parameter ASYNC_CLK_DEST_REQ = 1 ,
50
+ parameter ASYNC_CLK_REQ_SG = 1 ,
51
+ parameter ASYNC_CLK_SRC_SG = 1 ,
52
+ parameter ASYNC_CLK_DEST_SG = 1 ,
48
53
parameter AXI_SLICE_DEST = 0 ,
49
54
parameter AXI_SLICE_SRC = 0 ,
50
55
parameter SYNC_TRANSFER_START = 0 ,
51
56
parameter CYCLIC = 1 ,
52
57
parameter DMA_AXI_PROTOCOL_DEST = 0 ,
53
58
parameter DMA_AXI_PROTOCOL_SRC = 0 ,
59
+ parameter DMA_AXI_PROTOCOL_SG = 0 ,
54
60
parameter DMA_TYPE_DEST = 0 ,
55
61
parameter DMA_TYPE_SRC = 2 ,
56
62
parameter DMA_AXI_ADDR_WIDTH = 32 ,
57
63
parameter MAX_BYTES_PER_BURST = 128 ,
58
64
parameter FIFO_SIZE = 8 , // In bursts
59
65
parameter AXI_ID_WIDTH_SRC = 1 ,
60
66
parameter AXI_ID_WIDTH_DEST = 1 ,
67
+ parameter AXI_ID_WIDTH_SG = 1 ,
61
68
parameter DMA_AXIS_ID_W = 8 ,
62
69
parameter DMA_AXIS_DEST_W = 4 ,
63
70
parameter DISABLE_DEBUG_REGISTERS = 0 ,
@@ -187,6 +194,52 @@ module axi_dmac #(
187
194
output [AXI_ID_WIDTH_SRC- 1 :0 ] m_src_axi_wid,
188
195
input [AXI_ID_WIDTH_SRC- 1 :0 ] m_src_axi_bid,
189
196
197
+ // Master AXI interface
198
+ input m_sg_axi_aclk,
199
+ input m_sg_axi_aresetn,
200
+
201
+ // Read address
202
+ input m_sg_axi_arready,
203
+ output m_sg_axi_arvalid,
204
+ output [DMA_AXI_ADDR_WIDTH- 1 :0 ] m_sg_axi_araddr,
205
+ output [7 - (4 * DMA_AXI_PROTOCOL_SG):0 ] m_sg_axi_arlen,
206
+ output [ 2 :0 ] m_sg_axi_arsize,
207
+ output [ 1 :0 ] m_sg_axi_arburst,
208
+ output [ 2 :0 ] m_sg_axi_arprot,
209
+ output [ 3 :0 ] m_sg_axi_arcache,
210
+ output [AXI_ID_WIDTH_SG- 1 :0 ] m_sg_axi_arid,
211
+ output [DMA_AXI_PROTOCOL_SG:0 ] m_sg_axi_arlock,
212
+
213
+ // Read data and response
214
+ input [DMA_DATA_WIDTH_SG- 1 :0 ] m_sg_axi_rdata,
215
+ output m_sg_axi_rready,
216
+ input m_sg_axi_rvalid,
217
+ input [ 1 :0 ] m_sg_axi_rresp,
218
+ input [AXI_ID_WIDTH_SG- 1 :0 ] m_sg_axi_rid,
219
+ input m_sg_axi_rlast,
220
+
221
+ // Unused write interface
222
+ output m_sg_axi_awvalid,
223
+ output [DMA_AXI_ADDR_WIDTH- 1 :0 ] m_sg_axi_awaddr,
224
+ output [7 - (4 * DMA_AXI_PROTOCOL_SG):0 ] m_sg_axi_awlen,
225
+ output [ 2 :0 ] m_sg_axi_awsize,
226
+ output [ 1 :0 ] m_sg_axi_awburst,
227
+ output [ 3 :0 ] m_sg_axi_awcache,
228
+ output [ 2 :0 ] m_sg_axi_awprot,
229
+ input m_sg_axi_awready,
230
+ output m_sg_axi_wvalid,
231
+ output [DMA_DATA_WIDTH_SG- 1 :0 ] m_sg_axi_wdata,
232
+ output [(DMA_DATA_WIDTH_SG/ 8 )- 1 :0 ] m_sg_axi_wstrb,
233
+ output m_sg_axi_wlast,
234
+ input m_sg_axi_wready,
235
+ input m_sg_axi_bvalid,
236
+ input [ 1 :0 ] m_sg_axi_bresp,
237
+ output m_sg_axi_bready,
238
+ output [AXI_ID_WIDTH_SG- 1 :0 ] m_sg_axi_awid,
239
+ output [DMA_AXI_PROTOCOL_SG:0 ] m_sg_axi_awlock,
240
+ output [AXI_ID_WIDTH_SG- 1 :0 ] m_sg_axi_wid,
241
+ input [AXI_ID_WIDTH_SG- 1 :0 ] m_sg_axi_bid,
242
+
190
243
// Slave streaming AXI interface
191
244
input s_axis_aclk,
192
245
output s_axis_ready,
@@ -257,6 +310,14 @@ module axi_dmac #(
257
310
DMA_DATA_WIDTH_SRC > 32 ? 3 :
258
311
DMA_DATA_WIDTH_SRC > 16 ? 2 :
259
312
DMA_DATA_WIDTH_SRC > 8 ? 1 : 0 ;
313
+ localparam BYTES_PER_BEAT_WIDTH_SG = DMA_DATA_WIDTH_SG > 1024 ? 8 :
314
+ DMA_DATA_WIDTH_SG > 512 ? 7 :
315
+ DMA_DATA_WIDTH_SG > 256 ? 6 :
316
+ DMA_DATA_WIDTH_SG > 128 ? 5 :
317
+ DMA_DATA_WIDTH_SG > 64 ? 4 :
318
+ DMA_DATA_WIDTH_SG > 32 ? 3 :
319
+ DMA_DATA_WIDTH_SG > 16 ? 2 :
320
+ DMA_DATA_WIDTH_SG > 8 ? 1 : 0 ;
260
321
localparam ID_WIDTH = (FIFO_SIZE) > 64 ? 8 :
261
322
(FIFO_SIZE) > 32 ? 7 :
262
323
(FIFO_SIZE) > 16 ? 6 :
@@ -331,45 +392,22 @@ module axi_dmac #(
331
392
wire [31 :0 ] dbg_ids0;
332
393
wire [31 :0 ] dbg_ids1;
333
394
334
- assign m_dest_axi_araddr = 'd0;
335
- assign m_dest_axi_arlen = 'd0;
336
- assign m_dest_axi_arsize = 'd0;
337
- assign m_dest_axi_arburst = 'd0;
338
- assign m_dest_axi_arcache = 'd0;
339
- assign m_dest_axi_arprot = 'd0;
340
- assign m_dest_axi_awid = 'h0;
341
- assign m_dest_axi_awlock = 'h0;
342
- assign m_dest_axi_wid = 'h0;
343
- assign m_dest_axi_arid = 'h0;
344
- assign m_dest_axi_arlock = 'h0;
345
- assign m_src_axi_awaddr = 'd0;
346
- assign m_src_axi_awlen = 'd0;
347
- assign m_src_axi_awsize = 'd0;
348
- assign m_src_axi_awburst = 'd0;
349
- assign m_src_axi_awcache = 'd0;
350
- assign m_src_axi_awprot = 'd0;
351
- assign m_src_axi_wdata = 'd0;
352
- assign m_src_axi_wstrb = 'd0;
353
- assign m_src_axi_wlast = 'd0;
354
- assign m_src_axi_awid = 'h0;
355
- assign m_src_axi_awlock = 'h0;
356
- assign m_src_axi_wid = 'h0;
357
- assign m_src_axi_arid = 'h0;
358
- assign m_src_axi_arlock = 'h0;
359
-
360
395
wire up_req_eot;
396
+ wire [31 :0 ] up_req_sg_desc_id;
361
397
wire [BYTES_PER_BURST_WIDTH- 1 :0 ] up_req_measured_burst_length;
362
398
wire up_response_partial;
363
399
wire up_response_valid;
364
400
wire up_response_ready;
365
401
366
402
wire ctrl_enable;
367
403
wire ctrl_pause;
404
+ wire ctrl_hwdesc;
368
405
369
406
wire up_dma_req_valid;
370
407
wire up_dma_req_ready;
371
408
wire [DMA_AXI_ADDR_WIDTH- 1 :BYTES_PER_BEAT_WIDTH_DEST] up_dma_req_dest_address;
372
409
wire [DMA_AXI_ADDR_WIDTH- 1 :BYTES_PER_BEAT_WIDTH_SRC] up_dma_req_src_address;
410
+ wire [DMA_AXI_ADDR_WIDTH- 1 :BYTES_PER_BEAT_WIDTH_SG] up_dma_req_sg_address;
373
411
wire [DMA_LENGTH_WIDTH- 1 :0 ] up_dma_req_x_length;
374
412
wire [DMA_LENGTH_WIDTH- 1 :0 ] up_dma_req_y_length;
375
413
wire [DMA_LENGTH_WIDTH- 1 :0 ] up_dma_req_dest_stride;
@@ -396,6 +434,7 @@ module axi_dmac #(
396
434
.DISABLE_DEBUG_REGISTERS(DISABLE_DEBUG_REGISTERS),
397
435
.BYTES_PER_BEAT_WIDTH_DEST(BYTES_PER_BEAT_WIDTH_DEST),
398
436
.BYTES_PER_BEAT_WIDTH_SRC(BYTES_PER_BEAT_WIDTH_SRC),
437
+ .BYTES_PER_BEAT_WIDTH_SG(BYTES_PER_BEAT_WIDTH_SG),
399
438
.BYTES_PER_BURST_WIDTH(BYTES_PER_BURST_WIDTH),
400
439
.DMA_TYPE_DEST(DMA_TYPE_DEST),
401
440
.DMA_TYPE_SRC(DMA_TYPE_SRC),
@@ -406,6 +445,7 @@ module axi_dmac #(
406
445
.HAS_DEST_ADDR(HAS_DEST_ADDR),
407
446
.HAS_SRC_ADDR(HAS_SRC_ADDR),
408
447
.DMA_2D_TRANSFER(DMA_2D_TRANSFER),
448
+ .DMA_SG_TRANSFER(DMA_SG_TRANSFER),
409
449
.SYNC_TRANSFER_START(SYNC_TRANSFER_START),
410
450
.CACHE_COHERENT_DEST(CACHE_COHERENT_DEST)
411
451
) i_regmap (
@@ -438,12 +478,14 @@ module axi_dmac #(
438
478
// Control interface
439
479
.ctrl_enable(ctrl_enable),
440
480
.ctrl_pause(ctrl_pause),
481
+ .ctrl_hwdesc(ctrl_hwdesc),
441
482
442
483
// Request interface
443
484
.request_valid(up_dma_req_valid),
444
485
.request_ready(up_dma_req_ready),
445
486
.request_dest_address(up_dma_req_dest_address),
446
487
.request_src_address(up_dma_req_src_address),
488
+ .request_sg_address(up_dma_req_sg_address),
447
489
.request_x_length(up_dma_req_x_length),
448
490
.request_y_length(up_dma_req_y_length),
449
491
.request_dest_stride(up_dma_req_dest_stride),
@@ -453,6 +495,7 @@ module axi_dmac #(
453
495
454
496
// DMA response interface
455
497
.response_eot(up_req_eot),
498
+ .response_sg_desc_id(up_req_sg_desc_id),
456
499
.response_measured_burst_length(up_req_measured_burst_length),
457
500
.response_partial(up_response_partial),
458
501
.response_valid(up_response_valid),
@@ -468,25 +511,30 @@ module axi_dmac #(
468
511
axi_dmac_transfer #(
469
512
.DMA_DATA_WIDTH_SRC(DMA_DATA_WIDTH_SRC),
470
513
.DMA_DATA_WIDTH_DEST(DMA_DATA_WIDTH_DEST),
514
+ .DMA_DATA_WIDTH_SG(DMA_DATA_WIDTH_SG),
471
515
.DMA_LENGTH_WIDTH(DMA_LENGTH_WIDTH),
472
516
.DMA_LENGTH_ALIGN(DMA_LENGTH_ALIGN),
473
517
.BYTES_PER_BEAT_WIDTH_DEST(BYTES_PER_BEAT_WIDTH_DEST),
474
518
.BYTES_PER_BEAT_WIDTH_SRC(BYTES_PER_BEAT_WIDTH_SRC),
519
+ .BYTES_PER_BEAT_WIDTH_SG(BYTES_PER_BEAT_WIDTH_SG),
475
520
.BYTES_PER_BURST_WIDTH(BYTES_PER_BURST_WIDTH),
476
521
.DMA_TYPE_DEST(DMA_TYPE_DEST),
477
522
.DMA_TYPE_SRC(DMA_TYPE_SRC),
478
523
.DMA_AXI_ADDR_WIDTH(DMA_AXI_ADDR_WIDTH),
479
524
.DMA_2D_TRANSFER(DMA_2D_TRANSFER),
525
+ .DMA_SG_TRANSFER(DMA_SG_TRANSFER),
480
526
.ASYNC_CLK_REQ_SRC(ASYNC_CLK_REQ_SRC),
481
527
.ASYNC_CLK_SRC_DEST(ASYNC_CLK_SRC_DEST),
482
528
.ASYNC_CLK_DEST_REQ(ASYNC_CLK_DEST_REQ),
529
+ .ASYNC_CLK_REQ_SG(ASYNC_CLK_REQ_SG),
483
530
.AXI_SLICE_DEST(AXI_SLICE_DEST),
484
531
.AXI_SLICE_SRC(AXI_SLICE_SRC),
485
532
.MAX_BYTES_PER_BURST(REAL_MAX_BYTES_PER_BURST),
486
533
.FIFO_SIZE(FIFO_SIZE),
487
534
.ID_WIDTH(ID_WIDTH),
488
535
.AXI_LENGTH_WIDTH_SRC(8 -(4 *DMA_AXI_PROTOCOL_SRC)),
489
536
.AXI_LENGTH_WIDTH_DEST(8 -(4 *DMA_AXI_PROTOCOL_DEST)),
537
+ .AXI_LENGTH_WIDTH_SG(8 -(4 *DMA_AXI_PROTOCOL_SG)),
490
538
.ENABLE_DIAGNOSTICS_IF(ENABLE_DIAGNOSTICS_IF),
491
539
.ALLOW_ASYM_MEM(ALLOW_ASYM_MEM),
492
540
.CACHE_COHERENT_DEST(CACHE_COHERENT_DEST)
@@ -496,11 +544,13 @@ module axi_dmac #(
496
544
497
545
.ctrl_enable(ctrl_enable),
498
546
.ctrl_pause(ctrl_pause),
547
+ .ctrl_hwdesc(ctrl_hwdesc),
499
548
500
549
.req_valid(up_dma_req_valid),
501
550
.req_ready(up_dma_req_ready),
502
551
.req_dest_address(up_dma_req_dest_address),
503
552
.req_src_address(up_dma_req_src_address),
553
+ .req_sg_address(up_dma_req_sg_address),
504
554
.req_x_length(up_dma_req_x_length),
505
555
.req_y_length(up_dma_req_y_length),
506
556
.req_dest_stride(up_dma_req_dest_stride),
@@ -509,6 +559,7 @@ module axi_dmac #(
509
559
.req_last(up_dma_req_last),
510
560
511
561
.req_eot(up_req_eot),
562
+ .req_sg_desc_id(up_req_sg_desc_id),
512
563
.req_measured_burst_length(up_req_measured_burst_length),
513
564
.req_response_partial(up_response_partial),
514
565
.req_response_valid(up_response_valid),
@@ -518,6 +569,8 @@ module axi_dmac #(
518
569
.m_dest_axi_aresetn(m_dest_axi_aresetn),
519
570
.m_src_axi_aclk(m_src_axi_aclk),
520
571
.m_src_axi_aresetn(m_src_axi_aresetn),
572
+ .m_sg_axi_aclk(m_sg_axi_aclk),
573
+ .m_sg_axi_aresetn(m_sg_axi_aresetn),
521
574
522
575
.m_axi_awaddr(m_dest_axi_awaddr),
523
576
.m_axi_awlen(m_dest_axi_awlen),
@@ -553,6 +606,21 @@ module axi_dmac #(
553
606
.m_axi_rlast(m_src_axi_rlast),
554
607
.m_axi_rresp(m_src_axi_rresp),
555
608
609
+ .m_sg_axi_arready(m_sg_axi_arready),
610
+ .m_sg_axi_arvalid(m_sg_axi_arvalid),
611
+ .m_sg_axi_araddr(m_sg_axi_araddr),
612
+ .m_sg_axi_arlen(m_sg_axi_arlen),
613
+ .m_sg_axi_arsize(m_sg_axi_arsize),
614
+ .m_sg_axi_arburst(m_sg_axi_arburst),
615
+ .m_sg_axi_arprot(m_sg_axi_arprot),
616
+ .m_sg_axi_arcache(m_sg_axi_arcache),
617
+
618
+ .m_sg_axi_rdata(m_sg_axi_rdata),
619
+ .m_sg_axi_rready(m_sg_axi_rready),
620
+ .m_sg_axi_rvalid(m_sg_axi_rvalid),
621
+ .m_sg_axi_rlast(m_sg_axi_rlast),
622
+ .m_sg_axi_rresp(m_sg_axi_rresp),
623
+
556
624
.s_axis_aclk(s_axis_aclk),
557
625
.s_axis_ready(s_axis_ready),
558
626
.s_axis_valid(s_axis_valid),
@@ -603,21 +671,47 @@ module axi_dmac #(
603
671
assign m_dest_axi_arburst = 'h0;
604
672
assign m_dest_axi_arcache = 'h0;
605
673
assign m_dest_axi_arprot = 'h0;
674
+ assign m_dest_axi_awid = 'h0;
675
+ assign m_dest_axi_awlock = 'h0;
676
+ assign m_dest_axi_wid = 'h0;
677
+ assign m_dest_axi_arid = 'h0;
678
+ assign m_dest_axi_arlock = 'h0;
606
679
607
680
assign m_src_axi_awvalid = 1'b0 ;
608
681
assign m_src_axi_wvalid = 1'b0 ;
609
682
assign m_src_axi_bready = 1'b0 ;
610
- assign m_src_axi_awvalid = 'h0;
611
683
assign m_src_axi_awaddr = 'h0;
612
684
assign m_src_axi_awlen = 'h0;
613
685
assign m_src_axi_awsize = 'h0;
614
686
assign m_src_axi_awburst = 'h0;
615
687
assign m_src_axi_awcache = 'h0;
616
688
assign m_src_axi_awprot = 'h0;
617
- assign m_src_axi_wvalid = 'h0;
618
689
assign m_src_axi_wdata = 'h0;
619
690
assign m_src_axi_wstrb = 'h0;
620
691
assign m_src_axi_wlast = 'h0;
692
+ assign m_src_axi_awid = 'h0;
693
+ assign m_src_axi_awlock = 'h0;
694
+ assign m_src_axi_wid = 'h0;
695
+ assign m_src_axi_arid = 'h0;
696
+ assign m_src_axi_arlock = 'h0;
697
+
698
+ assign m_sg_axi_awvalid = 1'b0 ;
699
+ assign m_sg_axi_wvalid = 1'b0 ;
700
+ assign m_sg_axi_bready = 1'b0 ;
701
+ assign m_sg_axi_awaddr = 'h0;
702
+ assign m_sg_axi_awlen = 'h0;
703
+ assign m_sg_axi_awsize = 'h0;
704
+ assign m_sg_axi_awburst = 'h0;
705
+ assign m_sg_axi_awcache = 'h0;
706
+ assign m_sg_axi_awprot = 'h0;
707
+ assign m_sg_axi_wdata = 'h0;
708
+ assign m_sg_axi_wstrb = 'h0;
709
+ assign m_sg_axi_wlast = 'h0;
710
+ assign m_sg_axi_awid = 'h0;
711
+ assign m_sg_axi_awlock = 'h0;
712
+ assign m_sg_axi_wid = 'h0;
713
+ assign m_sg_axi_arid = 'h0;
714
+ assign m_sg_axi_arlock = 'h0;
621
715
622
716
assign m_axis_keep = {DMA_DATA_WIDTH_DEST/ 8 {1'b1 }};
623
717
assign m_axis_strb = {DMA_DATA_WIDTH_DEST/ 8 {1'b1 }};
0 commit comments