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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [ds_dma64/] [pcie_src/] [pcie_core64_m1/] [source/] [tlm_rx_data_snk_bar.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
 
2
//-----------------------------------------------------------------------------
3
//
4
// (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved.
5
//
6
// This file contains confidential and proprietary information
7
// of Xilinx, Inc. and is protected under U.S. and
8
// international copyright and other intellectual property
9
// laws.
10
//
11
// DISCLAIMER
12
// This disclaimer is not a license and does not grant any
13
// rights to the materials distributed herewith. Except as
14
// otherwise provided in a valid license issued to you by
15
// Xilinx, and to the maximum extent permitted by applicable
16
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
17
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
18
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
19
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
20
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
21
// (2) Xilinx shall not be liable (whether in contract or tort,
22
// including negligence, or under any other theory of
23
// liability) for any loss or damage of any kind or nature
24
// related to, arising under or in connection with these
25
// materials, including for any direct, or any indirect,
26
// special, incidental, or consequential loss or damage
27
// (including loss of data, profits, goodwill, or any type of
28
// loss or damage suffered as a result of any action brought
29
// by a third party) even if such damage or loss was
30
// reasonably foreseeable or Xilinx had been advised of the
31
// possibility of the same.
32
//
33
// CRITICAL APPLICATIONS
34
// Xilinx products are not designed or intended to be fail-
35
// safe, or for use in any application requiring fail-safe
36
// performance, such as life-support or safety devices or
37
// systems, Class III medical devices, nuclear facilities,
38
// applications related to the deployment of airbags, or any
39
// other applications that could lead to death, personal
40
// injury, or severe property or environmental damage
41
// (individually and collectively, "Critical
42
// Applications"). Customer assumes the sole risk and
43
// liability of any use of Xilinx products in Critical
44
// Applications, subject only to applicable laws and
45
// regulations governing limitations on product liability.
46
//
47
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
48
// PART OF THIS FILE AT ALL TIMES.
49
//
50
//-----------------------------------------------------------------------------
51
// Project    : V5-Block Plus for PCI Express
52
// File       : tlm_rx_data_snk_bar.v
53
//--------------------------------------------------------------------------------
54
//--------------------------------------------------------------------------------
55
/*****************************************************************************
56
 *  Description : Rx Data Sink bar hit communication
57
 *
58
 *     Hierarchical :
59
 *
60
 *     Functional :
61
 *      Contructs the bar check fields, and passes hit information on
62
 *
63
 ****************************************************************************/
64
`timescale 1ns/1ps
65
`ifndef TCQ
66
 `define TCQ 1
67
`endif
68
 
69
`ifndef AS
70
module tlm_rx_data_snk_bar #(
71
  parameter             DW = 32,        // Data width
72
  parameter             BARW = 7)       // BAR-hit width
73
 (
74
  input                 clk_i,
75
  input                 reset_i,
76
 
77
  output reg [63:0]     check_raddr_o,
78
  output reg            check_rmem32_o,
79
  output reg            check_rmem64_o,
80
  output reg            check_rio_o,
81
  output reg            check_rdev_id_o,
82
  output reg            check_rbus_id_o,
83
  output reg            check_rfun_id_o,
84
  input  [BARW-1:0]     check_rhit_bar_i,
85
  input                 check_rhit_i,
86
  output [BARW-1:0]     check_rhit_bar_o,
87
  output                check_rhit_o,
88
  output                check_rhit_src_rdy_o,
89
  output                check_rhit_ack_o,
90
  output                check_rhit_lock_o,
91
 
92
  input [31:0]          addr_lo_i,      // 32b addr high word
93
  input [31:0]          addr_hi_i,      // 32b addr high word
94
  input [8:0]           fulltype_oh_i,  // Packet data type
95
  input [2:0]           routing_i,      // routing
96
  input                 mem64_i,        // 64b memory access?
97
  input [15:0]          req_id_i,       // requester ID
98
  input [15:0]          req_id_cpl_i,   // req ID when pkt == cpl
99
  input                 eval_check_i,   // latch the formatting check
100
  input                 rhit_lat3_i,    // Is BAR-hit latency 3 clocks?
101
  input                 legacy_mode_i
102
  );
103
 
104
  localparam            CHECK_IO_BAR_HIT_EN = 1'b1;
105
 
106
  //---------------------------------------------------------------------------
107
  // PCI Express constants
108
  //---------------------------------------------------------------------------
109
  // Bit taps for one-hot Full Type
110
  localparam    MEM_BIT   = 8;
111
  localparam    ADR_BIT   = 7;
112
  localparam    MRD_BIT   = 6;
113
  localparam    MWR_BIT   = 5;
114
  localparam    MLK_BIT   = 4;
115
  localparam    IO_BIT    = 3;
116
  localparam    CFG_BIT   = 2;
117
  localparam    MSG_BIT   = 1;
118
  localparam    CPL_BIT   = 0;
119
 
120
  // Route
121
  localparam    ROUTE_BY_ID = 3'b010;
122
 
123
  wire [63:0]   addr_64b = {addr_hi_i, addr_lo_i};
124
 
125
  reg [63:0]    check_raddr_d;
126
  reg           check_rmem32_d;
127
  reg           check_rmem64_d;
128
  reg           check_rmemlock_d;
129
  reg           check_rmemlock_d1a;
130
  reg           check_rio_d;
131
  reg           check_rdev_id_d;
132
  reg           check_rbus_id_d;
133
  reg           check_rfun_id_d;
134
 
135
 
136
  reg           eval_check_q1, eval_check_q2, eval_check_q3, eval_check_q4;
137
  reg                          sent_check_q2, sent_check_q3, sent_check_q4;
138
  reg           lock_check_q2, lock_check_q3, lock_check_q4;
139
 
140
  // Check if endpoint is the correct recipient
141
  //---------------------------------------------------------------------------
142
  // On every request received, except implicitly routed messages, check if:
143
  // 1. the endpoint is the right recipient by passing to the CMM for checking:
144
  //    . for Mem, IO and Cfg: the destination addr (checked with BARs)
145
  //    . for Messages:
146
  //      a. the req_id,  if TLP was routed by ID
147
  //      b. the address, if TLP was routed by addr
148
  //      c. if dest is not RC, the endpoint is the implicit recipient
149
  //    . for Completions: the req_id
150
  // 2. the type is valid
151
  // 3. for Messages: msg_code and routing are valid
152
  //
153
  // Since the invalid type won't trigger the 1. check, it will be detected by
154
  // the non assertion of check_rhit_i by the CMM
155
  // => check 2. is redundant with check 1.
156
  //
157
  // Note: Future possible enhancement
158
  // . check 3. may also be merged with 1., but that will affect the timing of
159
  //   the live check_*_o signals provided to the CMM
160
  //   => to be considered if those outputs get registered
161
  //
162
  // No need to check:
163
  // . silently dropped: Unlock
164
  // . passed on       : User messages (Vendor_Defined)
165
  //---------------------------------------------------------------------------
166
 
167
  // Timing is tight here at 250 MHz -> split the calculations out from the CE
168
  //   and return to 0
169
  // This also allows for a blocking default assignment, which makes the code
170
  //   easier to follow
171
  always @* begin
172
    check_raddr_d   = (fulltype_oh_i[MSG_BIT] ? {req_id_i,48'h0}     : 0) |
173
                      (fulltype_oh_i[CPL_BIT] ? {req_id_cpl_i,48'h0} : 0) |
174
                      (fulltype_oh_i[ADR_BIT] ? addr_64b             : 0);
175
 
176
    check_rbus_id_d = (fulltype_oh_i[MSG_BIT] && (routing_i == ROUTE_BY_ID)) ||
177
                       fulltype_oh_i[CPL_BIT];
178
 
179
    check_rdev_id_d = (fulltype_oh_i[MSG_BIT] && (routing_i == ROUTE_BY_ID)) ||
180
                       fulltype_oh_i[CPL_BIT];
181
 
182
    check_rfun_id_d = (fulltype_oh_i[MSG_BIT] && (routing_i == ROUTE_BY_ID)) ||
183
                       fulltype_oh_i[CPL_BIT];
184
 
185
    check_rmem32_d  =  fulltype_oh_i[MEM_BIT] && !mem64_i;
186
 
187
    check_rmem64_d  =  fulltype_oh_i[MEM_BIT] &&  mem64_i;
188
 
189
    check_rmemlock_d=  fulltype_oh_i[MLK_BIT];
190
 
191
    check_rio_d     =  fulltype_oh_i[IO_BIT] && CHECK_IO_BAR_HIT_EN;
192
 
193
    // No checks on CFG: CMM captures bus and dev ids for that function
194
  end
195
 
196
  always @(posedge clk_i) begin
197
    if (eval_check_i) begin
198
      check_raddr_o     <= #`TCQ check_raddr_d;
199
    end
200
  end
201
 
202
  always @(posedge clk_i) begin
203
    if (reset_i) begin
204
      check_rmem32_o    <= #`TCQ 0;
205
      check_rmem64_o    <= #`TCQ 0;
206
      check_rmemlock_d1a <= #`TCQ 0;
207
      check_rio_o       <= #`TCQ 0;
208
      check_rbus_id_o   <= #`TCQ 0;
209
      check_rdev_id_o   <= #`TCQ 0;
210
      check_rfun_id_o   <= #`TCQ 0;
211
 
212
    // Our calculation from above is ready
213
    end else if (eval_check_i) begin
214
      check_rmem32_o    <= #`TCQ check_rmem32_d;
215
      check_rmem64_o    <= #`TCQ check_rmem64_d;
216
      check_rmemlock_d1a <= #`TCQ check_rmemlock_d;
217
      check_rio_o       <= #`TCQ check_rio_d;
218
      check_rbus_id_o   <= #`TCQ check_rbus_id_d;
219
      check_rdev_id_o   <= #`TCQ check_rdev_id_d;
220
      check_rfun_id_o   <= #`TCQ check_rfun_id_d;
221
 
222
    // these signals all imply src_rdy, return to zero
223
    end else begin
224
      check_rmem32_o    <= #`TCQ 0;
225
      check_rmem64_o    <= #`TCQ 0;
226
      check_rmemlock_d1a <= #`TCQ 0;
227
      check_rio_o       <= #`TCQ 0;
228
      check_rbus_id_o   <= #`TCQ 0;
229
      check_rdev_id_o   <= #`TCQ 0;
230
      check_rfun_id_o   <= #`TCQ 0;
231
    end
232
  end
233
 
234
  // Need a pipe to time the return back from the CMM, since
235
  //   32 and 64 signal the CMM to start calculating at
236
  //   different times
237
  // Eval is when the check is occuring
238
  // Sent is if we actually sent one (and expect a response)
239
  //---------------------------------------------------------
240
  always @(posedge clk_i) begin
241
    eval_check_q1       <= #`TCQ eval_check_i;
242
    eval_check_q2       <= #`TCQ eval_check_q1;
243
    eval_check_q3       <= #`TCQ eval_check_q2;
244
    eval_check_q4       <= #`TCQ eval_check_q3;
245
    sent_check_q2       <= #`TCQ eval_check_q1 &&
246
                           (check_rmem32_o  ||
247
                            check_rmem64_o  ||
248
                            check_rio_o     ||
249
                            check_rbus_id_o ||
250
                            check_rdev_id_o ||
251
                            check_rfun_id_o);
252
    sent_check_q3       <= #`TCQ sent_check_q2;
253
    sent_check_q4       <= #`TCQ sent_check_q3;
254
    lock_check_q2       <= #`TCQ check_rmemlock_d1a;
255
    lock_check_q3       <= #`TCQ lock_check_q2;
256
    lock_check_q4       <= #`TCQ lock_check_q3;
257
  end
258
 
259
  // Values from the CMM
260
  assign check_rhit_bar_o     = check_rhit_bar_i;
261
  assign check_rhit_o         = check_rhit_i;
262
  // Result of our internal timing circuit
263
  assign check_rhit_src_rdy_o = rhit_lat3_i ? eval_check_q4 : eval_check_q3;
264
  assign check_rhit_ack_o     = rhit_lat3_i ? sent_check_q4 : sent_check_q3;
265
 
266
  assign check_rhit_lock_o    = rhit_lat3_i ? lock_check_q4 : lock_check_q3;
267
endmodule
268
`endif

powered by: WebSVN 2.1.0

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