OpenCores
URL https://opencores.org/ocsvn/pcie_sg_dma/pcie_sg_dma/trunk

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [branches/] [Virtex6/] [ML605_ISE12.3/] [MySim/] [tf64_pcie_trn.v] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 barabba
`timescale 1ns / 1ps
2
 
3
////////////////////////////////////////////////////////////////////////////////
4
// Company:  ziti, Uni. HD
5
// Engineer:  wgao
6
//            weng.ziti@gmail.com
7
// 
8
// Create Date:   16:54:18 04 Nov 2008
9
// Design Name:   tlpControl
10
// Module Name:   tf64_pcie_trn.v
11
// Project Name:  PCIE_SG_DMA
12
// Target Device:  
13
// Tool versions:  
14
// Description:  PIO and DMA are both simulated.
15
//
16
// Verilog Test Fixture created by ISE for module: tlpControl
17
//
18
// Dependencies:
19
// 
20
// Revision:
21
// Revision 0.01 - File Created
22
// 
23
// Revision 1.00 - Released to OpenCores.org   14.09.2011
24
// 
25
// Additional Comments:
26
// 
27
////////////////////////////////////////////////////////////////////////////////
28
 
29
 
30
//`define  RANDOM_SEQUENCE
31
 
32
  /*  Time parameters  */
33
`define  T_HALF_CYCLE_CLK                   4.0
34
`define  T_HALF_CYCLE_MEMCLK                5.0
35
`define  T_DELAY_AFTER                      0.0
36
`define  T_DELTA                            0.1
37
`define  T_PIO_INTERVAL                    50.0
38
`define  T_DMA_INTERVAL                   300.0
39
`define  T_RX_NO_FC_PERIOD            1900000.0
40
`define  T_TX_NO_FC_PERIOD            1500000.0
41
 
42
  /* Memory size for simulation */
43
`define  C_ARRAY_DIMENSION              4096
44
 
45
  /* Start indices */
46
`define  PIO_START_INDEX                'H0300
47
`define  DMA_START_INDEX                'H0000
48
 
49
  /* Request completion boundary */
50
`define  C_RCB_16_DW                    'H10
51
`define  C_RCB_32_DW                    'H20
52
 
53
  /* BAR */
54
`define  C_BAR0_HIT                    7'H7E
55
`define  C_BAR1_HIT                    7'H7D
56
`define  C_BAR2_HIT                    7'H7B
57
`define  C_BAR3_HIT                    7'H77
58
`define  C_BAR4_HIT                    7'H6F
59
`define  C_BAR5_HIT                    7'H5F
60
`define  C_BAR6_HIT                    7'H3F
61
`define  C_NO_BAR_HIT                  7'H7F
62
 
63
 
64
  /* Requester ID and Completer ID */
65
`define  C_HOST_WRREQ_ID              16'H0ABC
66
`define  C_HOST_RDREQ_ID              16'HE1E2
67
`define  C_HOST_CPLD_ID               16'HC01D
68
 
69
  /* 1st header */
70
`define  HEADER0_MWR3_                32'H40000000
71
`define  HEADER0_MWR4_                32'H60000000
72
`define  HEADER0_MRD3_                32'H00000000
73
`define  HEADER0_MRD4_                32'H20000000
74
`define  HEADER0_CPLD                 32'H4A000000
75
`define  HEADER0_CPL                  32'H0A000000
76
`define  HEADER0_MSG                  32'H34000001
77
 
78
  /* Message codes */
79
`define  C_MSG_CODE_INTA               8'H20
80
`define  C_MSG_CODE_INTA_N             8'H24
81
 
82
  /* Payload type */
83
`define  USE_PRIVATE                    1
84
`define  USE_PUBLIC                     0
85
 
86
  /* General registers */
87
`define  C_ADDR_VERSION                 32'H0000
88
`define  C_ADDR_IRQ_STAT                32'H0008
89
`define  C_ADDR_IRQ_EN                  32'H0010
90
`define  C_ADDR_GSR                     32'H0020
91
`define  C_ADDR_GCR                     32'H0028
92
 
93
  /* Control registers for special ports */
94
`define  C_ADDR_MRD_CTRL                32'H0074
95
`define  C_ADDR_TX_CTRL                 32'H0078
96
`define  C_ADDR_ICAP                    32'H007C
97
`define  C_ADDR_EB_STACON               32'H0090
98
 
99
  /* Downstream DMA channel registers */
100
`define  C_ADDR_DMA_DS_PAH              32'H0050
101
`define  C_ADDR_DMA_DS_CTRL             32'H006C
102
`define  C_ADDR_DMA_DS_STA              32'H0070
103
 
104
  /* Upstream DMA channel registers */
105
`define  C_ADDR_DMA_US_PAH              32'H002C
106
`define  C_ADDR_DMA_US_CTRL             32'H0048
107
`define  C_ADDR_DMA_US_STA              32'H004C
108
 
109
  /* DMA-specific constants */
110
`define  C_DMA_RST_CMD                  32'H0200000A
111
 
112
 
113
module tf64_pcie_trn();
114
 
115
   // Inputs
116
   reg  trn_reset_n;
117
   reg  trn_lnk_up_n;
118
   reg  trn_clk;
119
   reg  trn_rsof_n;
120
   reg  trn_reof_n;
121
   reg  [63:0] trn_rd;
122
   reg  [7:0] trn_rrem_n;
123
   reg  trn_rsrc_rdy_n;
124
   wire trn_rdst_rdy_n;
125
   reg  [6:0] trn_rbar_hit_n;
126
   wire trn_rnp_ok_n;
127
   reg  trn_rerrfwd_n;
128
   reg  trn_rsrc_dsc_n;
129
   wire trn_tsof_n;
130
   wire trn_teof_n;
131
   wire [63:0] trn_td;
132
   wire [7:0] trn_trem_n;
133
   wire trn_tsrc_rdy_n;
134
   reg  trn_tdst_rdy_n;
135
   wire trn_terrfwd_n;
136
   wire trn_tsrc_dsc_n;
137
   reg  trn_tdst_dsc_n;
138
   reg  [5:0] trn_tbuf_av;
139
//   reg cfg_interrupt_rdy_n;
140
//   reg [2:0] cfg_interrupt_mmenable;
141
//   reg cfg_interrupt_msienable;
142
//   reg [7:0] cfg_interrupt_do;
143
   reg [5:0] pcie_link_width;
144
   reg [15:0] cfg_dcommand;
145
   reg [15:0] localID;
146
 
147
   // Outputs
148
   wire DDR_wr_v;
149
   wire DDR_wr_sof;
150
   wire DDR_wr_eof;
151
   wire DDR_wr_Shift;
152
   wire [1:0] DDR_wr_Mask;
153
   wire [63:0] DDR_wr_din;
154
   wire DDR_wr_full;
155
   wire DDR_rdc_v;
156
   wire DDR_rdc_sof;
157
   wire DDR_rdc_eof;
158
   wire DDR_rdc_Shift;
159
   wire [63:0] DDR_rdc_din;
160
   wire DDR_rdc_full;
161
   wire DDR_FIFO_RdEn;
162
   wire DDR_FIFO_Empty;
163
   wire [63:0] DDR_FIFO_RdQout;
164
   reg  mbuf_UserFull;
165
   wire DDR_Ready;
166
   wire trn_Blinker;
167
   reg  mem_clk;
168
 
169
        //SIMONE
170
        wire ddr_wr_fa;
171
        wire DDR_rdc_FA;
172
 
173
 
174
   // FIFO
175
   wire           eb_FIFO_we;
176
   wire [64-1:00] eb_FIFO_din;
177
   wire           eb_FIFO_re;
178
   wire [72-1:00] eb_FIFO_qout;
179
   wire [64-1:00] eb_FIFO_Status;
180
   wire           eb_FIFO_Rst;
181
 
182
   wire           eb_pfull;
183
   wire           eb_full;
184
   wire           eb_pempty;
185
   wire           eb_empty;
186
 
187
   wire [27-1:0]  eb_FIFO_Data_Count;
188
 
189
   // flow control toggles
190
   reg            Rx_No_Flow_Control;
191
   reg            Tx_No_Flow_Control;
192
 
193
   // message counters 
194
   reg  [31:00] Accum_Msg_INTA        = 0;
195
   reg  [31:00] Accum_Msg_INTA_n      = 0;
196
 
197
   // random seed
198
   reg [127: 0]  Op_Random;
199
 
200
   // Generated Array
201
   reg [15:00]  ii;
202
   reg [31:00]  D_Array[`C_ARRAY_DIMENSION-1:00];
203
 
204
   //
205
   reg  [ 7: 0] FSM_Trn;
206
   reg  [31: 0] Hdr_Array[3:0];
207
   reg  [31: 0] Private_Array[15:0];
208
   reg  [10: 0] Rx_TLP_Length;
209
   reg  [ 7: 0] Rx_MWr_Tag;
210
   reg  [ 4: 0] Rx_MRd_Tag;
211
   reg  [31:00] Tx_MRd_Addr;
212
   reg  [31:00] Tx_MRd_Leng;
213
   reg  [10: 0] tx_MRd_Length;
214
   reg  [ 7: 0] tx_MRd_Tag;
215
   reg  [ 7: 0] tx_MRd_Tag_k;
216
 
217
   reg  [31:00] DMA_PA;
218
   reg  [63:00] DMA_HA;
219
   reg  [63:00] DMA_BDA;
220
   reg  [31:00] DMA_Leng;
221
   reg  [31:00] DMA_L1;
222
   reg  [31:00] DMA_L2;
223
   reg  [02:00] DMA_bar;
224
   reg          DMA_ds_is_Last;
225
   reg          DMA_us_is_Last;
226
   reg  [31:00] CplD_Index;
227
 
228
   reg          Desc_tx_MRd_Valid;
229
   reg  [10:00] Desc_tx_MRd_Leng;
230
   reg  [31:00] Desc_tx_MRd_Addr;
231
   reg  [07:00] Desc_tx_MRd_TAG;
232
   reg          tx_MRd_come;
233
 
234
   reg  [63:00] PIO_Addr;
235
   reg  [31:00] PIO_Leng;
236
   reg  [ 3:00] PIO_1st_BE;
237
   reg  [ 6:00] PIO_bar;
238
 
239
 //Rimossi da v5 a v6
240
 //wire           DBG_dma_start;
241
 
242
 //Aggiunti da v5 a v6
243
 
244
   reg  [01:00]  protocol_link_act;
245
   reg                            DAQ_irq;
246
   reg           CTL_irq;
247
   reg           DLM_irq;
248
   reg  [31:00]  ctl_status;
249
   reg           ctl_tv;
250
   reg  [31:00]  ctl_td;
251
   reg           dlm_rv;
252
   reg  [31:00]  dlm_rd;
253
   reg           DG_is_Running;
254
        reg           cfg_interrupt_rdy_n;
255
        reg  [02:00]  cfg_interrupt_mmenable;
256
        reg           cfg_interrupt_msienable;
257
        reg  [07:00]  cfg_interrupt_do;
258
   reg           eb_FIFO_ow;
259
 
260
        // Instantiate the Unit Under Test (UUT)
261
        tlpControl uut (
262
                .mbuf_UserFull(mbuf_UserFull),
263
                .trn_Blinker(trn_Blinker),
264
      .eb_FIFO_we     (eb_FIFO_we    ) , //          : OUT std_logic; 
265
      .eb_FIFO_din    (eb_FIFO_din   ) , //          : OUT std_logic_vector(C_DBUS_WIDTH-1 downto 0);
266
      .eb_FIFO_re     (eb_FIFO_re    ) , //          : OUT std_logic; 
267
      .eb_FIFO_empty  (eb_empty      ) , //          : IN  std_logic; 
268
      .eb_FIFO_qout   (eb_FIFO_qout[63:0]  ) , //          : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
269
      .eb_FIFO_Data_Count   (eb_FIFO_Data_Count  ) , //          : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
270
      .eb_FIFO_Status (eb_FIFO_Status) , //          : IN  std_logic_vector(C_DBUS_WIDTH-1 downto 0);
271
      .eb_FIFO_Rst    (eb_FIFO_Rst   ) , //          : OUT std_logic;
272
      .Link_Buf_full  (eb_pfull   ) ,
273
                .DDR_Ready      (DDR_Ready),
274
                .DDR_wr_sof(DDR_wr_sof),
275
                .DDR_wr_eof(DDR_wr_eof),
276
                .DDR_wr_v(DDR_wr_v),
277
                .DDR_wr_FA(ddr_wr_fa),  //SIMONE era () 
278
                .DDR_wr_Shift(DDR_wr_Shift),
279
                .DDR_wr_Mask(DDR_wr_Mask),
280
                .DDR_wr_din(DDR_wr_din),
281
                .DDR_wr_full(DDR_wr_full),
282
                .DDR_rdc_sof(DDR_rdc_sof),
283
                .DDR_rdc_eof(DDR_rdc_eof),
284
                .DDR_rdc_v(DDR_rdc_v),
285
                .DDR_rdc_FA(DDR_rdc_FA),  //SIMONE era () 
286
      .DDR_rdc_Shift(DDR_rdc_Shift),
287
                .DDR_rdc_din(DDR_rdc_din),
288
                .DDR_rdc_full(DDR_rdc_full),
289
                .DDR_FIFO_RdEn(DDR_FIFO_RdEn),
290
                .DDR_FIFO_Empty(DDR_FIFO_Empty),
291
                .DDR_FIFO_RdQout(DDR_FIFO_RdQout),
292
                .trn_clk(trn_clk),
293
                .trn_reset_n(trn_reset_n),
294
                .trn_lnk_up_n(trn_lnk_up_n),
295
                .trn_rsof_n(trn_rsof_n),
296
                .trn_reof_n(trn_reof_n),
297
                .trn_rd(trn_rd),
298
      .trn_rrem_n(trn_rrem_n),
299
                .trn_rerrfwd_n(trn_rerrfwd_n),
300
                .trn_rsrc_rdy_n(trn_rsrc_rdy_n),
301
                .trn_rdst_rdy_n(trn_rdst_rdy_n),
302
                .trn_rnp_ok_n(trn_rnp_ok_n),
303
                .trn_rsrc_dsc_n(trn_rsrc_dsc_n),
304
                .trn_rbar_hit_n(trn_rbar_hit_n),
305
                .trn_tsof_n(trn_tsof_n),
306
                .trn_teof_n(trn_teof_n),
307
                .trn_td(trn_td),
308
      .trn_trem_n(trn_trem_n),
309
                .trn_terrfwd_n(trn_terrfwd_n),
310
                .trn_tsrc_rdy_n(trn_tsrc_rdy_n),
311
                .trn_tdst_rdy_n(trn_tdst_rdy_n),
312
                .trn_tsrc_dsc_n(trn_tsrc_dsc_n),
313
                .trn_tdst_dsc_n(trn_tdst_dsc_n),
314
                .trn_tbuf_av(trn_tbuf_av),
315
                .pcie_link_width(pcie_link_width),
316
                .cfg_dcommand(cfg_dcommand),
317
                .localID(localID),
318
 
319
 
320
      //Rimosse da v5 a v6!!
321
                //S .DMA_ds_Start   (DBG_dma_start),
322
 
323
                //Aggiunte da v5 a v6!!
324
      .DMA_us_Done(),
325
      .DMA_us_Busy(),
326
      .DMA_us_Busy_LED(),
327
      .DMA_ds_Done(),
328
      .DMA_ds_Busy(),
329
      .DMA_ds_Busy_LED(),
330
      .ctl_rv(),
331
      .ctl_rd(),
332
      .protocol_rst(),
333
      .ctl_ttake(),
334
      .ctl_tstop(),
335
      .ctl_reset(),
336
      .dlm_tv(),
337
      .dlm_td(),
338
                .cfg_interrupt_n(),
339
                .cfg_interrupt_di(),
340
                .cfg_interrupt_assert_n(),
341
      .Format_Shower(),
342
      .DG_Reset(),
343
      .DG_Mask(),
344
      .tab_we(),
345
      .tab_wa(),
346
      .tab_wd(),
347
      .eb_FIFO_wsof(),
348
      .eb_FIFO_weof(),
349
      .pio_reading_status(),
350
 
351
                .DAQ_irq                    (DAQ_irq                 ),
352
      .CTL_irq                    (CTL_irq                 ),
353
      .DLM_irq                    (DLM_irq                 ),
354
      .ctl_status                 (ctl_status              ),
355
      .ctl_tv                     (ctl_tv                  ),
356
      .ctl_td                     (ctl_td                  ),
357
      .dlm_rv                     (dlm_rv                  ),
358
      .dlm_rd                     (dlm_rd                  ),
359
      .DG_is_Running              (DG_is_Running           ),
360
      .cfg_interrupt_rdy_n        (cfg_interrupt_rdy_n     ),
361
      .cfg_interrupt_mmenable     (cfg_interrupt_mmenable  ),
362
      .cfg_interrupt_msienable    (cfg_interrupt_msienable ),
363
      .cfg_interrupt_do           (cfg_interrupt_do        ),
364
      .eb_FIFO_ow                 (eb_FIFO_ow              )
365
 
366
        );
367
 
368
 
369
 
370
        // Instantiate the BRAM module
371
   bram_DDRs_Control_loopback
372
        DDRs_ctrl_module
373
   (
374
    .DDR_wr_sof(DDR_wr_sof),
375
    .DDR_wr_eof(DDR_wr_eof),
376
    .DDR_wr_v(DDR_wr_v),
377
    .DDR_wr_FA(1'b0),
378
    .DDR_wr_Shift(DDR_wr_Shift),
379
    .DDR_wr_Mask(DDR_wr_Mask),
380
    .DDR_wr_din(DDR_wr_din),
381
 
382
          //Aggiunti da v5 a v6 
383
    .DDR_wr_full(DDR_wr_full),
384
 
385
 
386
    .DDR_rdc_sof(DDR_rdc_sof),
387
    .DDR_rdc_eof(DDR_rdc_eof),
388
    .DDR_rdc_v(DDR_rdc_v),
389
    .DDR_rdc_FA(1'b0),
390
    .DDR_rdc_Shift(DDR_rdc_Shift),
391
    .DDR_rdc_din(DDR_rdc_din),
392
    .DDR_rdc_full(DDR_rdc_full),
393
 
394
    .DDR_FIFO_RdEn(DDR_FIFO_RdEn),
395
    .DDR_FIFO_Empty(DDR_FIFO_Empty),
396
    .DDR_FIFO_RdQout(DDR_FIFO_RdQout),
397
 
398
    .DDR_Ready(DDR_Ready),
399
         .DDR_blinker(DDR_blinker),
400
    .Sim_Zeichen(Sim_Zeichen),
401
    .mem_clk(mem_clk),
402
    .trn_clk(trn_clk),
403
    .trn_reset_n(trn_reset_n)
404
 
405
    //S .DBG_dma_start(DBG_dma_start),
406
    );
407
 
408
   assign  DDR_wr_full = 0;
409
 
410
 
411
        // Instantiate the FIFO module
412
   eb_wrapper_loopback
413
   queue_buffer(
414
         .wr_clk     (  trn_clk        ),
415
         .wr_en      (  eb_FIFO_we     ),
416
         .din        (  {8'H0, eb_FIFO_din}    ),
417
         .pfull      (  eb_pfull       ),
418
         .full       (  eb_full        ),
419
 
420
         .rd_clk     (  trn_clk        ),
421
         .rd_en      (  eb_FIFO_re     ),
422
         .dout       (  eb_FIFO_qout   ),
423
         .pempty     (  eb_pempty      ),
424
         .empty      (  eb_empty       ),
425
         .data_count (  eb_FIFO_Data_Count[15:1]),
426
 
427
         .rst        (  eb_FIFO_Rst    )
428
         );
429
 
430
   assign  eb_FIFO_Data_Count[26:16] = 0;
431
   assign  eb_FIFO_Data_Count[0] = 0;
432
   assign  eb_FIFO_Status = {34'H0, eb_FIFO_Data_Count, eb_pfull, eb_empty};
433
 
434
 
435
 
436
   // initialiation
437
        initial begin
438
                // Initialize Inputs
439
                trn_clk = 0;
440
      mem_clk = 1;
441
                trn_reset_n = 0;
442
                trn_lnk_up_n = 1;
443
                trn_rerrfwd_n = 1;
444
                trn_rsrc_dsc_n = 1;
445
                trn_tdst_dsc_n = 1;
446
                trn_tbuf_av = -1;
447
 
448
      //Aggiunti da v5 a v6
449
                DAQ_irq                                         = 0;
450
                CTL_irq                 = 0;
451
                DLM_irq                 = 0;
452
                ctl_status              = 0;
453
                ctl_tv                  = 0;
454
                ctl_td                  = 0;
455
                dlm_rv                  = 0;
456
                dlm_rd                  = 0;
457
                DG_is_Running           = 0;
458
                cfg_interrupt_rdy_n     = 0;
459
                cfg_interrupt_mmenable  = 0;
460
                cfg_interrupt_msienable = 0;
461
                cfg_interrupt_do        = 0;
462
                eb_FIFO_ow              = 0;
463
 
464
//              cfg_interrupt_rdy_n = 0;
465
//              cfg_interrupt_mmenable = 0;
466
//              cfg_interrupt_msienable = 0;
467
//              cfg_interrupt_do = 0;
468
 
469
                mbuf_UserFull = 0;
470
                pcie_link_width = 'H19;
471
      cfg_dcommand = 'H2000;
472
                localID = 'HD841;
473
 
474
      Rx_No_Flow_Control = 1;    // = 0;  // Set to 0 to enable the Rx throttling
475
      Tx_No_Flow_Control = 1;    // = 0;  // Set to 0 to enable the Tx throttling
476
 
477
                // Wait some nanoseconds for global reset to finish
478
                #100;
479
                trn_reset_n = 1;
480
                trn_lnk_up_n = 0;
481
 
482
                #10000;
483
//      $stop();
484
 
485
        end
486
 
487
   // trn_clk toggles
488
   always #`T_HALF_CYCLE_CLK
489
   trn_clk = ~trn_clk;
490
 
491
   // mem_clk toggles
492
   always #`T_HALF_CYCLE_MEMCLK
493
   mem_clk = ~mem_clk;
494
 
495
   // Randoms generated for process flow
496
   always @(posedge trn_clk) begin
497
     Op_Random[ 31:00] = $random();
498
     Op_Random[ 63:32] = $random();
499
     Op_Random[ 95:64] = $random();
500
     Op_Random[127:96] = $random();
501
   end
502
 
503
 
504
   /// Rx Flow Control
505
   always # `T_RX_NO_FC_PERIOD
506
   Rx_No_Flow_Control = ~Rx_No_Flow_Control;
507
 
508
   /// Tx Flow Control
509
   always # `T_TX_NO_FC_PERIOD
510
   Tx_No_Flow_Control = ~Tx_No_Flow_Control;
511
 
512
   // Signal prepared for trn_rsrc_rdy_n
513
   reg trn_rsrc_rdy_n_seed;
514
   always @(posedge trn_clk) begin
515
     trn_rsrc_rdy_n_seed <= Op_Random[8] & Op_Random[10] & ~Rx_No_Flow_Control;
516
   end
517
 
518
   // trn_tdst_rdy_n
519
   always @(posedge trn_clk )
520
   begin
521
     # `T_DELAY_AFTER
522
      trn_tdst_rdy_n <= (Op_Random[24] & Op_Random[21] & ~Tx_No_Flow_Control) | ~trn_reset_n;
523
   end
524
 
525
 
526
 
527
   // Initialization mem in host
528
   initial begin
529
     for (ii = 0; ii< `C_ARRAY_DIMENSION; ii= ii+1) begin
530
`ifdef  RANDOM_SEQUENCE
531
        D_Array[ii]    <= $random ();
532
`else
533
        D_Array[ii]    <= Inv_Endian ('H8760_0000 + ii + 1);
534
`endif
535
     end
536
   end
537
 
538
 
539
  //  Simulation procedure
540
  initial begin
541
 
542
    // Simulation Initialization
543
    FSM_Trn               <= 'H00;
544
    Gap_Insert_Rx;
545
 
546
    PIO_bar               <= -1;
547
    DMA_bar               <= 'H1;
548
    Rx_MWr_Tag            <= 'H80;
549
    Rx_MRd_Tag            <= 'H10;
550
 
551
 
552
    // Initialization: TLP
553
    # 400
554
      Rx_TLP_Length    <= 'H01;
555
 
556
    # `T_DELTA    // reset TX module
557
      Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
558
      Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
559
      Hdr_Array[2] <= `C_ADDR_TX_CTRL;
560
      Private_Array[0] <= 'H0000000A;
561
 
562
    # `T_DELTA
563
      TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
564
      Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
565
      Gap_Insert_Rx;
566
 
567
 
568
    # `T_DELTA     // Test MRd with 4-DW header  BAR[0]
569
      Hdr_Array[0] <= `HEADER0_MRD4_ | Rx_TLP_Length[9:0];
570
      Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 8'HA1, 4'Hf, 4'Hf};
571
      Hdr_Array[2] <= -1;
572
      Hdr_Array[3] <= `C_ADDR_VERSION;
573
 
574
 
575
    # `T_DELTA
576
      TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
577
      Gap_Insert_Rx;
578
 
579
 
580
    # 100
581
      Rx_TLP_Length    <= 'H01;
582
 
583
 
584
    # `T_DELTA    // reset upstream DMA channel
585
      Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
586
      Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
587
      Hdr_Array[2] <= `C_ADDR_DMA_US_CTRL;
588
      Private_Array[0] <= `C_DMA_RST_CMD;
589
 
590
    # `T_DELTA
591
      TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
592
      Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
593
      Gap_Insert_Rx;
594
 
595
    # `T_DELTA    // reset downstream DMA channel
596
      Hdr_Array[0] <= `HEADER0_MWR4_ | Rx_TLP_Length[9:0];
597
      Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
598
      Hdr_Array[2] <= -1;
599
      Hdr_Array[3] <= `C_ADDR_DMA_DS_CTRL;
600
      Private_Array[0] <= `C_DMA_RST_CMD;
601
 
602
    # `T_DELTA
603
      TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
604
      Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
605
      Gap_Insert_Rx;
606
 
607
 
608
    # `T_DELTA    // reset Event Buffer FIFO
609
      Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
610
      Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
611
      Hdr_Array[2] <= `C_ADDR_EB_STACON;
612
      Private_Array[0] <= 'H0000000A;
613
 
614
    # `T_DELTA
615
      TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
616
      Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
617
      Gap_Insert_Rx;
618
 
619
 
620
    # `T_DELTA    // Enable INTerrupts
621
      Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
622
      Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
623
      Hdr_Array[2] <= `C_ADDR_IRQ_EN;
624
      Private_Array[0] <= 'H0000_0003;
625
 
626
    # `T_DELTA
627
      TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
628
      Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
629
      Gap_Insert_Rx;
630
 
631
 
632
 
633
 
634
    /////////////////////////////////////////////////////////////////////
635
    //                       PIO simulation                            //
636
    /////////////////////////////////////////////////////////////////////
637
 
638
 
639
     # `T_PIO_INTERVAL
640
       ;
641
 
642
       FSM_Trn          <= 'H04;
643
 
644
    //  ///////////////////////////////////////////////////////////////////
645
    //  PIO write & read BAR[0]
646
 
647
       PIO_Addr         <= `C_ADDR_DMA_US_PAH + 'H8;
648
       PIO_bar          <= `C_BAR0_HIT;
649
       PIO_1st_BE       <= 4'Hf;
650
       Gap_Insert_Rx;
651
       Hdr_Array[0]     <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
652
       Hdr_Array[1]     <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, PIO_1st_BE};
653
       Hdr_Array[2]     <= {PIO_Addr[31:2], 2'b00};
654
       Private_Array[0] <= 'HF000_8888;
655
       Rx_TLP_Length    <= 'H01;
656
     # `T_DELTA
657
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, PIO_bar);
658
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
659
       Gap_Insert_Rx;
660
 
661
     # `T_PIO_INTERVAL
662
       ;
663
 
664
     # `T_DELTA
665
       Hdr_Array[0]     <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
666
       Hdr_Array[1]     <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, PIO_1st_BE};
667
       Hdr_Array[2]     <= {PIO_Addr[31:2], 2'b00};
668
 
669
     # `T_DELTA
670
       TLP_Feed_Rx(`USE_PUBLIC, `PIO_START_INDEX, PIO_bar);
671
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
672
       Gap_Insert_Rx;
673
 
674
       FSM_Trn          <= 'H08;
675
 
676
 
677
 
678
    //  ///////////////////////////////////////////////////////////////////
679
    //  PIO write & read BAR[1]
680
       PIO_Addr         <= 'H8000;
681
       PIO_bar          <= `C_BAR1_HIT;
682
       PIO_1st_BE       <= 4'Hf;
683
       Gap_Insert_Rx;
684
       Hdr_Array[0]     <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
685
       Hdr_Array[1]     <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, PIO_1st_BE};
686
       Hdr_Array[2]     <= {PIO_Addr[31:2], 2'b00};
687
       Private_Array[0] <= 'HA1111111;
688
       Rx_TLP_Length    <= 'H01;
689
     # `T_DELTA
690
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, PIO_bar);
691
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
692
       Gap_Insert_Rx;
693
 
694
     # `T_PIO_INTERVAL
695
       ;
696
 
697
     # `T_DELTA
698
       Hdr_Array[0]     <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
699
       Hdr_Array[1]     <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, PIO_1st_BE};
700
       Hdr_Array[2]     <= {PIO_Addr[31:2], 2'b00};
701
 
702
     # `T_DELTA
703
       TLP_Feed_Rx(`USE_PRIVATE, `PIO_START_INDEX, PIO_bar);
704
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
705
       Gap_Insert_Rx;
706
 
707
       FSM_Trn          <= 'H10;
708
 
709
 
710
 
711
    //  ///////////////////////////////////////////////////////////////////
712
    //  PIO write & read BAR[2]
713
    //  NOTE:  FIFO address is 64-bit aligned, only the lower 32-bit is
714
    //         accessible by BAR[2] PIO write and is returned in BAR[2] 
715
    //         PIO read.
716
       PIO_Addr         <= 'H0;
717
       PIO_bar          <= `C_BAR2_HIT;
718
       PIO_1st_BE       <= 4'Hf;
719
       Gap_Insert_Rx;
720
       Hdr_Array[0]     <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
721
       Hdr_Array[1]     <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, PIO_1st_BE};
722
       Hdr_Array[2]     <= {PIO_Addr[31:2], 2'b00};
723
       Private_Array[0] <= 'HB222_2222;
724
       Rx_TLP_Length    <= 'H01;
725
     # `T_DELTA
726
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, PIO_bar);
727
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
728
       Gap_Insert_Rx;
729
 
730
     # `T_PIO_INTERVAL
731
       ;
732
 
733
     # `T_DELTA
734
       Hdr_Array[0]     <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
735
       Hdr_Array[1]     <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, PIO_1st_BE};
736
       Hdr_Array[2]     <= {PIO_Addr[31:2], 2'b00};
737
 
738
     # `T_DELTA
739
       TLP_Feed_Rx(`USE_PUBLIC, `PIO_START_INDEX, PIO_bar);
740
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
741
       Gap_Insert_Rx;
742
 
743
       FSM_Trn          <= 'H14;
744
 
745
 
746
 
747
     # `T_DMA_INTERVAL
748
       ;
749
 
750
 
751
    //  ///////////////////////////////////////////////////////////////////
752
    //  DMA write & read BAR[1]
753
    //  Single-descriptor case
754
 
755
       DMA_PA   <= 'H1234;
756
       DMA_HA   <= 'H5000;
757
       DMA_BDA  <= 'Hffff;
758
                 DMA_Leng <= 'H0100;
759
       DMA_bar  <= 'H1;
760
       DMA_ds_is_Last  <= 'B1;
761
 
762
     # `T_DELTA
763
       // Initial DMA descriptor
764
       Private_Array[0] <= -1;
765
       Private_Array[1] <= DMA_PA[31:00];       //'H0300;
766
       Private_Array[2] <= DMA_HA[63:32];       // 0;
767
       Private_Array[3] <= DMA_HA[31:00];       // 'H4000;
768
       Private_Array[4] <= DMA_BDA[63:32];      // 0;
769
       Private_Array[5] <= DMA_BDA[31:00];      //'H0BDA0090;
770
       Private_Array[6] <= DMA_Leng;            //'H100;
771
       Private_Array[7] <=  {4'H0
772
                            ,3'H1, DMA_ds_is_Last
773
                            ,3'H0, 1'B1
774
                            ,1'B0, DMA_bar
775
                            ,1'B1
776
                            ,15'H0
777
                            };
778
 
779
 
780
       //  DMA write
781
 
782
       Rx_TLP_Length    <= 'H01;
783
 
784
     # `T_DELTA
785
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
786
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
787
       Hdr_Array[2] <= `C_ADDR_DMA_DS_PAH;
788
 
789
       //  Write PA_H
790
     # `T_DELTA
791
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
792
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
793
       Gap_Insert_Rx;
794
       Gap_Insert_Rx;
795
 
796
       //  Write PA_L
797
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
798
     # `T_DELTA
799
       TLP_Feed_Rx(`USE_PRIVATE, 'H1, `C_BAR0_HIT);
800
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
801
       Gap_Insert_Rx;
802
       Gap_Insert_Rx;
803
 
804
       //  Write HA_H
805
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
806
     # `T_DELTA
807
       TLP_Feed_Rx(`USE_PRIVATE, 'H2, `C_BAR0_HIT);
808
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
809
       Gap_Insert_Rx;
810
       Gap_Insert_Rx;
811
 
812
       //  Write HA_L
813
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
814
     # `T_DELTA
815
       TLP_Feed_Rx(`USE_PRIVATE, 'H3, `C_BAR0_HIT);
816
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
817
       Gap_Insert_Rx;
818
       Gap_Insert_Rx;
819
 
820
       //  Write BDA_H
821
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
822
     # `T_DELTA
823
       TLP_Feed_Rx(`USE_PRIVATE, 'H4, `C_BAR0_HIT);
824
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
825
       Gap_Insert_Rx;
826
       Gap_Insert_Rx;
827
 
828
       //  Write BDA_L
829
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
830
     # `T_DELTA
831
       TLP_Feed_Rx(`USE_PRIVATE, 'H5, `C_BAR0_HIT);
832
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
833
       Gap_Insert_Rx;
834
       Gap_Insert_Rx;
835
 
836
       //  Write LENG
837
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
838
     # `T_DELTA
839
       TLP_Feed_Rx(`USE_PRIVATE, 'H6, `C_BAR0_HIT);
840
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
841
       Gap_Insert_Rx;
842
       Gap_Insert_Rx;
843
 
844
       //  Write CTRL and start the DMA
845
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
846
     # `T_DELTA
847
       TLP_Feed_Rx(`USE_PRIVATE, 'H7, `C_BAR0_HIT);
848
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
849
       Gap_Insert_Rx;
850
       Gap_Insert_Rx;
851
 
852
 
853
     # `T_DELTA     // Polling the DMA status
854
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
855
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
856
       Hdr_Array[2] <= `C_ADDR_DMA_DS_STA;
857
 
858
 
859
     # `T_DELTA
860
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
861
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
862
       Gap_Insert_Rx;
863
 
864
       FSM_Trn          <= 'H18;
865
 
866
 
867
       // feeding the payload CplD
868
       wait (tx_MRd_come);
869
       Gap_Insert_Rx;
870
       tx_MRd_come  <= 'B0;
871
       Tx_MRd_Leng  <= DMA_Leng>>2;
872
       Tx_MRd_Addr  <= DMA_HA[31:0];
873
       tx_MRd_Tag_k <= tx_MRd_Tag;
874
       CplD_Index   <= 'H0;
875
 
876
       Gap_Insert_Rx;
877
       Rx_TLP_Length    <= 'H10;
878
 
879
     # `T_DELTA
880
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
881
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
882
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
883
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
884
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
885
     # `T_DELTA
886
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
887
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
888
       Gap_Insert_Rx;
889
 
890
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
891
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
892
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
893
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
894
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
895
     # `T_DELTA
896
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
897
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
898
//       Gap_Insert_Rx;
899
 
900
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
901
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
902
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
903
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
904
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
905
     # `T_DELTA
906
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
907
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
908
       Gap_Insert_Rx;
909
 
910
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
911
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
912
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
913
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
914
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
915
     # `T_DELTA
916
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
917
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
918
       Gap_Insert_Rx;
919
 
920
 
921
       Rx_TLP_Length    <= 'H01;
922
     # `T_DELTA     // Polling the DMA status
923
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
924
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
925
       Hdr_Array[2] <= `C_ADDR_DMA_DS_STA;
926
 
927
 
928
     # `T_DELTA
929
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
930
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
931
       Gap_Insert_Rx;
932
 
933
 
934
       FSM_Trn          <= 'H1C;
935
 
936
     # `T_DMA_INTERVAL
937
       ;
938
 
939
 
940
 
941
       //  DMA read
942
 
943
       Rx_TLP_Length    <= 'H01;
944
 
945
     # `T_DELTA
946
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
947
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
948
       Hdr_Array[2] <= `C_ADDR_DMA_US_PAH;
949
 
950
       //  Write PA_H
951
     # `T_DELTA
952
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
953
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
954
       Gap_Insert_Rx;
955
       Gap_Insert_Rx;
956
 
957
       //  Write PA_L
958
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
959
     # `T_DELTA
960
       TLP_Feed_Rx(`USE_PRIVATE, 'H1, `C_BAR0_HIT);
961
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
962
       Gap_Insert_Rx;
963
       Gap_Insert_Rx;
964
 
965
       //  Write HA_H
966
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
967
     # `T_DELTA
968
       TLP_Feed_Rx(`USE_PRIVATE, 'H2, `C_BAR0_HIT);
969
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
970
       Gap_Insert_Rx;
971
       Gap_Insert_Rx;
972
 
973
       //  Write HA_L
974
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
975
     # `T_DELTA
976
       TLP_Feed_Rx(`USE_PRIVATE, 'H3, `C_BAR0_HIT);
977
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
978
       Gap_Insert_Rx;
979
       Gap_Insert_Rx;
980
 
981
       //  Write BDA_H
982
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
983
     # `T_DELTA
984
       TLP_Feed_Rx(`USE_PRIVATE, 'H4, `C_BAR0_HIT);
985
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
986
       Gap_Insert_Rx;
987
       Gap_Insert_Rx;
988
 
989
       //  Write BDA_L
990
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
991
     # `T_DELTA
992
       TLP_Feed_Rx(`USE_PRIVATE, 'H5, `C_BAR0_HIT);
993
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
994
       Gap_Insert_Rx;
995
       Gap_Insert_Rx;
996
 
997
       //  Write LENG
998
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
999
     # `T_DELTA
1000
       TLP_Feed_Rx(`USE_PRIVATE, 'H6, `C_BAR0_HIT);
1001
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1002
       Gap_Insert_Rx;
1003
       Gap_Insert_Rx;
1004
 
1005
       //  Write CTRL and start the DMA
1006
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1007
     # `T_DELTA
1008
       TLP_Feed_Rx(`USE_PRIVATE, 'H7, `C_BAR0_HIT);
1009
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1010
       Gap_Insert_Rx;
1011
       Gap_Insert_Rx;
1012
 
1013
 
1014
       Rx_TLP_Length    <= 'H01;
1015
     # `T_DELTA     // Polling the DMA status
1016
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
1017
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
1018
       Hdr_Array[2] <= `C_ADDR_DMA_US_STA;
1019
 
1020
 
1021
     # `T_DELTA
1022
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1023
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
1024
       Gap_Insert_Rx;
1025
 
1026
       FSM_Trn          <= 'H20;
1027
 
1028
     # (`T_DMA_INTERVAL*4)
1029
       ;
1030
 
1031
 
1032
  //////////////////////////////////////////////////////////////////////////////////
1033
 
1034
       Rx_TLP_Length    <= 'H01;
1035
     # `T_DELTA    // reset downstream DMA channel
1036
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
1037
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
1038
       Hdr_Array[2] <= `C_ADDR_DMA_DS_CTRL;
1039
       Private_Array[0] <= `C_DMA_RST_CMD;
1040
 
1041
     # `T_DELTA
1042
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1043
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1044
       Gap_Insert_Rx;
1045
 
1046
       Rx_TLP_Length    <= 'H01;
1047
     # `T_DELTA    // reset upstream DMA channel
1048
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
1049
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
1050
       Hdr_Array[2] <= `C_ADDR_DMA_US_CTRL;
1051
       Private_Array[0] <= `C_DMA_RST_CMD;
1052
 
1053
     # `T_DELTA
1054
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1055
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1056
       Gap_Insert_Rx;
1057
 
1058
  //////////////////////////////////////////////////////////////////////////////////
1059
 
1060
 
1061
       FSM_Trn          <= 'H24;
1062
 
1063
 
1064
     # `T_PIO_INTERVAL
1065
       ;
1066
 
1067
 
1068
 
1069
    //  ///////////////////////////////////////////////////////////////////
1070
    //  DMA write & read BAR[2]
1071
    //  Multiple-descriptor case
1072
    //  
1073
 
1074
       DMA_PA   <= 'H789ABC;
1075
       DMA_HA   <= 'HDF0000;
1076
       DMA_BDA  <= 'H0BDABDA0;
1077
                 DMA_Leng <= 'H0208;
1078
     # `T_DELTA
1079
                 DMA_L1   <= 'H0100;
1080
     # `T_DELTA
1081
                 DMA_L2   <= DMA_Leng - DMA_L1;
1082
       DMA_bar  <= 'H2;
1083
       DMA_ds_is_Last  <= 'B0;
1084
 
1085
     # `T_DELTA
1086
       // Initial DMA descriptor
1087
       Private_Array[0] <= -1;
1088
       Private_Array[1] <= DMA_PA[31:00];
1089
       Private_Array[2] <= DMA_HA[63:32];       // 0;
1090
       Private_Array[3] <= DMA_HA[31:00];
1091
       Private_Array[4] <= DMA_BDA[63:32];      // 0;
1092
       Private_Array[5] <= DMA_BDA[31:00];
1093
       Private_Array[6] <= DMA_L1;
1094
       Private_Array[7] <=  {4'H0
1095
                            ,3'H1, DMA_ds_is_Last
1096
                            ,3'H0, 1'B1
1097
                            ,1'B0, DMA_bar
1098
                            ,1'B1
1099
                            ,15'H0
1100
                            };
1101
 
1102
       Rx_TLP_Length    <= 'H01;
1103
 
1104
     # `T_DELTA
1105
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
1106
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
1107
       Hdr_Array[2] <= `C_ADDR_DMA_DS_PAH;
1108
 
1109
       //  Write PA_H
1110
     # `T_DELTA
1111
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1112
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1113
       Gap_Insert_Rx;
1114
       Gap_Insert_Rx;
1115
 
1116
       //  Write PA_L
1117
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1118
     # `T_DELTA
1119
       TLP_Feed_Rx(`USE_PRIVATE, 'H1, `C_BAR0_HIT);
1120
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1121
       Gap_Insert_Rx;
1122
       Gap_Insert_Rx;
1123
 
1124
       //  Write HA_H
1125
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1126
     # `T_DELTA
1127
       TLP_Feed_Rx(`USE_PRIVATE, 'H2, `C_BAR0_HIT);
1128
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1129
       Gap_Insert_Rx;
1130
       Gap_Insert_Rx;
1131
 
1132
       //  Write HA_L
1133
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1134
     # `T_DELTA
1135
       TLP_Feed_Rx(`USE_PRIVATE, 'H3, `C_BAR0_HIT);
1136
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1137
       Gap_Insert_Rx;
1138
       Gap_Insert_Rx;
1139
 
1140
       //  Write BDA_H
1141
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1142
     # `T_DELTA
1143
       TLP_Feed_Rx(`USE_PRIVATE, 'H4, `C_BAR0_HIT);
1144
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1145
       Gap_Insert_Rx;
1146
       Gap_Insert_Rx;
1147
 
1148
       //  Write BDA_L
1149
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1150
     # `T_DELTA
1151
       TLP_Feed_Rx(`USE_PRIVATE, 'H5, `C_BAR0_HIT);
1152
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1153
       Gap_Insert_Rx;
1154
       Gap_Insert_Rx;
1155
 
1156
       //  Write LENG
1157
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1158
     # `T_DELTA
1159
       TLP_Feed_Rx(`USE_PRIVATE, 'H6, `C_BAR0_HIT);
1160
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1161
       Gap_Insert_Rx;
1162
       Gap_Insert_Rx;
1163
 
1164
       //  Write CTRL and start the DMA
1165
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1166
     # `T_DELTA
1167
       TLP_Feed_Rx(`USE_PRIVATE, 'H7, `C_BAR0_HIT);
1168
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1169
       Gap_Insert_Rx;
1170
       Gap_Insert_Rx;
1171
 
1172
 
1173
       FSM_Trn          <= 'H28;
1174
 
1175
 
1176
       // feeding the descriptor CplD
1177
       wait (Desc_tx_MRd_Valid);
1178
       Gap_Insert_Rx;
1179
       Desc_tx_MRd_Valid <= 'B0;
1180
       DMA_ds_is_Last    <= 'B1;
1181
       Gap_Insert_Rx;
1182
 
1183
       // Initial DMA descriptor
1184
       Private_Array[0] <= 0;
1185
       Private_Array[1] <= DMA_PA[31:00] + 'H500;
1186
       Private_Array[2] <= DMA_HA[63:32];          // 0;
1187
       Private_Array[3] <= DMA_HA[31:00] + 'H500;
1188
       Private_Array[4] <= -1;                     // dont-care
1189
       Private_Array[5] <= -1;                     // dont-care
1190
       Private_Array[6] <= DMA_L2;
1191
       Private_Array[7] <=  {4'H0
1192
                            ,3'H1, DMA_ds_is_Last
1193
                            ,3'H0, 1'B1
1194
                            ,1'B0, DMA_bar
1195
                            ,1'B1
1196
                            ,15'H0
1197
                            };
1198
 
1199
       Rx_TLP_Length    <= 'H08;
1200
       Gap_Insert_Rx;
1201
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1202
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Rx_TLP_Length[9:0], 2'b00};
1203
       Hdr_Array[2] <= {localID, Desc_tx_MRd_TAG, 1'b0, DMA_BDA[6:0]};
1204
     # `T_DELTA
1205
       TLP_Feed_Rx(`USE_PRIVATE, 0, `C_NO_BAR_HIT);
1206
       Gap_Insert_Rx;
1207
 
1208
 
1209
       // feeding the payload CplD
1210
       wait (tx_MRd_come);
1211
       Gap_Insert_Rx;
1212
       tx_MRd_come  <= 'B0;
1213
       Tx_MRd_Leng  <= DMA_L1>>2;
1214
       Tx_MRd_Addr  <= DMA_HA[31:0];
1215
       tx_MRd_Tag_k <= tx_MRd_Tag;
1216
       CplD_Index   <= 'H0;
1217
 
1218
       Gap_Insert_Rx;
1219
       Rx_TLP_Length    <= 'H10;
1220
 
1221
     # `T_DELTA
1222
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1223
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1224
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1225
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1226
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1227
     # `T_DELTA
1228
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1229
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1230
       Gap_Insert_Rx;
1231
 
1232
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1233
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1234
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1235
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1236
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1237
     # `T_DELTA
1238
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1239
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1240
//       Gap_Insert_Rx;
1241
 
1242
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1243
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1244
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1245
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1246
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1247
     # `T_DELTA
1248
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1249
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1250
//       Gap_Insert_Rx;
1251
 
1252
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1253
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1254
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1255
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1256
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1257
     # `T_DELTA
1258
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1259
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1260
       Gap_Insert_Rx;
1261
 
1262
 
1263
       Rx_TLP_Length    <= 'H01;
1264
     # `T_DELTA     // Polling the DMA status
1265
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
1266
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
1267
       Hdr_Array[2] <= `C_ADDR_DMA_DS_STA;
1268
 
1269
 
1270
     # `T_DELTA
1271
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1272
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
1273
       Gap_Insert_Rx;
1274
 
1275
 
1276
       FSM_Trn          <= 'H2C;
1277
 
1278
 
1279
       // feeding the payload CplD (2nd descriptor)
1280
       wait (tx_MRd_come);
1281
       Gap_Insert_Rx;
1282
       tx_MRd_come  <= 'B0;
1283
       Tx_MRd_Leng  <= (DMA_L2>>2) - 'H2;
1284
       Tx_MRd_Addr  <= DMA_HA[31:0] + 'H500;
1285
       tx_MRd_Tag_k <= tx_MRd_Tag_k + 'H1;
1286
       CplD_Index   <= 'H40;
1287
 
1288
       Gap_Insert_Rx;
1289
       Rx_TLP_Length    <= 'H10;
1290
 
1291
     # `T_DELTA
1292
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1293
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1294
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1295
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1296
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1297
     # `T_DELTA
1298
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1299
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1300
       Gap_Insert_Rx;
1301
 
1302
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1303
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1304
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1305
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1306
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1307
     # `T_DELTA
1308
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1309
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1310
//       Gap_Insert_Rx;
1311
 
1312
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1313
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1314
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1315
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1316
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1317
     # `T_DELTA
1318
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1319
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1320
       Gap_Insert_Rx;
1321
 
1322
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1323
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1324
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1325
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1326
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1327
     # `T_DELTA
1328
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1329
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1330
       Gap_Insert_Rx;
1331
 
1332
       Rx_TLP_Length    <= 'H02;
1333
       Tx_MRd_Leng      <= 'H2;
1334
       tx_MRd_Tag_k     <= tx_MRd_Tag_k + 'H1;
1335
     # `T_DELTA
1336
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1337
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Tx_MRd_Leng[9:0], 2'b00};
1338
       Hdr_Array[2] <= {localID, tx_MRd_Tag_k, 1'b0, Tx_MRd_Addr[6:0]};
1339
       Tx_MRd_Leng  <= Tx_MRd_Leng - Rx_TLP_Length;
1340
       Tx_MRd_Addr  <= Tx_MRd_Addr + Rx_TLP_Length;
1341
     # `T_DELTA
1342
       TLP_Feed_Rx(`USE_PUBLIC, CplD_Index, `C_NO_BAR_HIT);
1343
       CplD_Index   <= CplD_Index + Rx_TLP_Length;
1344
       Gap_Insert_Rx;
1345
 
1346
       FSM_Trn          <= 'H30;
1347
 
1348
 
1349
 
1350
     # (`T_DMA_INTERVAL*2)
1351
       ;
1352
 
1353
       DMA_us_is_Last   <= 'B0;
1354
     # `T_DELTA
1355
       //  DMA read
1356
       Private_Array[0] <= 0;
1357
       Private_Array[1] <= DMA_PA[31:00];
1358
       Private_Array[2] <= DMA_HA[63:32];          // 0;
1359
       Private_Array[3] <= DMA_HA[31:00];
1360
       Private_Array[4] <= DMA_BDA[63:32];         // 0;
1361
       Private_Array[5] <= DMA_BDA[31:00] + 'H10000;
1362
       Private_Array[6] <= DMA_L1;
1363
       Private_Array[7] <=  {4'H0
1364
                            ,3'H1, DMA_us_is_Last
1365
                            ,3'H0, 1'B1
1366
                            ,1'B0, DMA_bar
1367
                            ,1'B1
1368
                            ,15'H0
1369
                            };
1370
       Rx_TLP_Length    <= 'H01;
1371
 
1372
     # `T_DELTA
1373
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
1374
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
1375
       Hdr_Array[2] <= `C_ADDR_DMA_US_PAH;
1376
 
1377
       //  Write PA_H
1378
     # `T_DELTA
1379
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1380
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1381
       Gap_Insert_Rx;
1382
       Gap_Insert_Rx;
1383
 
1384
       //  Write PA_L
1385
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1386
     # `T_DELTA
1387
       TLP_Feed_Rx(`USE_PRIVATE, 'H1, `C_BAR0_HIT);
1388
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1389
       Gap_Insert_Rx;
1390
       Gap_Insert_Rx;
1391
 
1392
       //  Write HA_H
1393
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1394
     # `T_DELTA
1395
       TLP_Feed_Rx(`USE_PRIVATE, 'H2, `C_BAR0_HIT);
1396
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1397
       Gap_Insert_Rx;
1398
       Gap_Insert_Rx;
1399
 
1400
       //  Write HA_L
1401
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1402
     # `T_DELTA
1403
       TLP_Feed_Rx(`USE_PRIVATE, 'H3, `C_BAR0_HIT);
1404
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1405
       Gap_Insert_Rx;
1406
       Gap_Insert_Rx;
1407
 
1408
       //  Write BDA_H
1409
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1410
     # `T_DELTA
1411
       TLP_Feed_Rx(`USE_PRIVATE, 'H4, `C_BAR0_HIT);
1412
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1413
       Gap_Insert_Rx;
1414
       Gap_Insert_Rx;
1415
 
1416
       //  Write BDA_L
1417
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1418
     # `T_DELTA
1419
       TLP_Feed_Rx(`USE_PRIVATE, 'H5, `C_BAR0_HIT);
1420
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1421
       Gap_Insert_Rx;
1422
       Gap_Insert_Rx;
1423
 
1424
       //  Write LENG
1425
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1426
     # `T_DELTA
1427
       TLP_Feed_Rx(`USE_PRIVATE, 'H6, `C_BAR0_HIT);
1428
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1429
       Gap_Insert_Rx;
1430
       Gap_Insert_Rx;
1431
 
1432
       //  Write CTRL and start the DMA
1433
       Hdr_Array[2] <= Hdr_Array[2] + 'H4;
1434
     # `T_DELTA
1435
       TLP_Feed_Rx(`USE_PRIVATE, 'H7, `C_BAR0_HIT);
1436
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1437
       Gap_Insert_Rx;
1438
       Gap_Insert_Rx;
1439
 
1440
 
1441
       Rx_TLP_Length    <= 'H01;
1442
     # `T_DELTA     // Polling the DMA status
1443
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
1444
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
1445
       Hdr_Array[2] <= `C_ADDR_DMA_US_STA;
1446
 
1447
 
1448
     # `T_DELTA
1449
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1450
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
1451
       Gap_Insert_Rx;
1452
 
1453
       FSM_Trn          <= 'H34;
1454
 
1455
 
1456
       // feeding the descriptor CplD
1457
       wait (Desc_tx_MRd_Valid);
1458
       Gap_Insert_Rx;
1459
       Desc_tx_MRd_Valid <= 'B0;
1460
       DMA_us_is_Last    <= 'B1;
1461
       Gap_Insert_Rx;
1462
 
1463
       // Initial DMA descriptor
1464
       Private_Array[0] <= 0;
1465
       Private_Array[1] <= DMA_PA[31:00] + 'H500;
1466
       Private_Array[2] <= DMA_HA[63:32];          // 0;
1467
       Private_Array[3] <= DMA_HA[31:00] + 'H500;
1468
       Private_Array[4] <= -1;                     // dont-care
1469
       Private_Array[5] <= -1;                     // dont-care
1470
       Private_Array[6] <= DMA_L2;
1471
       Private_Array[7] <=  {4'H0
1472
                            ,3'H1, DMA_us_is_Last
1473
                            ,3'H0, 1'B1
1474
                            ,1'B0, DMA_bar
1475
                            ,1'B1
1476
                            ,15'H0
1477
                            };
1478
 
1479
       Rx_TLP_Length    <= 'H08;
1480
       Gap_Insert_Rx;
1481
       Hdr_Array[0] <= `HEADER0_CPLD | Rx_TLP_Length[9:0];
1482
       Hdr_Array[1] <= {`C_HOST_CPLD_ID, 4'H0, Rx_TLP_Length[9:0], 2'b00};
1483
       Hdr_Array[2] <= {localID, Desc_tx_MRd_TAG, 1'b0, DMA_BDA[6:0]};
1484
     # `T_DELTA
1485
       TLP_Feed_Rx(`USE_PRIVATE, 0, `C_NO_BAR_HIT);
1486
       Gap_Insert_Rx;
1487
 
1488
 
1489
       Rx_TLP_Length    <= 'H01;
1490
     # `T_DELTA     // Polling the DMA status
1491
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
1492
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
1493
       Hdr_Array[2] <= `C_ADDR_DMA_US_STA;
1494
 
1495
 
1496
     # `T_DELTA
1497
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1498
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
1499
       Gap_Insert_Rx;
1500
 
1501
 
1502
     # (`T_DMA_INTERVAL*4)
1503
       ;
1504
 
1505
       Rx_TLP_Length    <= 'H01;
1506
     # `T_DELTA     // Polling the DMA status
1507
       Hdr_Array[0] <= `HEADER0_MRD3_ | Rx_TLP_Length[9:0];
1508
       Hdr_Array[1] <= {`C_HOST_RDREQ_ID, 3'H3, Rx_MRd_Tag, 4'Hf, 4'Hf};
1509
       Hdr_Array[2] <= `C_ADDR_DMA_US_STA;
1510
 
1511
 
1512
     # `T_DELTA
1513
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1514
       Rx_MRd_Tag       <= Rx_MRd_Tag + 1;
1515
       Gap_Insert_Rx;
1516
 
1517
       FSM_Trn          <= 'H38;
1518
 
1519
     # (`T_DMA_INTERVAL*4)
1520
       ;
1521
 
1522
 
1523
  //////////////////////////////////////////////////////////////////////////////////
1524
 
1525
       Rx_TLP_Length    <= 'H01;
1526
     # `T_DELTA    // reset downstream DMA channel
1527
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
1528
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
1529
       Hdr_Array[2] <= `C_ADDR_DMA_DS_CTRL;
1530
       Private_Array[0] <= `C_DMA_RST_CMD;
1531
 
1532
     # `T_DELTA
1533
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1534
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1535
       Gap_Insert_Rx;
1536
 
1537
       Rx_TLP_Length    <= 'H01;
1538
     # `T_DELTA    // reset upstream DMA channel
1539
       Hdr_Array[0] <= `HEADER0_MWR3_ | Rx_TLP_Length[9:0];
1540
       Hdr_Array[1] <= {`C_HOST_WRREQ_ID, Rx_MWr_Tag, 4'Hf, 4'Hf};
1541
       Hdr_Array[2] <= `C_ADDR_DMA_US_CTRL;
1542
       Private_Array[0] <= `C_DMA_RST_CMD;
1543
 
1544
     # `T_DELTA
1545
       TLP_Feed_Rx(`USE_PRIVATE, 'H0, `C_BAR0_HIT);
1546
       Rx_MWr_Tag   <= Rx_MWr_Tag + 1;
1547
       Gap_Insert_Rx;
1548
 
1549
  //////////////////////////////////////////////////////////////////////////////////
1550
 
1551
 
1552
       FSM_Trn          <= 'H40;
1553
 
1554
 
1555
  end
1556
 
1557
 
1558
 
1559
 
1560
// ========================================== //
1561
//         Checking and verification          //
1562
//                                            //
1563
   reg           Err_signal;
1564
//                                            //
1565
//                                            //
1566
// ========================================== //
1567
 
1568
   // TLP format check out Rx
1569
   //  in case stimuli incorrect: verification over verification
1570
   reg [ 7: 0]   FSM_Rx_Fmt;
1571
   reg [10: 0]   rxchk_TLP_Length;
1572
   reg           rxchk_TLP_Has_Data;
1573
   reg           rxchk_TLP_4DW_Hdr;
1574
   reg           rxchk_Mem_TLP;
1575
   always @(negedge trn_clk )
1576
   if (!trn_reset_n) begin
1577
      FSM_Rx_Fmt      <= 0;
1578
   end
1579
   else begin
1580
 
1581
      case (FSM_Rx_Fmt)
1582
 
1583
        'H00: begin
1584
            FSM_Rx_Fmt    <= 'H010;
1585
         end
1586
 
1587
        'H10: begin
1588
            if ( trn_rsrc_rdy_n | trn_rdst_rdy_n) begin
1589
              FSM_Rx_Fmt        <= 'H10;
1590
            end
1591
            else if (~trn_reof_n) begin
1592
                  $display ("\n %t:\n !! Unexpected trn_reof_n !!", $time);
1593
                  Err_signal <= 1;
1594
            end
1595
            else if (~trn_rsof_n&trn_reof_n) begin
1596
                rxchk_TLP_Has_Data    <= trn_rd[30+32];
1597
                rxchk_TLP_4DW_Hdr     <= trn_rd[29+32];
1598
                rxchk_TLP_Length[10]  <= (trn_rd[9+32:0+32]=='H0);
1599
                rxchk_TLP_Length[9:0] <= trn_rd[9+32:0+32];
1600
                if (trn_rd[28+32:25+32]) rxchk_Mem_TLP    <= 0;    // Msg or MsgD
1601
                else                     rxchk_Mem_TLP    <= 1;    // MWr, MRd or Cpl/D
1602
                FSM_Rx_Fmt        <= 'H12;
1603
            end
1604
            else begin
1605
                $display ("\n %t:\n !! trn_rsof_n error!", $time);
1606
                Err_signal <= 1;
1607
            end
1608
         end
1609
 
1610
 
1611
        'H12: begin
1612
            if ( trn_rsrc_rdy_n | trn_rdst_rdy_n) begin
1613
              FSM_Rx_Fmt        <= 'H12;
1614
            end
1615
            else if (!trn_rsof_n) begin
1616
              $display ("\n %t:\n !! trn_rsof_n error! should be 1.", $time);
1617
              Err_signal <= 1;
1618
            end
1619
            else begin
1620
              if (rxchk_TLP_4DW_Hdr & rxchk_TLP_Has_Data) begin
1621
                if (trn_reof_n) begin
1622
                  Err_signal <= 0;
1623
                  FSM_Rx_Fmt        <= 'H20;
1624
                end
1625
                else begin
1626
                  Err_signal <= 1;
1627
                  $display ("\n %t:\n !! trn_reof_n error (4-Header, with Payload)! should be 1.", $time);
1628
                end
1629
              end
1630
              else if (rxchk_TLP_4DW_Hdr & !rxchk_TLP_Has_Data) begin
1631
                if (trn_reof_n) begin
1632
                  Err_signal <= 1;
1633
                  $display ("\n %t:\n !! trn_reof_n error (4-Header, no Payload)! should be 0.", $time);
1634
                end
1635
                else if (trn_rrem_n=='H00) begin
1636
                    Err_signal <= 0;
1637
                    FSM_Rx_Fmt        <= 'H10;
1638
                end
1639
                else begin
1640
                    Err_signal <= 1;
1641
                    $display ("\n %t:\n !! trn_rrem_n error (4-Header, no Payload)!", $time);
1642
                end
1643
              end
1644
              else if (!rxchk_TLP_4DW_Hdr & !rxchk_TLP_Has_Data) begin
1645
                if (trn_reof_n) begin
1646
                  Err_signal <= 1;
1647
                  $display ("\n %t:\n !! trn_reof_n error (3-Header, with Payload)! should be 0.", $time);
1648
                end
1649
                else if (trn_rrem_n=='H0f) begin
1650
                  Err_signal <= 0;
1651
                  FSM_Rx_Fmt        <= 'H10;
1652
                end
1653
                else begin
1654
                  Err_signal <= 1;
1655
                  $display ("\n %t:\n !! trn_rrem_n error (3-Header, no Payload)!", $time);
1656
                end
1657
              end
1658
              else if (rxchk_TLP_Length=='H1) begin  // (!rxchk_TLP_4DW_Hdr & rxchk_TLP_Has_Data)
1659
                if (trn_reof_n) begin
1660
                  Err_signal <= 1;
1661
                  $display ("\n %t:\n !! trn_reof_n error (3-Header, with Payload)! should be 0.", $time);
1662
                end
1663
                else if (trn_rrem_n=='H00) begin
1664
                  Err_signal <= 0;
1665
                  FSM_Rx_Fmt        <= 'H10;
1666
                end
1667
                else begin
1668
                  Err_signal <= 1;
1669
                  $display ("\n %t:\n !! trn_rrem_n error (3-Header, no Payload)!", $time);
1670
                end
1671
              end
1672
              else begin  // (!rxchk_TLP_4DW_Hdr & rxchk_TLP_Has_Data) & (rxchk_TLP_Length>'H1)
1673
                if (trn_reof_n) begin
1674
                  Err_signal <= 0;
1675
                  rxchk_TLP_Length      <= rxchk_TLP_Length - 1;
1676
                  FSM_Rx_Fmt        <= 'H20;
1677
                end
1678
                else begin
1679
                  Err_signal <= 1;
1680
                  $display ("\n %t:\n !! trn_reof_n error (3-Header, no Payload)! should be 1.", $time);
1681
                end
1682
              end
1683
 
1684
              // Address-Length combination check
1685
              if (rxchk_TLP_4DW_Hdr) begin
1686
                if (({1'b0, trn_rd[11:2]} + rxchk_TLP_Length[9:0])>11'H400) begin
1687
                  $display ("\n\n %t:\n !! Rx 4KB straddled !!", $time);
1688
                  $display ("\n Address=%08X  Length=%04X (%04X bytes)\n\n", trn_rd[31:0], rxchk_TLP_Length, rxchk_TLP_Length<<2);
1689
//                  Err_signal <= 1;
1690
                end
1691
                if (trn_rd[63:32]=='H0 && rxchk_Mem_TLP==1) begin
1692
                  $display ("\n %t:\n !! Rx TLP should not be 4-DW headher !!", $time);
1693
                  Err_signal <= 1;
1694
                end
1695
              end
1696
              else begin
1697
                if (({1'b0, trn_rd[11+32:2+32]} + rxchk_TLP_Length[9:0])>11'H400) begin
1698
                  $display ("\n\n %t:\n !! Rx 4KB straddled !!", $time);
1699
                  $display ("\n Address=%08X  Length=%04X (%04X bytes)\n\n", trn_rd[63:32], rxchk_TLP_Length, rxchk_TLP_Length<<2);
1700
//                  Err_signal <= 1;
1701
                end
1702
              end
1703
            end
1704
          end
1705
 
1706
 
1707
        'H20: begin
1708
            if ( trn_rsrc_rdy_n | trn_rdst_rdy_n) begin
1709
              FSM_Rx_Fmt        <= 'H20;
1710
            end
1711
            else if (rxchk_TLP_Length==2) begin
1712
              if (trn_rrem_n=='H00 && trn_reof_n==0) begin
1713
                FSM_Rx_Fmt        <= 'H10;
1714
              end
1715
              else begin
1716
                $display ("\n %t:\n !! trn_reof_n/trn_rrem_n error !!", $time);
1717
                Err_signal <= 1;
1718
              end
1719
            end
1720
            else if (rxchk_TLP_Length==1) begin
1721
              if (trn_rrem_n=='H0f && trn_reof_n==0) begin
1722
                FSM_Rx_Fmt        <= 'H10;
1723
              end
1724
              else begin
1725
                $display ("\n %t:\n !! trn_reof_n/trn_rrem_n error !!", $time);
1726
                Err_signal <= 1;
1727
              end
1728
            end
1729
            else if (rxchk_TLP_Length==0) begin
1730
              $display ("\n %t:\n !! Rx TLP Length error !!", $time);
1731
              Err_signal <= 1;
1732
            end
1733
            else if (!trn_reof_n) begin
1734
              $display ("\n %t:\n !! trn_reof_n too early !!", $time);
1735
              Err_signal <= 1;
1736
            end
1737
            else begin
1738
              rxchk_TLP_Length      <= rxchk_TLP_Length - 2;
1739
              FSM_Rx_Fmt        <= 'H20;
1740
            end
1741
         end
1742
 
1743
        default: begin
1744
           FSM_Rx_Fmt     <= 'H00;
1745
         end
1746
 
1747
      endcase
1748
   end
1749
 
1750
 
1751
 
1752
 
1753
   // TLP format check by Tx
1754
   reg [ 7: 0]   FSM_TLP_Fmt;
1755
   reg [10: 0]   tx_TLP_Length;
1756
   reg [12: 0]   tx_TLP_Address;
1757
   reg           tx_TLP_Has_Data;
1758
   reg           tx_TLP_is_CplD;
1759
   reg           tx_TLP_4DW_Hdr;
1760
   reg           tx_Mem_TLP;
1761
   always @(negedge trn_clk )
1762
   if (!trn_reset_n) begin
1763
      FSM_TLP_Fmt      <= 0;
1764
   end
1765
   else begin
1766
 
1767
      case (FSM_TLP_Fmt)
1768
 
1769
        'H00: begin
1770
            FSM_TLP_Fmt    <= 'H010;
1771
         end
1772
 
1773
        'H10: begin
1774
            if ( trn_tsrc_rdy_n | trn_tdst_rdy_n) begin
1775
              FSM_TLP_Fmt        <= 'H10;
1776
            end
1777
            else if (~trn_teof_n) begin
1778
                  $display ("\n %t:\n !! Unexpected trn_teof_n !!", $time);
1779
                  Err_signal <= 1;
1780
            end
1781
            else if (~trn_tsof_n&trn_teof_n) begin
1782
                tx_TLP_Has_Data    <= trn_td[30+32];
1783
                tx_TLP_4DW_Hdr     <= trn_td[29+32];
1784
                tx_TLP_Length[10]  <= (trn_td[9+32:0+32]=='H0);
1785
                tx_TLP_Length[9:0] <= trn_td[9+32:0+32];
1786
                tx_TLP_is_CplD     <= trn_td[27+32];
1787
                if (trn_td[28+32:25+32]) tx_Mem_TLP    <= 0;    // Msg or MsgD
1788
                else                     tx_Mem_TLP    <= 1;    // MWr, MRd or Cpl/D
1789
                FSM_TLP_Fmt        <= 'H12;
1790
                if (trn_td[31:16] == localID) begin
1791
                   Err_signal <= 0;
1792
                end
1793
                else begin
1794
                   $display ("\n %t:\n !! Tx Bad TLP ReqID for TLP !!", $time);
1795
                   Err_signal <= 1;
1796
                end
1797
            end
1798
            else begin
1799
                $display ("\n %t:\n !! trn_tsof_n error!", $time);
1800
                Err_signal <= 1;
1801
            end
1802
         end
1803
 
1804
 
1805
        'H12: begin
1806
            if ( trn_tsrc_rdy_n | trn_tdst_rdy_n) begin
1807
              FSM_TLP_Fmt        <= 'H12;
1808
            end
1809
            else if (!trn_tsof_n) begin
1810
              $display ("\n %t:\n !! trn_tsof_n error! should be 1.", $time);
1811
              Err_signal <= 1;
1812
            end
1813
            else begin
1814
              if (tx_TLP_4DW_Hdr & tx_TLP_Has_Data) begin
1815
                if (trn_teof_n) begin
1816
                  Err_signal   <= 0;
1817
                  FSM_TLP_Fmt        <= 'H20;
1818
                end
1819
                else begin
1820
                  Err_signal   <= 1;
1821
                  $display ("\n %t:\n !! trn_teof_n error (4-Header, with Payload)! should be 1.", $time);
1822
                end
1823
              end
1824
              else if (tx_TLP_4DW_Hdr & !tx_TLP_Has_Data) begin
1825
                if (trn_teof_n) begin
1826
                  Err_signal <= 1;
1827
                  $display ("\n %t:\n !! trn_teof_n error (4-Header, no Payload)! should be 0.", $time);
1828
                end
1829
                else if (trn_trem_n=='H00) begin
1830
                    Err_signal <= 0;
1831
                    FSM_TLP_Fmt        <= 'H10;
1832
                end
1833
                else begin
1834
                    Err_signal <= 1;
1835
                    $display ("\n %t:\n !! trn_trem_n error (4-Header, no Payload)!", $time);
1836
                end
1837
              end
1838
              else if (!tx_TLP_4DW_Hdr & !tx_TLP_Has_Data) begin
1839
                if (trn_teof_n) begin
1840
                  Err_signal <= 1;
1841
                  $display ("\n %t:\n !! trn_teof_n error (3-Header, with Payload)! should be 0.", $time);
1842
                end
1843
                else if (trn_trem_n=='H0f) begin
1844
                  Err_signal <= 0;
1845
                  FSM_TLP_Fmt        <= 'H10;
1846
                end
1847
                else begin
1848
                  Err_signal <= 1;
1849
                  $display ("\n %t:\n !! trn_trem_n error (3-Header, no Payload)!", $time);
1850
                end
1851
              end
1852
              else if (tx_TLP_Length=='H1) begin  // (!tx_TLP_4DW_Hdr & tx_TLP_Has_Data)
1853
                if (trn_teof_n) begin
1854
                  Err_signal <= 1;
1855
                  $display ("\n %t:\n !! trn_teof_n error (3-Header, with Payload)! should be 0.", $time);
1856
                end
1857
                else if (trn_trem_n=='H00) begin
1858
                  if (tx_TLP_is_CplD && (trn_td[31+32:16+32]==`C_HOST_RDREQ_ID)) begin
1859
                    Err_signal    <= 0;
1860
                    FSM_TLP_Fmt      <= 'H10;
1861
                  end
1862
                  else if (tx_TLP_is_CplD) begin
1863
                    Err_signal   <= 1;
1864
                    $display ("\n %t:\n !! Tx CplD Requester ID Wrong (TLP Length ==1 )!! ", $time);
1865
                    FSM_TLP_Fmt      <= 'H10;
1866
                  end
1867
                  else begin
1868
                    Err_signal    <= 0;
1869
                    FSM_TLP_Fmt      <= 'H10;
1870
                  end
1871
                end
1872
                else begin
1873
                  Err_signal <= 1;
1874
                  $display ("\n %t:\n !! trn_trem_n error (3-Header, no Payload)!", $time);
1875
                end
1876
              end
1877
              else begin  // (!tx_TLP_4DW_Hdr & tx_TLP_Has_Data) & (tx_TLP_Length>'H1)
1878
                if (trn_teof_n) begin
1879
                  if (tx_TLP_is_CplD && (trn_td[31+32:16+32]==`C_HOST_RDREQ_ID)) begin
1880
                    tx_TLP_Length      <= tx_TLP_Length - 1;
1881
                    FSM_TLP_Fmt        <= 'H20;
1882
                  end
1883
                  else if (tx_TLP_is_CplD) begin
1884
                    Err_signal   <= 1;
1885
                    $display ("\n %t:\n !! Tx CplD Requester ID Wrong (TLP Length !=1 )!! ", $time);
1886
                    FSM_TLP_Fmt        <= 'H20;
1887
                  end
1888
                  else begin
1889
                    tx_TLP_Length      <= tx_TLP_Length - 1;
1890
                    FSM_TLP_Fmt        <= 'H20;
1891
                  end
1892
                end
1893
                else begin
1894
                  Err_signal <= 1;
1895
                  $display ("\n %t:\n !! trn_teof_n error (3-Header, no Payload)! should be 1.", $time);
1896
                end
1897
              end
1898
 
1899
              // Address-Length combination check
1900
              if (tx_TLP_4DW_Hdr) begin
1901
                if (({1'b0, trn_td[11:2]} + tx_TLP_Length[9:0])>11'H400) begin
1902
                  $display ("\n %t:\n !! Tx 4KB straddled !!", $time);
1903
                  $display ("\n Address=%08X  Length=%04X (%04X bytes)\n", trn_td[31:0], tx_TLP_Length, tx_TLP_Length<<2);
1904
                  Err_signal <= 1;
1905
                end
1906
                if (trn_td[63:32]=='H0 && tx_Mem_TLP==1) begin
1907
                  $display ("\n %t:\n !! Tx TLP should not be 4-DW headher !!", $time);
1908
                  Err_signal <= 1;
1909
                end
1910
              end
1911
              else begin
1912
                if (({1'b0, trn_td[11+32:2+32]} + tx_TLP_Length[9:0])>11'H400) begin
1913
                  $display ("\n %t:\n !! Tx 4KB straddled !!", $time);
1914
                  $display ("\n Address=%08X  Length=%04X (%04X bytes)\n", trn_td[63:32], tx_TLP_Length, tx_TLP_Length<<2);
1915
                  Err_signal <= 1;
1916
                end
1917
              end
1918
 
1919
            end
1920
          end
1921
 
1922
 
1923
        'H20: begin
1924
            if ( trn_tsrc_rdy_n | trn_tdst_rdy_n) begin
1925
              FSM_TLP_Fmt        <= 'H20;
1926
            end
1927
            else if (tx_TLP_Length==2) begin
1928
              if (trn_trem_n=='H00 && trn_teof_n==0) begin
1929
                FSM_TLP_Fmt        <= 'H10;
1930
              end
1931
              else begin
1932
                $display ("\n %t:\n !! trn_teof_n/trn_trem_n error !!\n", $time);
1933
                Err_signal <= 1;
1934
              end
1935
            end
1936
            else if (tx_TLP_Length==1) begin
1937
              if (trn_trem_n=='H0f && trn_teof_n==0) begin
1938
                FSM_TLP_Fmt        <= 'H10;
1939
              end
1940
              else begin
1941
                $display ("\n %t:\n !! trn_teof_n/trn_trem_n error !!\n", $time);
1942
                Err_signal <= 1;
1943
              end
1944
            end
1945
            else if (tx_TLP_Length==0) begin
1946
              $display ("\n %t:\n !! Tx TLP Length error !!", $time);
1947
              Err_signal <= 1;
1948
            end
1949
            else if (!trn_teof_n) begin
1950
              $display ("\n %t:\n !! trn_teof_n too early !!", $time);
1951
              Err_signal <= 1;
1952
            end
1953
            else begin
1954
              tx_TLP_Length      <= tx_TLP_Length - 2;
1955
              FSM_TLP_Fmt        <= 'H20;
1956
            end
1957
         end
1958
 
1959
        default: begin
1960
           FSM_TLP_Fmt     <= 'H00;
1961
         end
1962
 
1963
      endcase
1964
   end
1965
 
1966
 
1967
 
1968
 
1969
   //************************************************//
1970
   //************************************************//
1971
   //************************************************//
1972
 
1973
   reg  [ 7:00] FSM_Tx_Desc_MRd;
1974
  // Descriptors MRd
1975
   always @(negedge trn_clk )
1976
   if (!trn_reset_n) begin
1977
      FSM_Tx_Desc_MRd        <= 0;
1978
      Desc_tx_MRd_Valid      <= 0;
1979
   end
1980
   else begin
1981
 
1982
      case (FSM_Tx_Desc_MRd)
1983
 
1984
        'H00: begin
1985
            FSM_Tx_Desc_MRd       <= 'H10;
1986
         end
1987
 
1988
        'H10: begin
1989
           case ({ trn_tsrc_rdy_n
1990
                 , trn_tdst_rdy_n
1991
                 , trn_tsof_n
1992
                 , trn_td[15]
1993
                 })
1994
 
1995
             'B0001:
1996
                 if ( (trn_td[31+32:24+32]=='H00 || trn_td[31+32:24+32]=='H20)
1997
                    &&(trn_td[9+32:32]=='H8)) begin
1998
                      Desc_tx_MRd_Leng[10]  <= (trn_td[9+32:32]==0);
1999
                      Desc_tx_MRd_Leng[9:0] <= trn_td[9+32:32];
2000
                      Desc_tx_MRd_TAG       <= trn_td[15:8];
2001
                      FSM_Tx_Desc_MRd <= 'H31;
2002
                 end
2003
                 else begin
2004
                      FSM_Tx_Desc_MRd <= 'H10;
2005
                 end
2006
 
2007
              default: begin
2008
                 FSM_Tx_Desc_MRd <= 'H10;
2009
              end
2010
 
2011
           endcase
2012
         end
2013
 
2014
 
2015
        'H31: begin   // Low 32 bits Address
2016
           if (trn_tsrc_rdy_n|trn_tdst_rdy_n) begin
2017
             FSM_Tx_Desc_MRd   <= 'H31;
2018
           end
2019
           else begin
2020
               Desc_tx_MRd_Addr      <= trn_td[31:00];
2021
               Desc_tx_MRd_Valid     <= 1;
2022
               FSM_Tx_Desc_MRd       <= 'H10;
2023
           end
2024
         end
2025
 
2026
 
2027
        default: begin
2028
           FSM_Tx_Desc_MRd <= 'H00;
2029
         end
2030
 
2031
      endcase
2032
   end
2033
 
2034
 
2035
 
2036
   // DMA MRd out of Tx
2037
   reg [ 7: 0]   FSM_Tx_MRd;
2038
   reg           tx_DMA_MRd_A64b;
2039
   always @(negedge trn_clk )
2040
   if (!trn_reset_n) begin
2041
      FSM_Tx_MRd      <= 0;
2042
      tx_MRd_come     <= 0;
2043
   end
2044
   else begin
2045
 
2046
      case (FSM_Tx_MRd)
2047
 
2048
        'H00: begin
2049
            FSM_Tx_MRd       <= 'H10;
2050
         end
2051
 
2052
        'H10: begin
2053
           case ({ trn_tsrc_rdy_n
2054
                 , trn_tdst_rdy_n
2055
                 , trn_tsof_n
2056
                 , trn_td[15]
2057
                 })
2058
 
2059
             'B0000:
2060
                 case (trn_td[31+32:24+32])
2061
                   'H00: begin   // 3-dw header
2062
                      tx_MRd_Length[9:0] <= trn_td[9+32:32];
2063
                      tx_MRd_Length[10]  <= (trn_td[9+32:32]=='H0)?1:0;
2064
                      tx_MRd_Tag         <= trn_td[15:8];
2065
                      FSM_Tx_MRd         <= 'H30;
2066
                      tx_DMA_MRd_A64b    <= 0;
2067
                    end
2068
 
2069
                   'H20: begin   // 4-dw header
2070
                      tx_MRd_Length[9:0] <= trn_td[9+32:32];
2071
                      tx_MRd_Length[10]  <= (trn_td[9+32:32]=='H0)?1:0;
2072
                      tx_MRd_Tag         <= trn_td[15:8];
2073
                      FSM_Tx_MRd         <= 'H30;
2074
                      tx_DMA_MRd_A64b    <= 1;
2075
                    end
2076
 
2077
                   default: begin
2078
                      FSM_Tx_MRd <= 'H10;   // Idle
2079
                    end
2080
                 endcase
2081
 
2082
              default: begin
2083
                 FSM_Tx_MRd <= 'H10;
2084
              end
2085
 
2086
           endcase
2087
         end
2088
 
2089
 
2090
        'H30: begin
2091
           if (trn_tsrc_rdy_n|trn_tdst_rdy_n) begin
2092
             FSM_Tx_MRd <= 'H30;
2093
           end
2094
           else if( trn_td[1:0]==0) begin
2095
             FSM_Tx_MRd <= 'H10;
2096
             tx_MRd_come <= 'B1;
2097
           end
2098
           else begin
2099
             $display ("\n %t:\n !! Bad TLP Address for Tx MRd !!", $time);
2100
             Err_signal <= 1;
2101
           end
2102
        end
2103
 
2104
        default: begin
2105
           FSM_Tx_MRd <= 'H00;
2106
         end
2107
 
2108
      endcase
2109
   end
2110
 
2111
 
2112
 
2113
   // Msg checking ...
2114
   reg [7: 0] fsm_Tx_Msg;
2115
   reg [3: 0] tx_Msg_Tag_Lo;
2116
   always @(negedge trn_clk )
2117
   if (!trn_reset_n) begin
2118
      fsm_Tx_Msg      <= 0;
2119
      tx_Msg_Tag_Lo   <= 1;
2120
   end
2121
 
2122
   else begin
2123
 
2124
      case (fsm_Tx_Msg)
2125
 
2126
        'H00: begin
2127
            fsm_Tx_Msg    <= 'H10;
2128
         end
2129
 
2130
        'H10: begin
2131
           case ({ trn_tsrc_rdy_n
2132
                 , trn_tdst_rdy_n
2133
                 , trn_tsof_n
2134
                 })
2135
 
2136
             'B000:
2137
                 if (trn_td[31+32:28+32]=='H3) begin
2138
                    fsm_Tx_Msg    <= 'H30;
2139
                    if ( trn_td[11:8] != tx_Msg_Tag_Lo ) begin
2140
                      $display ("\n %t:\n !! Msg Tag bad !!", $time, trn_td[11:8]);
2141
                      Err_signal <= 1;
2142
                    end
2143
                    else if ( trn_td[7:0] == `C_MSG_CODE_INTA ) begin
2144
//                      fsm_Tx_Msg   <= 'H30;
2145
                      Accum_Msg_INTA <= Accum_Msg_INTA + 1;
2146
                    end
2147
                    else if ( trn_td[7:0] == `C_MSG_CODE_INTA_N ) begin
2148
//                      fsm_Tx_Msg   <= 'H30;
2149
                      Accum_Msg_INTA_n <= Accum_Msg_INTA_n + 1;
2150
                    end
2151
                    else begin
2152
                      $display ("\n %t:\n !! Bad Msg code (0x%2x) !!", $time, trn_td[7:0]);
2153
                      Err_signal <= 1;
2154
                    end
2155
                 end
2156
                 else begin
2157
                      fsm_Tx_Msg    <= 'H10;
2158
                 end
2159
 
2160
              default: begin
2161
                 fsm_Tx_Msg    <= 'H10;
2162
              end
2163
 
2164
           endcase
2165
         end
2166
 
2167
 
2168
        'H30: begin
2169
           if (trn_tsrc_rdy_n|trn_tdst_rdy_n) begin
2170
             fsm_Tx_Msg <= 'H30;
2171
           end
2172
           else if (trn_td) begin
2173
             $display ("\n %t:\n !! Msg data bad!!", $time);
2174
             Err_signal <= 1;
2175
           end
2176
           else begin
2177
             fsm_Tx_Msg <= 'H10;
2178
             tx_Msg_Tag_Lo  <= tx_Msg_Tag_Lo + 1;
2179
           end
2180
         end
2181
 
2182
 
2183
        default: begin
2184
           fsm_Tx_Msg  <= 'H00;
2185
         end
2186
 
2187
      endcase
2188
   end
2189
 
2190
 
2191
 
2192
   // ================================================= //
2193
   // =======     Interrupt uneven checking     ======= //
2194
   // ================================================= //
2195
   always @ Accum_Msg_INTA
2196
     if (Accum_Msg_INTA>Accum_Msg_INTA_n+1) begin
2197
        $display("\n\n  INTA overrun at %t\n\n", $time);
2198
        Err_signal <= 1;
2199
     end
2200
 
2201
   // 
2202
   always @ Accum_Msg_INTA_n
2203
     if (Accum_Msg_INTA_n>Accum_Msg_INTA) begin
2204
        $display("\n\n  #INTA overrun at %t\n\n", $time);
2205
        Err_signal <= 1;
2206
     end
2207
 
2208
 
2209
 
2210
 
2211
  // ***************************************** //
2212
  //                   Tasks                   //
2213
  // ***************************************** //
2214
 
2215
  ///////////////////////////////////////////////
2216
  //   Wait for the next positive clock event  //
2217
  ///////////////////////////////////////////////
2218
  task To_the_next_Event;
2219
  begin
2220
    wait (!trn_clk);
2221
    wait (trn_clk);
2222
    # `T_DELAY_AFTER ;
2223
  end
2224
  endtask
2225
 
2226
  ///////////////////////////////////////////////
2227
  //   Wait for the next negative clock event  //
2228
  ///////////////////////////////////////////////
2229
  task To_the_next_Tx_Data;
2230
  begin
2231
    wait (trn_clk);
2232
    wait (!trn_clk);
2233
    # `T_DELAY_AFTER ;
2234
  end
2235
  endtask
2236
 
2237
 
2238
  ///////////////////////////////////////////////
2239
  //   Insert GAP                              //
2240
  ///////////////////////////////////////////////
2241
  task Gap_Insert_Rx;
2242
  begin
2243
    To_the_next_Event;
2244
    trn_rsof_n <= 1;
2245
    trn_reof_n <= 1;
2246
    trn_rsrc_rdy_n <= 1;
2247
    trn_rbar_hit_n <= `C_NO_BAR_HIT;
2248
    trn_rd <= -1;
2249
    trn_rrem_n <= -1;
2250
  end
2251
  endtask
2252
 
2253
 
2254
  ///////////////////////////////////////////////
2255
  //                                           //
2256
  //   Feed TLP to Rx: MRd, MWr, Cpl/D, Msg    //
2257
  //                                           //
2258
  ///////////////////////////////////////////////
2259
  task TLP_Feed_Rx;
2260
    input         Use_Private_Array;   // Public or private
2261
    input [11:0]  IndexA;              // Start point in the Array
2262
    input [ 6:0]  BAR_Hit_N;           // Which BAR is hit
2263
 
2264
//    integer       hdr_Leng;
2265
    reg           TLP_has_Payload;
2266
    reg           TLP_hdr_4DW;
2267
    reg   [10:0]  jr;
2268
    reg   [10:0]  payload_Leng;
2269
 
2270
  begin
2271
 
2272
    // TLP format extraction
2273
    TLP_has_Payload     <= Hdr_Array[0][30] ;
2274
//    hdr_Leng            <= Hdr_Array[0][29] + 3;
2275
    TLP_hdr_4DW         <= Hdr_Array[0][29];
2276
 
2277
    // Header #0
2278
    To_the_next_Event;
2279
    trn_rsof_n          <= 0;
2280
    trn_reof_n          <= 1;
2281
    trn_rsrc_rdy_n      <= 0;
2282
    trn_rbar_hit_n      <= BAR_Hit_N;
2283
    trn_rd              <= {Hdr_Array[0], Hdr_Array[1]};
2284
    trn_rrem_n          <= 0;
2285
 
2286
    payload_Leng        <= {Hdr_Array[0][9:0]?1'b0:1'b1, Hdr_Array[0][9:0]};
2287
 
2288
    // Header words # 1
2289
    for (jr=1; jr<2; jr=jr+1) begin
2290
      To_the_next_Event;
2291
      trn_rsrc_rdy_n  <= trn_rsrc_rdy_n_seed;
2292
      if (trn_rsrc_rdy_n_seed) begin
2293
          trn_rsof_n    <= trn_rsof_n;
2294
          trn_rd        <= trn_rd;
2295
          trn_rrem_n    <= trn_rrem_n;
2296
          trn_reof_n    <= trn_reof_n;
2297
//          #0.1    jr    <= jr-1;
2298
          jr             = jr-1;      // !! not <= !!
2299
        end
2300
      else begin
2301
          trn_rsof_n    <= 1;
2302
          if (TLP_hdr_4DW) begin
2303
            trn_rrem_n    <= 'H00;
2304
            trn_rd        <= {Hdr_Array[2], Hdr_Array[3]};
2305
          end
2306
          else if (TLP_has_Payload) begin
2307
            trn_rrem_n    <= 'H00;
2308
            if (Use_Private_Array)
2309
              trn_rd        <= {Hdr_Array[2],Inv_Endian (Private_Array[IndexA])};
2310
            else
2311
              trn_rd        <= {Hdr_Array[2],Inv_Endian (D_Array[IndexA])};
2312
          end
2313
          else begin
2314
            trn_rrem_n    <= 'H0f;
2315
            trn_rd        <= {Hdr_Array[2], 32'H0};
2316
          end
2317
          if (payload_Leng<='H1 && TLP_hdr_4DW==0) begin
2318
            trn_reof_n    <= 0;
2319
          end
2320
          else if (!TLP_has_Payload) begin
2321
            trn_reof_n    <= 0;
2322
          end
2323
          else begin
2324
            trn_reof_n    <= 1;
2325
          end
2326
        end
2327
    end    // Header done.
2328
 
2329
    // Payload data ...
2330
    if ((TLP_has_Payload && TLP_hdr_4DW) || (TLP_has_Payload && (payload_Leng>'H1) && !TLP_hdr_4DW))
2331
 
2332
       for (jr=(!TLP_hdr_4DW); jr<payload_Leng; jr=jr+2) begin
2333
         To_the_next_Event;
2334
         trn_rsrc_rdy_n <= trn_rsrc_rdy_n_seed;
2335
         if (trn_rsrc_rdy_n_seed) begin
2336
           trn_rd       <= trn_rd;
2337
           trn_rrem_n   <= trn_rrem_n;
2338
           trn_reof_n   <= trn_reof_n;
2339
//           #0.1    jr   <= jr-1;
2340
           jr            = jr-2;      // !! not <= !!
2341
         end
2342
         else begin
2343
           if (jr==payload_Leng-1 || jr==payload_Leng-2) begin
2344
             trn_reof_n   <= 0;
2345
           end
2346
           else begin
2347
             trn_reof_n   <= 1;
2348
           end
2349
 
2350
           if (jr==payload_Leng-1) begin
2351
             trn_rrem_n   <= 'H0f;
2352
             if (Use_Private_Array)
2353
               trn_rd     <= {Inv_Endian(Private_Array[IndexA+jr]), 32'Hffff_ffff};
2354
             else
2355
               trn_rd     <= {Inv_Endian(D_Array[IndexA+jr]), 32'Hffff_ffff};
2356
           end
2357
           else begin
2358
             trn_rrem_n   <= 'H00;
2359
             if (Use_Private_Array)
2360
               trn_rd     <= {Inv_Endian(Private_Array[IndexA+jr]), Inv_Endian(Private_Array[IndexA+jr+1])};
2361
             else
2362
               trn_rd     <= {Inv_Endian(D_Array[IndexA+jr]), Inv_Endian(D_Array[IndexA+jr+1])};
2363
           end
2364
 
2365
 
2366
         end
2367
       end
2368
    // Payload done.
2369
 
2370
  end
2371
  endtask
2372
 
2373
 
2374
    /////////////////////////////////////////////
2375
   //                                         //
2376
  //   Function -  Endian Inversion 64-bit   //
2377
 //                                         //
2378
/////////////////////////////////////////////
2379
   function [31:00] Inv_Endian;
2380
   input [31:00] Data;
2381
   begin
2382
      Inv_Endian = {Data[ 7: 0], Data[15: 8], Data[23:16], Data[31:24]};
2383
   end
2384
   endfunction
2385
 
2386
 
2387
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.