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

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [trunk/] [sim/] [tf64_pcie_trn.v] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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