Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / env / fnx / vlib / FNXPCIEXactor / src / FNXPCIEXactorPacket.vr
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: FNXPCIEXactorPacket.vr
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35#include <vera_defines.vrh>
36
37// FNXPCIEXactor library
38#include "FNXPCIEXactorDefines.vri"
39
40// XactorFmwork and XactorComponents libraries
41#include "XactorBasePacket.vrh"
42#include "XactorUtilities.vrh"
43#include "XactorDefines.vri"
44
45// DenaliPCIE libary
46#include "DenaliPCIE.vri"
47
48// CTSupportClasses library
49#include "CTTransactionID.vrh"
50
51// report library
52#include "cReport.vrh"
53#include "report_macros.vri"
54#include "FNXPCIEXactorReportMacros.vri"
55
56class FNXPCIEXactorPacket extends FNXPCIEXactorBasePacket {
57
58 // Inherited data members
59 // CTTransactionID XactionID
60 // ReportClass MyReport
61 // event DriveEvent
62 // event eDriveStart
63 // event eDriveEnd
64 // bit [FNX_PCIE_XTR_PKT_TYPE_WIDTH-1:0] PktType;
65
66 // bit to indicate injecting unsupported dllp type
67 static bit inject_unsupport_dllp_type = 0;
68
69
70 // Base Class and Method Names For QR Macros
71 local string ClassName = "FNXPCIEXactorPacket";
72 local string MethodName = null;
73
74 // Utilities
75 local FNXPCIEXactorUtilities Util;
76
77 //---------------------------------------------------------------------
78 // TLP Common Header Fields
79 //
80 // Located in DW 1 for All Headers
81 bit [FNX_PCIE_XTR_CMN_RESV_1_WIDTH-1:0] CmnResv1; // Reserved
82 bit [FNX_PCIE_XTR_CMN_FORMAT_WIDTH-1:0] CmnFmt; // Format
83 bit [FNX_PCIE_XTR_CMN_TYPE_WIDTH-1:0] CmnType; // Type
84 bit [FNX_PCIE_XTR_CMN_RESV_2_WIDTH-1:0] CmnResv2; // Reserved
85 bit [FNX_PCIE_XTR_CMN_TC_WIDTH-1:0] CmnTC; // Traffic Class
86 bit [FNX_PCIE_XTR_CMN_RESV_3_WIDTH-1:0] CmnResv3; // Reserved
87 bit [FNX_PCIE_XTR_CMN_TD_WIDTH-1:0] CmnTD; // TLP Digest
88 bit [FNX_PCIE_XTR_CMN_EP_WIDTH-1:0] CmnEP; // Poisoned
89 bit [FNX_PCIE_XTR_CMN_RO_WIDTH-1:0] CmnRO; // Relaxed Order Attr[1]
90 bit [FNX_PCIE_XTR_CMN_SNOOP_WIDTH-1:0] CmnSnoop; // Snoop Enable Attr[0]
91 bit [FNX_PCIE_XTR_CMN_RESV_4_WIDTH-1:0] CmnResv4; // Reserved
92 bit [FNX_PCIE_XTR_CMN_LENGTH_WIDTH-1:0] CmnLength; // Length in 4 bytes (0 == 4096)
93 //---------------------------------------------------------------------
94
95 //---------------------------------------------------------------------
96 // TLP Request Header Fields
97 //
98 // Located in DW 2 for Memory, I/O, Config & Message Requests
99 // Located in DW 3 for Completions
100 //
101 bit [FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH-1:0] ReqBusNum; // Requester Bus Number
102 bit [FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH-1:0] ReqDeviceNum; // Requester Device Number
103 bit [FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH-1:0] ReqFuncNum; // Requester Function Number
104 bit [FNX_PCIE_XTR_REQ_TAG_WIDTH-1:0] ReqTag; // Tag
105 //---------------------------------------------------------------------
106
107 //---------------------------------------------------------------------
108 //
109 // TLP Byte Enable Header Fields
110 //
111 // Located in DW 2 for Memory, I/O, & Config Requests
112 //
113 bit [FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH-1:0] BELastDW; // Last DW Byte Enable
114 bit [FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH-1:0] BEFirstDW; // First DW Byte Enable
115 //---------------------------------------------------------------------
116
117 //---------------------------------------------------------------------
118 //
119 // TLP Message Header Fields
120 //
121 // Located in DW 2 for Message Requests
122 //
123 bit [FNX_PCIE_XTR_MSG_MESSAGE_CODE_WIDTH-1:0] MsgCode; // Message Code
124 bit [FNX_PCIE_XTR_MSG_ROUTING_WIDTH-1:0] MsgRouting; // Message Routing, Stored in Type[2:0]
125 bit [FNX_PCIE_XTR_DW_WIDTH-1:0] MsgDW3; // Message DW 3
126 bit [FNX_PCIE_XTR_DW_WIDTH-1:0] MsgDW4; // Message DW 4
127 bit [15:0] MsgCmplrId;
128 bit [15:0] MsgVendorId;
129 //---------------------------------------------------------------------
130
131 //---------------------------------------------------------------------
132 //
133 // TLP Completion Header Fields
134 //
135 // Located in DW 2 for Completions
136 //
137 bit [FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH-1:0] CmplBusNum; // Completer Bus Number
138 bit [FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH-1:0] CmplDeviceNum; // Completer Device Number
139 bit [FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH-1:0] CmplFuncNum; // Completer Function Number
140 bit [FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH-1:0] CmplStatus; // Completion Status
141 bit [FNX_PCIE_XTR_CMPL_BCM_WIDTH-1:0] CmplBCM; // Byte Count Modified
142 bit [FNX_PCIE_XTR_CMPL_BYTE_COUNT_WIDTH-1:0] CmplByteCount; // Byte Count
143 bit [FNX_PCIE_XTR_CMPL_RESV_5_WIDTH-1:0] CmplResv5; // Reserved
144 bit [FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH-1:0] CmplLowerAddr; // Lower Address
145 //---------------------------------------------------------------------
146
147 //---------------------------------------------------------------------
148 //
149 // TLP Address Header Fields
150 //
151 // Located in DW3 for I/O Requests
152 // Located in DW 3 and/or DW 4 for Memory Requests
153 //
154 bit [FNX_PCIE_XTR_ADDR_UPPER_ADDR_WIDTH-1:0] AddrUpper; // Address [63:32]
155 bit [FNX_PCIE_XTR_ADDR_LOWER_ADDR_WIDTH-1:0] AddrLower; // Address [31:2]
156 bit [FNX_PCIE_XTR_ADDR_RESV_6_WIDTH-1:0] AddrResv6; // Reserved
157 //---------------------------------------------------------------------
158
159 //---------------------------------------------------------------------
160 //
161 // TLP Configuration Request Header Fields
162 //
163 // Located in DW 3 for Configuration Requests
164 //
165 bit [FNX_PCIE_XTR_CFG_BUS_NUM_WIDTH-1:0] CfgBusNum; // Config Dest Bus Number
166 bit [FNX_PCIE_XTR_CFG_DEVICE_NUM_WIDTH-1:0] CfgDeviceNum; // Config Dest Device Number
167 bit [FNX_PCIE_XTR_CFG_FUNC_NUM_WIDTH-1:0] CfgFuncNum; // Config Dest Function Number
168 bit [FNX_PCIE_XTR_CFG_RESV_7_WIDTH-1:0] CfgResv7; // Reserved
169 bit [FNX_PCIE_XTR_CFG_EXT_REG_NUM_WIDTH-1:0] CfgExtRegNum; // Extended Register Number
170 bit [FNX_PCIE_XTR_CFG_REG_NUM_WIDTH-1:0] CfgRegNum; // Register Number
171 bit [FNX_PCIE_XTR_CFG_RESV_8_WIDTH-1:0] CfgResv8; // Reserved
172 //---------------------------------------------------------------------
173
174 //---------------------------------------------------------------------
175 //
176 // TLP Data Fields
177 //
178 bit [FNX_PCIE_XTR_ECRC_WIDTH-1:0] ECRC; // End-to-End CRC
179 bit [7:0] Pyld[*]; // Data Payload
180 //---------------------------------------------------------------------
181
182 //---------------------------------------------------------------------
183 //
184 // TLP DLL Framing Fields
185 //
186 bit [FNX_PCIE_XTR_DLL_FRM_RESV_9_WIDTH-1:0] DLLFrmResv9; // reserved
187 bit [FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH-1:0] DLLFrmSeqNum; // DLL Sequence Number
188 bit [FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH-1:0] DLLFrmLCRC32; // 32-bit DLL LCRC
189 //---------------------------------------------------------------------
190
191 //---------------------------------------------------------------------
192 //
193 // TLP Field Generation Control
194 bit GenTag; // Xactor Generates Request Tag Field
195 bit GenECRC; // Xactor Generates ECRC If Present
196 bit GenSeqNum; // Xactor Generates DLL Sequence Number
197 bit GenLCRC32; // Xactor Generates DLL 32-bit LCRC
198 //---------------------------------------------------------------------
199
200 //---------------------------------------------------------------------
201 //
202 // Error Injection Control
203 //
204 denaliPcieEiTypeT DenaliErr; // Denali Error Injection Type
205 //---------------------------------------------------------------------
206
207 //---------------------------------------------------------------------
208 //
209 // DLLP Fields
210 //
211 bit [FNX_PCIE_XTR_DLLP_TYPE_WIDTH-1:0] DllpType; // Type
212 bit [FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH-1:0] DllpLCRC16; // 16-bit LCRC
213 bit [FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_WIDTH-1:0] AckNakSeqNum; // Ack/Nak Sequence Number
214 bit [FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_WIDTH-1:0] AckNakResv; // Reserved Field (for Ack/Nak DLLPs)
215 bit [FNX_PCIE_XTR_DLLP_FC_RESV_1_WIDTH-1:0] DllpFCResv1; // Reserved Field (for FC DLLPs)
216 bit [FNX_PCIE_XTR_DLLP_FC_HDR_FC_WIDTH-1:0] DllpFCHdrFC; // Header FC Credits
217 bit [FNX_PCIE_XTR_DLLP_FC_RESV_2_WIDTH-1:0] DllpFCResv2; // Reserved Field (for FC DLLPs)
218 bit [FNX_PCIE_XTR_DLLP_FC_DATA_FC_WIDTH-1:0] DllpFCDataFC; // Data FC Credits
219 bit [FNX_PCIE_XTR_DLLP_PM_RESV_WIDTH-1:0] DllpPMResv; // Reserved Field (for PM DLLPs)
220 bit [FNX_PCIE_XTR_DLLP_VENDOR_DATA_WIDTH-1:0] DllpVendorData; // Vendor Specific DLLP Data
221 //---------------------------------------------------------------------
222
223 //---------------------------------------------------------------------
224 //
225 // DLLP Field Generation Control
226 bit GenLCRC16; // Xactor Generates DLLP 16-bit LCRC
227 //---------------------------------------------------------------------
228
229 //---------------------------------------------------------------------
230 //
231 // DLLP End point
232 bit [8:0] EndFrame; // DLLP End symbol
233 //---------------------------------------------------------------------
234
235 //---------------------------------------------------------------------
236 //
237 // DLLP Field Generation Control
238 bit invertLCRC32 = 0; // to invert LCRC32
239 bit set_endsymbol_EDB = 0; // to setting end symbol= EDB
240 //---------------------------------------------------------------------
241
242 //---------------------------------------------------------------------
243 //
244 // FNX Exerciser Control
245 bit CheckFmtTypeOnly; // Only Compare FmtType Field in Expect
246 //---------------------------------------------------------------------
247
248 //---------------------------------------------------------------------
249 //
250 // Replay Statistics
251 bit ReplayCnt; // Times Packet Has Been Replayed
252 bit ReplayInProgress; //Used for Ingress replays, set when packet exits
253 // retry_buffer_exit, Used to trigger event at
254 // PL_TX_end_packet and then cleared
255 event eReplayEnd;
256 //---------------------------------------------------------------------
257
258 //---------------------------------------------------------------------
259 //
260 // Add this packet to the front of the user queue(prepend) instead of
261 // the back of the user queue
262 bit DriveImmediately = 0; //
263 //---------------------------------------------------------------------
264
265 // Added so IOS and Full chip can ignore tag generated for PIO packets
266 bit IgnoreTlpReqTag; // Ignores the expect for request tag
267
268 bit [FNX_PCIE_XTR_REQ_TAG_WIDTH-1:0] ReceivedReqTag; // Recevied from packet expect
269
270 //Used to mark Denali Received Null Packets
271 bit nullPkt = 0;
272
273
274 // Local Variables
275 //
276 local string XactorName; // Transactor Name
277
278 local integer PortNum; // Port Number of PCIE Link
279
280 local integer NumTLPHdrDWs; // Number of DWs in TLP Header
281 local bit PyldPres; // TLP Has a Data Payload
282 local integer NumPyldBytes; // TLP Payload Length in Bytes
283 local bit [FNX_PCIE_XTR_NUM_HDRS-1:0] TLPHdrPresVec; // TLP Header Presence Vector
284
285 local integer NumTLPResvFieldsPres; // Total Number of Reserved Fields in Packet
286 local bit [ FNX_PCIE_XTR_NUM_RESV_FIELDS:0 ] TLPResvFieldsPresVec; // Reserved Field Presence Vector
287
288 local bit TLPNonZeroResvFieldsPres; // Packet Contains Non-Zero Reserved Field
289 local bit [ FNX_PCIE_XTR_NUM_RESV_FIELDS:0 ] NonZeroTLPResvFieldsPresVec; // Non-ZeroReserved Field Presence Vector
290
291 local bit PktStateUpdated; // Internal Packet State Is Up-to-Date
292 //---------------------------------------------------------------------
293
294 // constructor
295 task new( ReportClass _Report,
296 string _XactorName,
297 FNXPCIEXactorUtilities _Util,
298 integer _PortNum );
299
300 // public ID methods
301 virtual task SetID( CTTransactionID XactionID );
302 virtual function CTTransactionID GetID();
303 virtual function string GetIDStr();
304 virtual task ResetID();
305
306 // public packet methods
307 virtual task PktDisplay( ReportType TypeRep,
308 string Message );
309 virtual function bit PktCompare( string Operation,
310 XactorBasePacket Pkt );
311 virtual function integer PktHash( integer HashSize );
312 virtual function bit PktUndef();
313 virtual task PktCopy( XactorBasePacket Pkt );
314 virtual function XactorBasePacket PktClone();
315 virtual task PktReset();
316 virtual task PktZero();
317 virtual function string PktToStr();
318 virtual function XactorBasePacket FormDriven();
319 virtual function bit [FNX_PCIE_XTR_EXPECT_PKT_MAX-1:0] FormExpected();
320 virtual task ParseTLPByteStream( bit [8:0] pktData[*] );
321 virtual task ParseDLLPByteStream( bit [8:0] pktData[*] );
322 virtual function denaliPciePacket CreateDenaliPkt();
323 virtual function string GetPktPrefixStr();
324 virtual task SyncDriveStart();
325 virtual task TriggerDriveStart();
326 virtual task SyncDriveEnd();
327 virtual task TriggerDriveEnd();
328 virtual task SyncReplayEnd();
329 virtual task TriggerReplayEnd();
330
331 // public field methods
332 virtual task Set( string FieldType,
333 bit [ XACT_FIELD_WIDTH-1:0 ] FieldValue );
334 virtual function bit [ XACT_FIELD_WIDTH-1:0 ] Get( string FieldType );
335 virtual task SetPyld( bit [7:0] _Pyld[*] );
336 virtual task GetPyld( var bit [7:0] _Pyld[*] );
337 virtual task SetFmtType( bit [FNX_PCIE_XTR_CMN_FMT_TYPE_WIDTH-1:0] fmtType );
338 virtual function bit [FNX_PCIE_XTR_CMN_FMT_TYPE_WIDTH-1:0] GetFmtType();
339 virtual task SetAttr( bit [FNX_PCIE_XTR_CMN_ATTR_WIDTH-1:0] attr );
340 virtual function bit [FNX_PCIE_XTR_CMN_ATTR_WIDTH-1:0] GetAttr();
341 virtual task SetDllpFCType( bit [FNX_PCIE_XTR_DLLP_FC_TYPE_WIDTH-1:0] fcType );
342 virtual function bit [FNX_PCIE_XTR_DLLP_FC_TYPE_WIDTH-1:0] GetDllpFCType();
343 virtual task SetDllpFCVC( bit [FNX_PCIE_XTR_DLLP_FC_VC_WIDTH-1:0] fcVC );
344 virtual function bit [FNX_PCIE_XTR_DLLP_FC_VC_WIDTH-1:0] GetDllpFCVC();
345 virtual task SetReqId( bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] reqId );
346 virtual function bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] GetReqId();
347 virtual task SetCmplId( bit [FNX_PCIE_XTR_CMPL_COMPLETER_ID_WIDTH-1:0] cmplId );
348 virtual function bit [FNX_PCIE_XTR_CMPL_COMPLETER_ID_WIDTH-1:0] GetCmplId();
349 virtual task SetCfgId( bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] cfgId );
350 virtual function bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] GetCfgId();
351 virtual function integer NumBytes();
352
353 // public TLP default setup helper methods
354 virtual task SetTLPDefaultExpectFields();
355 virtual task SetMemTLPDefaultExpectFields();
356 virtual task SetIOTLPDefaultExpectFields();
357 virtual task SetCfgTLPDefaultExpectFields();
358 virtual task SetTLPDefaultDriveFields();
359 virtual task SetCplTLPDefaultDriveFields();
360 virtual task SetCplDTLPDefaultDriveFields();
361 virtual task SetMemTLPDefaultDriveFields();
362
363 // public packet isType methods
364 virtual function bit isTlp();
365 virtual function bit isTlpRequest();
366 virtual function bit isTlpIORequest();
367 virtual function bit isTlpCfgRequest();
368 virtual function bit isTlpMemRequest32();
369 virtual function bit isTlpMemRequest64();
370 virtual function bit isTlpCompletion();
371 virtual function bit isTlpMessage();
372 virtual function bit isTlpVendorMessage();
373 virtual function bit isDllp();
374 virtual function bit isDllpAckNak();
375 virtual function bit isDllpFC();
376 virtual function bit isDllpFCUpdate();
377 virtual function bit isDllpVendor();
378 virtual function bit isDllpPM();
379
380 // use by global Denali packet callback processing task
381 function ReportClass CreateReport();
382
383 // local packet methods
384 local task ResetLocalVars();
385 local task UpdatePktState();
386 local function string TlpPktToStr();
387 local function string DllpPktToStr();
388 local function bit [ FNX_PCE_XTR_MAX_RESV_FIELD_WIDTH-1:0 ] GetTLPResvFieldVal( integer idx );
389 local function string GetTLPResvFieldsStr();
390} // end of packet sub-class
391
392// constructor
393task FNXPCIEXactorPacket::new( ReportClass _Report,
394 string _XactorName,
395 FNXPCIEXactorUtilities _Util,
396 integer _PortNum )
397{
398 super.new();
399
400 MyReport = _Report; // Reference to report object
401 XactorName = _XactorName; // Name of transactor
402 Util = _Util;
403 PortNum = _PortNum;
404 this.PktReset(); // Reset this packet
405}
406
407task FNXPCIEXactorPacket::ResetLocalVars()
408{
409 // Reset All Local Variables
410 PktStateUpdated = 0;
411 PktType = FNX_PCIE_XTR_PKT_TYPE_TLP; // default to TLP
412 NumTLPHdrDWs = 0;
413 PyldPres = 0;
414 NumPyldBytes = 0;
415 TLPHdrPresVec = 0;
416 TLPResvFieldsPresVec = 0;
417 NumTLPResvFieldsPres = 0;
418 TLPNonZeroResvFieldsPres = 0;
419 NonZeroTLPResvFieldsPresVec = 0;
420}
421
422task FNXPCIEXactorPacket::PktReset()
423{
424 integer i;
425
426 // Reset TransID and Local Vars
427 ResetID();
428 ResetLocalVars();
429
430 //---------------------------------------------------------------------
431 //
432 // All TLP Header Fields Which Must Be Set by User Are Reset to X
433 // All Reserved TLP Header Fields Are Reset to Zero
434 // All Generated TLP Fields (Digest, LCRC, Seq_Num) Are Reset to Zero
435 //
436 // Reset TLP Common Header Fields
437 CmnResv1 = { FNX_PCIE_XTR_CMN_RESV_1_WIDTH {1'b0} };
438 CmnFmt = { FNX_PCIE_XTR_CMN_FORMAT_WIDTH {1'bx} };
439 CmnType = { FNX_PCIE_XTR_CMN_TYPE_WIDTH {1'bx} };
440 CmnResv2 = { FNX_PCIE_XTR_CMN_RESV_2_WIDTH {1'b0} };
441 CmnTC = { FNX_PCIE_XTR_CMN_TC_WIDTH {1'bx} };
442 CmnResv3 = { FNX_PCIE_XTR_CMN_RESV_3_WIDTH {1'b0} };
443 CmnTD = { FNX_PCIE_XTR_CMN_TD_WIDTH {1'bx} };
444 CmnEP = { FNX_PCIE_XTR_CMN_EP_WIDTH {1'bx} };
445 CmnRO = { FNX_PCIE_XTR_CMN_RO_WIDTH {1'bx} };
446 CmnSnoop = { FNX_PCIE_XTR_CMN_SNOOP_WIDTH {1'bx} };
447 CmnResv4 = { FNX_PCIE_XTR_CMN_RESV_4_WIDTH {1'b0} };
448 CmnLength = { FNX_PCIE_XTR_CMN_LENGTH_WIDTH {1'bx} };
449
450 // Reset TLP Request Header Fields
451 ReqBusNum = { FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH {1'bx} };
452 ReqDeviceNum = { FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH {1'bx} };
453 ReqFuncNum = { FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH {1'bx} };
454 ReqTag = { FNX_PCIE_XTR_REQ_TAG_WIDTH {1'bx} };
455
456 // Reset TLP Byte Enable Header Fields
457 BELastDW = { FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH {1'bx} };
458 BEFirstDW = { FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH {1'bx} };
459
460 // Reset TLP Message Header Fields
461 MsgCode = { FNX_PCIE_XTR_MSG_MESSAGE_CODE_WIDTH {1'bx} };
462 MsgRouting = { FNX_PCIE_XTR_MSG_ROUTING_WIDTH {1'bx} };
463 MsgDW3 = { FNX_PCIE_XTR_DW_WIDTH {1'b0} };
464 MsgDW4 = { FNX_PCIE_XTR_DW_WIDTH {1'b0} };
465
466 // Reset TLP Completion Header Fields
467 CmplBusNum = { FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH {1'bx} };
468 CmplDeviceNum = { FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH {1'bx} };
469 CmplFuncNum = { FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH {1'bx} };
470 CmplStatus = { FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH {1'bx} };
471 CmplBCM = { FNX_PCIE_XTR_CMPL_BCM_WIDTH {1'bx} };
472 CmplByteCount = { FNX_PCIE_XTR_CMPL_BYTE_COUNT_WIDTH {1'bx} };
473 CmplResv5 = { FNX_PCIE_XTR_CMPL_RESV_5_WIDTH {1'b0} };
474 CmplLowerAddr = { FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH {1'bx} };
475
476 // Reset TLP Address Header Fields
477 AddrUpper = { FNX_PCIE_XTR_ADDR_UPPER_ADDR_WIDTH {1'bx} };
478 AddrLower = { FNX_PCIE_XTR_ADDR_LOWER_ADDR_WIDTH {1'bx} };
479 AddrResv6 = { FNX_PCIE_XTR_ADDR_RESV_6_WIDTH {1'b0} };
480
481 // Reset TLP Configuration Request Header Fields
482 CfgBusNum = { FNX_PCIE_XTR_CFG_BUS_NUM_WIDTH {1'bx} };
483 CfgDeviceNum = { FNX_PCIE_XTR_CFG_DEVICE_NUM_WIDTH {1'bx} };
484 CfgFuncNum = { FNX_PCIE_XTR_CFG_FUNC_NUM_WIDTH {1'bx} };
485 CfgResv7 = { FNX_PCIE_XTR_CFG_RESV_7_WIDTH {1'b0} };
486 CfgExtRegNum = { FNX_PCIE_XTR_CFG_EXT_REG_NUM_WIDTH {1'bx} };
487 CfgRegNum = { FNX_PCIE_XTR_CFG_REG_NUM_WIDTH {1'bx} };
488 CfgResv8 = { FNX_PCIE_XTR_CFG_RESV_8_WIDTH {1'b0} };
489
490 // TLP Data Fields
491 ECRC = { FNX_PCIE_XTR_ECRC_WIDTH {1'b0} };
492
493 // TLP DLL Framing Fields
494 DLLFrmResv9 = { FNX_PCIE_XTR_DLL_FRM_RESV_9_WIDTH {1'b0} };
495 DLLFrmLCRC32 = { FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH {1'bx} };
496 DLLFrmSeqNum = { FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH {1'bx} };
497
498 // TLP Field Generation Control
499 GenTag = 1;
500 GenECRC = 0;
501 GenSeqNum = 1;
502 GenLCRC32 = 1;
503 //---------------------------------------------------------------------
504
505 // DLLP Fields
506 DllpType = { FNX_PCIE_XTR_DLLP_TYPE_WIDTH {1'bx} };
507 DllpLCRC16 = { FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH {1'bx} };
508 AckNakSeqNum = { FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_WIDTH {1'bx} };
509 AckNakResv = { FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_WIDTH {1'b0} };
510 DllpFCResv1 = { FNX_PCIE_XTR_DLLP_FC_RESV_1_WIDTH {1'b0} };
511 DllpFCHdrFC = { FNX_PCIE_XTR_DLLP_FC_HDR_FC_WIDTH {1'bx} };
512 DllpFCResv2 = { FNX_PCIE_XTR_DLLP_FC_RESV_2_WIDTH {1'b0} };
513 DllpFCDataFC = { FNX_PCIE_XTR_DLLP_FC_DATA_FC_WIDTH {1'bx} };
514 DllpPMResv = { FNX_PCIE_XTR_DLLP_PM_RESV_WIDTH {1'b0} };
515 DllpVendorData = { FNX_PCIE_XTR_DLLP_VENDOR_DATA_WIDTH {1'bx} };
516
517 // DLLP Field Generation Control
518 GenLCRC16 = 1;
519
520 // Error Injection Control
521 DenaliErr = PCIE_EI_NONE;
522
523 // Exerciser Control
524 CheckFmtTypeOnly = 0;
525
526 // Replay Statistics
527 ReplayCnt = 0;
528 ReplayInProgress = 0;
529
530 IgnoreTlpReqTag = 0;
531 ReceivedReqTag = 0;
532
533 // Deallocate Payload Dynamic Array
534 Pyld.delete();
535}
536
537task FNXPCIEXactorPacket::PktZero()
538{
539 // Reset TLP Common Header Fields
540 CmnResv1 = { FNX_PCIE_XTR_CMN_RESV_1_WIDTH {1'b0} };
541 CmnFmt = { FNX_PCIE_XTR_CMN_FORMAT_WIDTH {1'b0} };
542 CmnType = { FNX_PCIE_XTR_CMN_TYPE_WIDTH {1'b0} };
543 CmnResv2 = { FNX_PCIE_XTR_CMN_RESV_2_WIDTH {1'b0} };
544 CmnTC = { FNX_PCIE_XTR_CMN_TC_WIDTH {1'b0} };
545 CmnResv3 = { FNX_PCIE_XTR_CMN_RESV_3_WIDTH {1'b0} };
546 CmnTD = { FNX_PCIE_XTR_CMN_TD_WIDTH {1'b0} };
547 CmnEP = { FNX_PCIE_XTR_CMN_EP_WIDTH {1'b0} };
548 CmnRO = { FNX_PCIE_XTR_CMN_RO_WIDTH {1'b0} };
549 CmnSnoop = { FNX_PCIE_XTR_CMN_SNOOP_WIDTH {1'b0} };
550 CmnResv4 = { FNX_PCIE_XTR_CMN_RESV_4_WIDTH {1'b0} };
551 CmnLength = { FNX_PCIE_XTR_CMN_LENGTH_WIDTH {1'b0} };
552
553 // Reset TLP Request Header Fields
554 ReqBusNum = { FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH {1'b0} };
555 ReqDeviceNum = { FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH {1'b0} };
556 ReqFuncNum = { FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH {1'b0} };
557 ReqTag = { FNX_PCIE_XTR_REQ_TAG_WIDTH {1'b0} };
558
559 // Reset TLP Byte Enable Header Fields
560 BELastDW = { FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH {1'b0} };
561 BEFirstDW = { FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH {1'b0} };
562
563 // Reset TLP Message Header Fields
564 MsgCode = { FNX_PCIE_XTR_MSG_MESSAGE_CODE_WIDTH {1'b0} };
565 MsgRouting = { FNX_PCIE_XTR_MSG_ROUTING_WIDTH {1'b0} };
566 MsgDW3 = { FNX_PCIE_XTR_DW_WIDTH {1'b0} };
567 MsgDW4 = { FNX_PCIE_XTR_DW_WIDTH {1'b0} };
568
569 // Reset TLP Completion Header Fields
570 CmplBusNum = { FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH {1'b0} };
571 CmplDeviceNum = { FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH {1'b0} };
572 CmplFuncNum = { FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH {1'b0} };
573 CmplStatus = { FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH {1'b0} };
574 CmplBCM = { FNX_PCIE_XTR_CMPL_BCM_WIDTH {1'b0} };
575 CmplByteCount = { FNX_PCIE_XTR_CMPL_BYTE_COUNT_WIDTH {1'b0} };
576 CmplResv5 = { FNX_PCIE_XTR_CMPL_RESV_5_WIDTH {1'b0} };
577 CmplLowerAddr = { FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH {1'b0} };
578
579 // Reset TLP Address Header Fields
580 AddrUpper = { FNX_PCIE_XTR_ADDR_UPPER_ADDR_WIDTH {1'b0} };
581 AddrLower = { FNX_PCIE_XTR_ADDR_LOWER_ADDR_WIDTH {1'b0} };
582 AddrResv6 = { FNX_PCIE_XTR_ADDR_RESV_6_WIDTH {1'b0} };
583
584 // Reset TLP Configuration Request Header Fields
585 CfgBusNum = { FNX_PCIE_XTR_CFG_BUS_NUM_WIDTH {1'b0} };
586 CfgDeviceNum = { FNX_PCIE_XTR_CFG_DEVICE_NUM_WIDTH {1'b0} };
587 CfgFuncNum = { FNX_PCIE_XTR_CFG_FUNC_NUM_WIDTH {1'b0} };
588 CfgResv7 = { FNX_PCIE_XTR_CFG_RESV_7_WIDTH {1'b0} };
589 CfgExtRegNum = { FNX_PCIE_XTR_CFG_EXT_REG_NUM_WIDTH {1'b0} };
590 CfgRegNum = { FNX_PCIE_XTR_CFG_REG_NUM_WIDTH {1'b0} };
591 CfgResv8 = { FNX_PCIE_XTR_CFG_RESV_8_WIDTH {1'b0} };
592
593 // DLLP Fields
594 DllpType = { FNX_PCIE_XTR_DLLP_TYPE_WIDTH {1'b0} };
595 DllpLCRC16 = { FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH {1'b0} };
596 AckNakSeqNum = { FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_WIDTH {1'b0} };
597 AckNakResv = { FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_WIDTH {1'b0} };
598 DllpFCResv1 = { FNX_PCIE_XTR_DLLP_FC_RESV_1_WIDTH {1'b0} };
599 DllpFCHdrFC = { FNX_PCIE_XTR_DLLP_FC_HDR_FC_WIDTH {1'b0} };
600 DllpFCResv2 = { FNX_PCIE_XTR_DLLP_FC_RESV_2_WIDTH {1'b0} };
601 DllpFCDataFC = { FNX_PCIE_XTR_DLLP_FC_DATA_FC_WIDTH {1'b0} };
602 DllpPMResv = { FNX_PCIE_XTR_DLLP_PM_RESV_WIDTH {1'b0} };
603 DllpVendorData = { FNX_PCIE_XTR_DLLP_VENDOR_DATA_WIDTH {1'b0} };
604
605 // TLP Data Fields
606 ECRC = { FNX_PCIE_XTR_ECRC_WIDTH {1'b0} };
607
608 // TLP DLL Framing Fields
609 DLLFrmResv9 = { FNX_PCIE_XTR_DLL_FRM_RESV_9_WIDTH {1'b0} };
610 DLLFrmLCRC32 = { FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH {1'b0} };
611 DLLFrmSeqNum = { FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH {1'b0} };
612}
613
614task FNXPCIEXactorPacket::ResetID()
615{
616 XactionID = null;
617 XactionID = new();
618 XactionID.SetContextID( -1 );
619 XactionID.SetStrategyID( -1 );
620 XactionID.SetTransID( -1 );
621}
622
623task FNXPCIEXactorPacket::SetID( CTTransactionID XactionID )
624{
625 this.XactionID.SetTransID( XactionID.GetTransID() );
626 this.XactionID.SetContextID( XactionID.GetContextID() );
627 this.XactionID.SetStrategyID( XactionID.GetStrategyID() );
628}
629
630function CTTransactionID FNXPCIEXactorPacket::GetID()
631{
632 GetID = XactionID;
633}
634
635function string FNXPCIEXactorPacket::GetIDStr()
636{
637 GetIDStr = XactionID.GetString();
638}
639
640function string FNXPCIEXactorPacket::PktToStr()
641{
642 string idStr;
643 string MethodName = "PktToStr";
644
645 // Ensure Packet's Internal State is Up-to-Date
646 UpdatePktState();
647
648 idStr = GetIDStr();
649
650 case (PktType) {
651 FNX_PCIE_XTR_PKT_TYPE_TLP : PktToStr = TlpPktToStr();
652 FNX_PCIE_XTR_PKT_TYPE_DLLP : PktToStr = DllpPktToStr();
653 default : sprintf( PktToStr, "%s %s PktType=%s Content Printing Not Yet Supported",
654 idStr, GetPktPrefixStr(), Util.PktTypeToStr( PktType ) );
655 }
656}
657
658function string FNXPCIEXactorPacket::DllpPktToStr()
659{
660 string tmp, idStr;
661 string MethodName = "DllpPktToStr";
662
663 // Ensure Packet's Internal State is Up-to-Date
664 UpdatePktState();
665
666 idStr = GetIDStr();
667
668 sprintf( DllpPktToStr, "%s %s Header Contents:\n",
669 idStr, GetPktPrefixStr() );
670
671 sprintf( tmp, "%s %s Type=%s LCRC16=%0d'h%h(Gen=%0d)\n",
672 idStr, GetPktPrefixStr(), Util.DllpTypeToStr(DllpType),
673 FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH, DllpLCRC16, GenLCRC16 );
674 DllpPktToStr = { DllpPktToStr, tmp };
675
676 if (isDllpAckNak()) {
677 sprintf( tmp, "%s %s SeqNum=%0d'h%h Resv=%0d'h%h\n",
678 idStr, GetPktPrefixStr(),
679 FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_WIDTH, AckNakSeqNum,
680 FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_WIDTH, AckNakResv );
681 DllpPktToStr = { DllpPktToStr, tmp };
682 }
683
684 if (isDllpPM()) {
685 sprintf( tmp, "%s %s Resv=%0d'h%h\n",
686 idStr, GetPktPrefixStr(),
687 FNX_PCIE_XTR_DLLP_PM_RESV_WIDTH, DllpPMResv );
688 DllpPktToStr = { DllpPktToStr, tmp };
689 }
690
691 if (isDllpFC()) {
692 sprintf( tmp, "%s %s VC=%0d'h%h HdrFC=%0d'h%h DataFC=%0d'h%h\n",
693 idStr, GetPktPrefixStr(),
694 FNX_PCIE_XTR_DLLP_FC_VC_WIDTH, DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_VC_INT_SLC],
695 FNX_PCIE_XTR_DLLP_FC_HDR_FC_WIDTH, DllpFCHdrFC,
696 FNX_PCIE_XTR_DLLP_FC_DATA_FC_WIDTH, DllpFCDataFC );
697 DllpPktToStr = { DllpPktToStr, tmp };
698 sprintf( tmp, "%s %s Resv1=%0d'h%h Resv2=%0d'h%h\n",
699 idStr, GetPktPrefixStr(),
700 FNX_PCIE_XTR_DLLP_FC_RESV_1_WIDTH, DllpFCResv1,
701 FNX_PCIE_XTR_DLLP_FC_RESV_2_WIDTH, DllpFCResv2 );
702 DllpPktToStr = { DllpPktToStr, tmp };
703 }
704
705 if (isDllpVendor()) {
706 sprintf( tmp, "%s %s VendorData=%0d'h%h\n",
707 idStr, GetPktPrefixStr(),
708 FNX_PCIE_XTR_DLLP_VENDOR_DATA_WIDTH, DllpVendorData );
709 DllpPktToStr = { DllpPktToStr, tmp };
710 }
711}
712
713function string FNXPCIEXactorPacket::TlpPktToStr()
714{
715 string tmp, idStr, uppAddrStr, lowAddrStr;
716 string MethodName = "TlpPktToStr";
717
718 // Ensure Packet's Internal State is Up-to-Date
719 UpdatePktState();
720
721 idStr = GetIDStr();
722
723 sprintf( TlpPktToStr, "%s %s Header Contents:\n",
724 idStr, GetPktPrefixStr() );
725
726 // Common Header Fields
727 if (TLPHdrPresVec[FNX_PCIE_XTR_CMN_HDR]) {
728 sprintf( tmp, "%s %s FmtType=%s Fmt:%s\n",
729 idStr, GetPktPrefixStr(), Util.FmtTypeToStr( GetFmtType() ), Util.FmtToStr(CmnFmt) );
730 TlpPktToStr = { TlpPktToStr, tmp };
731 if (CheckFmtTypeOnly) {
732 sprintf( tmp, "%s %s CheckFmtTypeOnly=%0d\n",
733 idStr, GetPktPrefixStr(), CheckFmtTypeOnly );
734 TlpPktToStr = { TlpPktToStr, tmp };
735 }
736 sprintf( tmp, "%s %s TC=%0d'h%h TD=%0d'b%b EP=%0d'b%b RO=%0d'b%b Snoop=%0d'b%b Length=%0d'h%h(%0d)\n",
737 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_CMN_TC_WIDTH, CmnTC,
738 FNX_PCIE_XTR_CMN_TD_WIDTH, CmnTD,
739 FNX_PCIE_XTR_CMN_EP_WIDTH, CmnEP,
740 FNX_PCIE_XTR_CMN_RO_WIDTH, CmnRO,
741 FNX_PCIE_XTR_CMN_SNOOP_WIDTH, CmnSnoop,
742 FNX_PCIE_XTR_CMN_LENGTH_WIDTH, CmnLength, CmnLength );
743 TlpPktToStr = { TlpPktToStr, tmp };
744 }
745
746 // Request Header Fields
747 if (TLPHdrPresVec[FNX_PCIE_XTR_REQ_HDR]) {
748 sprintf( tmp, "%s %s ReqID: BusNum=%0d'h%h DeviceNum=%0d'h%h FuncNum=%0d'h%h\n",
749 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH, ReqBusNum,
750 FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH, ReqDeviceNum,
751 FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH, ReqFuncNum );
752 TlpPktToStr = { TlpPktToStr, tmp };
753 sprintf( tmp, "%s %s ReqTag=%0d'h%h(Gen=%0d)\n",
754 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_REQ_TAG_WIDTH, ReqTag, GenTag );
755 TlpPktToStr = { TlpPktToStr, tmp };
756 }
757
758 // Byte Enable Header Fields
759 if (TLPHdrPresVec[FNX_PCIE_XTR_BE_HDR]) {
760 sprintf( tmp, "%s %s ByteEnables: FirstDW[0:3]=%b%b%b%b LastDW[0:3]=%b%b%b%b\n",
761 idStr, GetPktPrefixStr(), BEFirstDW[0], BEFirstDW[1], BEFirstDW[2], BEFirstDW[3],
762 BELastDW[0], BELastDW[1], BELastDW[2], BELastDW[3] );
763 TlpPktToStr = { TlpPktToStr, tmp };
764 }
765
766 // Message Header Fields
767 if (TLPHdrPresVec[FNX_PCIE_XTR_MSG_HDR]) {
768 sprintf( tmp, "%s %s MsgCode=%s MsgRouting=%s\n",
769 idStr, GetPktPrefixStr(), Util.MsgCodeToStr(MsgCode), Util.MsgRoutingToStr( MsgRouting ) );
770 TlpPktToStr = { TlpPktToStr, tmp };
771 sprintf( tmp, "%s %s MsgDW3=%0d'h%h MsgDW4=%0d'h%h\n",
772 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_DW_WIDTH, MsgDW3,
773 FNX_PCIE_XTR_DW_WIDTH, MsgDW4 );
774 TlpPktToStr = { TlpPktToStr, tmp };
775 }
776
777 // Completion Header Fields
778 if (TLPHdrPresVec[FNX_PCIE_XTR_CMPL_HDR]) {
779 sprintf( tmp, "%s %s ComplID: BusNum=%0d'h%h DeviceNum=%0d'h%h FuncNum=%0d'h%h\n",
780 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH, CmplBusNum,
781 FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH, CmplDeviceNum,
782 FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH, CmplFuncNum );
783 TlpPktToStr = { TlpPktToStr, tmp };
784 sprintf( tmp, "%s %s CmplStatus=%s BCM=%0d'b%b\n",
785 idStr, GetPktPrefixStr(), Util.CmplStatusToStr( CmplStatus ),
786 FNX_PCIE_XTR_CMPL_BCM_WIDTH, CmplBCM );
787 TlpPktToStr = { TlpPktToStr, tmp };
788 sprintf( tmp, "%s %s ByteCount=%0d'h%h(%0d) LowerAddr=%0d'h%h\n",
789 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_CMPL_BYTE_COUNT_WIDTH, CmplByteCount,
790 CmplByteCount, FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH, CmplLowerAddr );
791 TlpPktToStr = { TlpPktToStr, tmp };
792 }
793 // Addressing Header Fields
794 if (TLPHdrPresVec[FNX_PCIE_XTR_LOWER_ADDR_HDR])
795 sprintf( lowAddrStr, "LowerAddr=%0d'h%h", FNX_PCIE_XTR_ADDR_LOWER_ADDR_WIDTH, AddrLower );
796 else
797 lowAddrStr = "";
798
799 if (TLPHdrPresVec[FNX_PCIE_XTR_UPPER_ADDR_HDR])
800 sprintf( uppAddrStr, "UpperAddr=%0d'h%h ", FNX_PCIE_XTR_ADDR_UPPER_ADDR_WIDTH, AddrUpper );
801 else
802 uppAddrStr = "";
803
804 if (TLPHdrPresVec[FNX_PCIE_XTR_LOWER_ADDR_HDR] || TLPHdrPresVec[FNX_PCIE_XTR_UPPER_ADDR_HDR]) {
805 sprintf( tmp, "%s %s %s%s\n",
806 idStr, GetPktPrefixStr(), uppAddrStr, lowAddrStr );
807 TlpPktToStr = { TlpPktToStr, tmp };
808 }
809
810 // Config Header Fields
811 if (TLPHdrPresVec[FNX_PCIE_XTR_CFG_HDR]) {
812 sprintf( tmp, "%s %s CfgID: BusNum=%0d'h%h DeviceNum=%0d'h%h FuncNum=%0d'h%h\n",
813 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_CFG_BUS_NUM_WIDTH, CfgBusNum,
814 FNX_PCIE_XTR_CFG_DEVICE_NUM_WIDTH, CfgDeviceNum,
815 FNX_PCIE_XTR_CFG_FUNC_NUM_WIDTH, CfgFuncNum );
816 TlpPktToStr = { TlpPktToStr, tmp };
817 sprintf( tmp, "%s %s RegNum=%0d'h%h ExtRegNum=%0d'h%h\n",
818 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_CFG_REG_NUM_WIDTH, CfgRegNum,
819 FNX_PCIE_XTR_CFG_EXT_REG_NUM_WIDTH, CfgExtRegNum );
820 TlpPktToStr = { TlpPktToStr, tmp };
821 }
822
823 // Reserved Fields
824 TlpPktToStr = { TlpPktToStr, GetTLPResvFieldsStr() };
825
826 // Payload - Only Printed If Report Threshold >= RTYP_FNX_PCIE_XTR_PYLD
827 if ((PyldPres) && (MyReport.will_this_print(RTYP_FNX_PCIE_XTR_PYLD)))
828 TlpPktToStr = { TlpPktToStr, Util.PyldToStr( Pyld, { idStr, " ", GetPktPrefixStr() }, "Payload" ) };
829
830 // Digest
831 if (CmnTD) {
832 sprintf( tmp, "%s %s ECRC=%0d'h%h\n",
833 idStr, GetPktPrefixStr(), FNX_PCIE_XTR_ECRC_WIDTH, ECRC );
834 TlpPktToStr = { TlpPktToStr, tmp };
835 }
836
837 // DLL Framing
838// sprintf( tmp, "%s %s DLL Frame: SeqNum=%0d'h%h(Gen=%0d) LCRC32=%0d'h%h(Gen=%0d)",
839
840// FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH, DLLFrmSeqNum, GenSeqNum,
841// FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH, DLLFrmLCRC32, GenLCRC32 );
842 sprintf( tmp, "%s %s DLL Frame: SeqNum=%0d'h%h(Gen=%0d) LCRC32=%0d'h%h(Gen=%0d) End_symbol=%9'h%h",
843 idStr, GetPktPrefixStr(),
844 FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH, DLLFrmSeqNum, GenSeqNum,
845 FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH, DLLFrmLCRC32, GenLCRC32, EndFrame );
846 TlpPktToStr = { TlpPktToStr, tmp };
847}
848
849task FNXPCIEXactorPacket::PktDisplay( ReportType TypeRep,
850 string Message )
851{
852 QuickReport( MyReport, TypeRep, { GetIDStr(), " ", Message, "\n", PktToStr() } );
853}
854
855function bit FNXPCIEXactorPacket::PktCompare( string Operator,
856 XactorBasePacket ExtPkt )
857{
858 bit [FNX_PCIE_XTR_EXPECT_PKT_MAX-1:0] ExpectedA;
859 bit [FNX_PCIE_XTR_EXPECT_PKT_MAX-1:0] ExpectedB;
860 FNXPCIEXactorPacket Pkt;
861 string MethodName = "PktCompare";
862
863 cast_assign(Pkt, ExtPkt);
864
865 if (Pkt.CheckFmtTypeOnly) {
866 case (Operator) {
867 "===" : {
868 if (this.GetFmtType() === Pkt.GetFmtType())
869 PktCompare = 1'b1;
870 else
871 PktCompare = 1'b0;
872 }
873 ">": {
874 if (this.GetFmtType() > Pkt.GetFmtType())
875 PktCompare = 1'b1;
876 else
877 PktCompare = 1'b0;
878 }
879 "<": {
880 if (this.GetFmtType() < Pkt.GetFmtType())
881 PktCompare = 1'b1;
882 else
883 PktCompare = 1'b0;
884 }
885 "=?=" : {
886 if (this.GetFmtType() =?= Pkt.GetFmtType())
887 PktCompare = 1'b1;
888 else
889 PktCompare = 1'b0;
890 }
891 default : PCIEX_QR_ERR( "%s -> Invalid Packet Compare Operator: %s", XactorName, Operator );
892 }
893 return;
894 }
895
896 // Get the expected values for the packets that will be compared
897 ExpectedA = this.FormExpected();
898 ExpectedB = Pkt.FormExpected();
899
900 ReceivedReqTag = this.Get("ReqTag");
901
902 case (Operator) {
903
904 // For the following cases A refers to this packet and
905 // B refers to the external packet passed as an argument
906
907 "===": {
908 if (ExpectedA === ExpectedB)
909 PktCompare = 1'b1;
910 else
911 PktCompare = 1'b0;
912 }
913
914 ">": {
915 if (ExpectedA > ExpectedB)
916 PktCompare = 1'b1;
917 else
918 PktCompare = 1'b0;
919 }
920
921 "<": {
922 if (ExpectedA < ExpectedB)
923 PktCompare = 1'b1;
924 else
925 PktCompare = 1'b0;
926 }
927
928 "=?=": {
929 if (ExpectedA =?= ExpectedB)
930 PktCompare = 1'b1;
931 else
932 PktCompare = 1'b0;
933 }
934 default : PCIEX_QR_ERR( "%s -> Invalid Packet Compare Operator: %s", XactorName, Operator );
935 }
936}
937
938function integer FNXPCIEXactorPacket::PktHash(integer HashSize)
939{
940 bit [FNX_PCIE_XTR_EXPECT_PKT_MAX-1:0] ThisExpected;
941
942 ThisExpected = this.FormExpected();
943 PktHash = ThisExpected % HashSize;
944}
945
946// Returns 1 if the expected value of this packet has X's or Z's and 0 otherwise
947function bit FNXPCIEXactorPacket::PktUndef()
948{
949 bit [FNX_PCIE_XTR_EXPECT_PKT_MAX-1:0] ThisExpected;
950
951 ThisExpected = this.FormExpected();
952 PktUndef = Util.FindXValues(ThisExpected);
953}
954
955task FNXPCIEXactorPacket::PktCopy( XactorBasePacket Pkt )
956{
957 FNXPCIEXactorPacket PCIEPkt;
958 CTTransactionID tempID;
959 integer i;
960 bit cast_ok;
961 string MethodName = "PktCopy";
962
963 cast_ok = cast_assign( PCIEPkt, Pkt, CHECK );
964 if (cast_ok == 0) {
965 PCIEX_QR_ERR( "%s %s -> Destination Packet Type Not FNXPCIEXactorPacket.",
966 XactionID.GetSString(), XactorName );
967 return;
968 }
969
970 SetID( PCIEPkt.GetID() );
971
972 // Utilities
973 Util = PCIEPkt.Util;
974
975 // TLP Common Header Fields
976 CmnResv1 = PCIEPkt.CmnResv1;
977 CmnFmt = PCIEPkt.CmnFmt;
978 CmnType = PCIEPkt.CmnType;
979 CmnResv2 = PCIEPkt.CmnResv2;
980 CmnTC = PCIEPkt.CmnTC;
981 CmnResv3 = PCIEPkt.CmnResv3;
982 CmnTD = PCIEPkt.CmnTD;
983 CmnEP = PCIEPkt.CmnEP;
984 CmnRO = PCIEPkt.CmnRO;
985 CmnSnoop = PCIEPkt.CmnSnoop;
986 CmnResv4 = PCIEPkt.CmnResv4;
987 CmnLength = PCIEPkt.CmnLength;
988
989 // TLP Request Header Fields
990 ReqBusNum = PCIEPkt.ReqBusNum;
991 ReqDeviceNum = PCIEPkt.ReqDeviceNum;
992 ReqFuncNum = PCIEPkt.ReqFuncNum;
993 ReqTag = PCIEPkt.ReqTag;
994
995 // TLP Byte Enable Header Fields
996 BELastDW = PCIEPkt.BELastDW;
997 BEFirstDW = PCIEPkt.BEFirstDW;
998
999 // TLP Message Header Fields
1000 MsgCode = PCIEPkt.MsgCode;
1001 MsgRouting = PCIEPkt.MsgRouting;
1002 MsgDW3 = PCIEPkt.MsgDW3;
1003 MsgDW4 = PCIEPkt.MsgDW4;
1004
1005 // TLP Completion Header Fields
1006 CmplBusNum = PCIEPkt.CmplBusNum;
1007 CmplDeviceNum = PCIEPkt.CmplDeviceNum;
1008 CmplFuncNum = PCIEPkt.CmplFuncNum;
1009 CmplStatus = PCIEPkt.CmplStatus;
1010 CmplBCM = PCIEPkt.CmplBCM;
1011 CmplByteCount = PCIEPkt.CmplByteCount;
1012 CmplResv5 = PCIEPkt.CmplResv5;
1013 CmplLowerAddr = PCIEPkt.CmplLowerAddr;
1014
1015 // TLP Address Header Fields
1016 AddrUpper = PCIEPkt.AddrUpper;
1017 AddrLower = PCIEPkt.AddrLower;
1018 AddrResv6 = PCIEPkt.AddrResv6;
1019
1020 // TLP Configuration Request Header Fields
1021 CfgBusNum = PCIEPkt.CfgBusNum;
1022 CfgDeviceNum = PCIEPkt.CfgDeviceNum;
1023 CfgFuncNum = PCIEPkt.CfgFuncNum;
1024 CfgResv7 = PCIEPkt.CfgResv7;
1025 CfgExtRegNum = PCIEPkt.CfgExtRegNum;
1026 CfgRegNum = PCIEPkt.CfgRegNum;
1027 CfgResv8 = PCIEPkt.CfgResv8;
1028
1029 // TLP Data Fields
1030 ECRC = PCIEPkt.ECRC;
1031 PCIEPkt.GetPyld( Pyld );
1032 NumPyldBytes = PCIEPkt.NumPyldBytes;
1033
1034 // TLP DLL Framing Fields
1035 DLLFrmResv9 = PCIEPkt.DLLFrmResv9;
1036 DLLFrmSeqNum = PCIEPkt.DLLFrmSeqNum;
1037 DLLFrmLCRC32 = PCIEPkt.DLLFrmLCRC32;
1038
1039 // TLP Field Generation Control
1040 GenTag = PCIEPkt.GenTag;
1041 GenECRC = PCIEPkt.GenECRC;
1042 GenSeqNum = PCIEPkt.GenSeqNum;
1043 GenLCRC32 = PCIEPkt.GenLCRC32;
1044
1045 // DLLP Fields
1046 DllpType = PCIEPkt.DllpType;
1047 DllpLCRC16 = PCIEPkt.DllpLCRC16;
1048 AckNakSeqNum = PCIEPkt.AckNakSeqNum;
1049 AckNakResv = PCIEPkt.AckNakResv;
1050 DllpFCResv1 = PCIEPkt.DllpFCResv1;
1051 DllpFCHdrFC = PCIEPkt.DllpFCHdrFC;
1052 DllpFCResv2 = PCIEPkt.DllpFCResv2;
1053 DllpFCDataFC = PCIEPkt.DllpFCDataFC;
1054 DllpPMResv = PCIEPkt.DllpPMResv;
1055 DllpVendorData = PCIEPkt.DllpVendorData;
1056
1057 // DLLP Field Generation Control
1058 GenLCRC16 = PCIEPkt.GenLCRC16;
1059
1060 // Error Injection Control
1061 DenaliErr = PCIEPkt.DenaliErr;
1062
1063 // Local Variables
1064 XactorName = PCIEPkt.XactorName;
1065 PktType = PCIEPkt.PktType;
1066
1067 IgnoreTlpReqTag = PCIEPkt.IgnoreTlpReqTag;
1068 ReceivedReqTag = PCIEPkt.ReceivedReqTag;
1069}
1070
1071// This task will return a packet of its same type and with the same field values
1072function XactorBasePacket FNXPCIEXactorPacket::PktClone()
1073{
1074 // Packet to be cloned
1075 FNXPCIEXactorPacket ClonedPkt;
1076 ClonedPkt = new( MyReport, XactorName, Util, PortNum );
1077
1078 // Set XactionID of ClonedPkt
1079 ClonedPkt.SetID(this.XactionID);
1080
1081 // Copy the contents of this packet to ClonedPkt
1082 ClonedPkt.PktCopy(this);
1083
1084 PktClone = ClonedPkt;
1085}
1086
1087function XactorBasePacket FNXPCIEXactorPacket::FormDriven()
1088{
1089 // Ensure Packet's Internal State is Up-to-Date
1090 UpdatePktState();
1091
1092 FormDriven = this;
1093}
1094
1095function bit [FNX_PCIE_XTR_EXPECT_PKT_MAX-1:0] FNXPCIEXactorPacket::FormExpected()
1096{
1097 bit [FNX_PCIE_XTR_DW_WIDTH-1:0] tlpHdrDW1, tlpHdrDW2, tlpHdrDW3, tlpHdrDW4, dllpDW1;
1098 bit [FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH-1:0] dllPrefix;
1099 integer i, totalBits, dllPrefixStart, hdrStart, pyldStart, ecrcStart, lcrcStart;
1100 string MethodName = "FormExpected";
1101
1102 // Initialize Expected Vector to Zero
1103 FormExpected = 0;
1104
1105 // Ensure Packet's Internal State is Up-to-Date
1106 UpdatePktState();
1107
1108 ///////////////////////////////////////////////////////
1109 // Begin -> Create TLP Expect Vector
1110 //
1111 if (isTlp()) {
1112
1113 // Determine Total Number of Bits in Packet
1114 totalBits = FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH + // DLL Framing
1115 FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH;
1116 totalBits += NumTLPHdrDWs * FNX_PCIE_XTR_DW_WIDTH; // Header
1117 if ((GenECRC) && (CmnTD === 1)) // Digest
1118 totalBits += FNX_PCIE_XTR_ECRC_WIDTH;
1119 if (PyldPres) // Payload
1120 totalBits += Pyld.size() * 8;
1121
1122 // Determine Starting Position of Various Packet Components
1123 dllPrefixStart = totalBits;
1124 hdrStart = dllPrefixStart - FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH;
1125 pyldStart = hdrStart - (NumTLPHdrDWs * FNX_PCIE_XTR_DW_WIDTH);
1126 if ((GenECRC) && (CmnTD === 1)) {
1127 ecrcStart = pyldStart - (Pyld.size() * 8);
1128 lcrcStart = ecrcStart - FNX_PCIE_XTR_ECRC_WIDTH;
1129 }
1130 else
1131 lcrcStart = pyldStart - (Pyld.size() * 8);
1132
1133
1134 dllPrefix[ FNX_PCIE_XTR_DLL_FRM_PREFIX_RESV_9_SLC ] = DLLFrmResv9;
1135 if (GenSeqNum)
1136 dllPrefix[ FNX_PCIE_XTR_DLL_FRM_PREFIX_SEQ_NUM_SLC ] = { FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH {1'bx} };
1137 else
1138 dllPrefix[ FNX_PCIE_XTR_DLL_FRM_PREFIX_SEQ_NUM_SLC ] = DLLFrmSeqNum;
1139
1140 // Create First DW of Common TLP Header
1141 if (TLPHdrPresVec[ FNX_PCIE_XTR_CMN_HDR ]) {
1142 tlpHdrDW1[ FNX_PCIE_XTR_CMN_RESV_1_SLC ] = CmnResv1;
1143 tlpHdrDW1[ FNX_PCIE_XTR_CMN_FORMAT_SLC ] = CmnFmt;
1144 tlpHdrDW1[ FNX_PCIE_XTR_CMN_TYPE_SLC ] = CmnType;
1145 tlpHdrDW1[ FNX_PCIE_XTR_CMN_RESV_2_SLC ] = CmnResv2;
1146 tlpHdrDW1[ FNX_PCIE_XTR_CMN_TC_SLC ] = CmnTC;
1147 tlpHdrDW1[ FNX_PCIE_XTR_CMN_RESV_3_SLC ] = CmnResv3;
1148 tlpHdrDW1[ FNX_PCIE_XTR_CMN_TD_SLC ] = CmnTD;
1149 tlpHdrDW1[ FNX_PCIE_XTR_CMN_EP_SLC ] = CmnEP;
1150 tlpHdrDW1[ FNX_PCIE_XTR_CMN_RO_SLC ] = CmnRO;
1151 tlpHdrDW1[ FNX_PCIE_XTR_CMN_SNOOP_SLC ] = CmnSnoop;
1152 tlpHdrDW1[ FNX_PCIE_XTR_CMN_RESV_4_SLC ] = CmnResv4;
1153 tlpHdrDW1[ FNX_PCIE_XTR_CMN_LENGTH_SLC ] = CmnLength;
1154
1155 if (isTlpMessage())
1156 tlpHdrDW1[ FNX_PCIE_XTR_MSG_CMN_ROUTING_SLC ] = MsgRouting;
1157 }
1158
1159 // Create Second DW of Mem, IO, Config & Msg Request Packets
1160 if ( isTlpRequest() ) {
1161 tlpHdrDW2[ FNX_PCIE_XTR_REQ_REQUESTER_ID_SLC ] = GetReqId();
1162 if (GenTag || IgnoreTlpReqTag)
1163 tlpHdrDW2[ FNX_PCIE_XTR_REQ_TAG_SLC ] = { FNX_PCIE_XTR_REQ_TAG_WIDTH {1'bx} };
1164 else
1165 tlpHdrDW2[ FNX_PCIE_XTR_REQ_TAG_SLC ] = ReqTag;
1166 tlpHdrDW2[ FNX_PCIE_XTR_BE_LAST_DW_BE_SLC ] = BELastDW;
1167 tlpHdrDW2[ FNX_PCIE_XTR_BE_FIRST_DW_BE_SLC ] = BEFirstDW;
1168 }
1169
1170 // Create Second, Third & Fourth DWs of Message Packets
1171 if ( isTlpMessage() ) {
1172
1173 tlpHdrDW2[ FNX_PCIE_XTR_MSG_MESSAGE_CODE_SLC ] = MsgCode;
1174 tlpHdrDW3 = MsgDW3;
1175 tlpHdrDW4 = MsgDW4;
1176 }
1177
1178 // Create Second and Third DWs of Completion Packets
1179 if ( isTlpCompletion() ) {
1180
1181 // Completion - Second DW
1182 tlpHdrDW2[ FNX_PCIE_XTR_CMPL_COMPLETER_ID_SLC ] = GetCmplId();
1183 tlpHdrDW2[ FNX_PCIE_XTR_CMPL_CMPL_STATUS_SLC ] = CmplStatus;
1184 tlpHdrDW2[ FNX_PCIE_XTR_CMPL_BCM_SLC ] = CmplBCM;
1185 tlpHdrDW2[ FNX_PCIE_XTR_CMPL_BYTE_COUNT_SLC ] = CmplByteCount;
1186
1187 // Completion - Third DW
1188 tlpHdrDW3[ FNX_PCIE_XTR_REQ_REQUESTER_ID_SLC ] = GetReqId();
1189 if (GenTag)
1190 tlpHdrDW3[ FNX_PCIE_XTR_REQ_TAG_SLC ] = { FNX_PCIE_XTR_REQ_TAG_WIDTH {1'bx} };
1191 else
1192 tlpHdrDW3[ FNX_PCIE_XTR_REQ_TAG_SLC ] = ReqTag;
1193 tlpHdrDW3[ FNX_PCIE_XTR_CMPL_RESV_5_SLC ] = CmplResv5;
1194 tlpHdrDW3[ FNX_PCIE_XTR_CMPL_LOWER_ADDR_SLC ] = CmplLowerAddr;
1195 }
1196
1197 // Create Third DW of 32-bit Mem and IO Request Packets
1198 if ( (isTlpIORequest()) || (isTlpMemRequest32()) ) {
1199 tlpHdrDW3[ FNX_PCIE_XTR_ADDR_LOWER_ADDR_SLC ] = AddrLower;
1200 tlpHdrDW3[ FNX_PCIE_XTR_ADDR_RESV_6_SLC ] = AddrResv6;
1201 }
1202
1203 // Create Third DW of Config Request Packets
1204 if ( isTlpCfgRequest() ) {
1205 tlpHdrDW3[ FNX_PCIE_XTR_CFG_CONFIG_ID_SLC ] = GetCfgId();
1206 tlpHdrDW3[ FNX_PCIE_XTR_CFG_RESV_7_SLC ] = CfgResv7;
1207 tlpHdrDW3[ FNX_PCIE_XTR_CFG_EXT_REG_NUM_SLC ] = CfgExtRegNum;
1208 tlpHdrDW3[ FNX_PCIE_XTR_CFG_REG_NUM_SLC ] = CfgRegNum;
1209 tlpHdrDW3[ FNX_PCIE_XTR_CFG_RESV_8_SLC ] = CfgResv8;
1210 }
1211
1212 // Create Fourth DW of 64-bit Mem Request Packets
1213 if ( isTlpMemRequest64() ) {
1214
1215 // 64-bit Mem Request - Third DW
1216 tlpHdrDW3[ FNX_PCIE_XTR_ADDR_UPPER_ADDR_SLC ] = AddrUpper;
1217
1218 // 64-bit Mem Request - Fourth DW
1219 tlpHdrDW4[ FNX_PCIE_XTR_ADDR_LOWER_ADDR_SLC ] = AddrLower;
1220 tlpHdrDW4[ FNX_PCIE_XTR_ADDR_RESV_6_SLC ] = AddrResv6;
1221 }
1222
1223
1224 FormExpected[ dllPrefixStart-1:dllPrefixStart-FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH ] = dllPrefix;
1225
1226 // Add TLP Headers To The Expected Vector
1227 if (NumTLPHdrDWs == 3)
1228 FormExpected[ hdrStart-1:hdrStart-NumTLPHdrDWs*FNX_PCIE_XTR_DW_WIDTH ] = { tlpHdrDW1, tlpHdrDW2, tlpHdrDW3 };
1229 if (NumTLPHdrDWs == 4)
1230 FormExpected[ hdrStart-1:hdrStart-NumTLPHdrDWs*FNX_PCIE_XTR_DW_WIDTH ] = { tlpHdrDW1, tlpHdrDW2, tlpHdrDW3, tlpHdrDW4 };
1231
1232 // Add Payload To The Expected Vector If Present
1233 if (PyldPres) {
1234 for (i=0; i<NumPyldBytes; i++)
1235 FormExpected[pyldStart-i*8-1:pyldStart-i*8-8] = Pyld[i];
1236 }
1237
1238 // Add ECRC To The Expected Vector If Generated
1239 if ((GenECRC) && (CmnTD === 1))
1240 FormExpected[ecrcStart-1:ecrcStart-FNX_PCIE_XTR_ECRC_WIDTH] = ECRC;
1241
1242 // Add 32-bit LCRC to Expected Vector
1243 if (GenLCRC32)
1244 FormExpected[lcrcStart-1:lcrcStart-FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH] = { FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH {1'bx} };
1245 else
1246 FormExpected[lcrcStart-1:lcrcStart-FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH] = DLLFrmLCRC32 ;
1247 }
1248 // End -> Create TLP Expect Vector
1249 ///////////////////////////////////////////////////////
1250
1251 ///////////////////////////////////////////////////////
1252 // Begin -> Create DLLP Expect Vector
1253 //
1254 if (isDllp()) {
1255 totalBits = FNX_PCIE_XTR_NUM_DLLP_BYTES*8;
1256
1257 // Add DLLP Type
1258 dllpDW1[ FNX_PCIE_XTR_DLLP_TYPE_SLC ] = DllpType;
1259
1260 // Add Ack/Nak DLLP Fields
1261 if (isDllpAckNak()) {
1262 dllpDW1[ FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_SLC ] = AckNakSeqNum;
1263 dllpDW1[ FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_SLC ] = AckNakResv;
1264 }
1265
1266 // Add FC DLLP Fields
1267 if (isDllpFC()) {
1268 dllpDW1[ FNX_PCIE_XTR_DLLP_FC_RESV_1_SLC ] = DllpFCResv1;
1269 dllpDW1[ FNX_PCIE_XTR_DLLP_FC_HDR_FC_SLC ] = DllpFCHdrFC;
1270 dllpDW1[ FNX_PCIE_XTR_DLLP_FC_RESV_2_SLC ] = DllpFCResv2;
1271 dllpDW1[ FNX_PCIE_XTR_DLLP_FC_DATA_FC_SLC ] = DllpFCDataFC;
1272 }
1273
1274 // Add PM DLLP Fields
1275 if (isDllpPM()) {
1276 dllpDW1[ FNX_PCIE_XTR_DLLP_PM_RESV_SLC ] = DllpPMResv;
1277 }
1278
1279 // Add Vendor DLLP Fields
1280 if (isDllpVendor()) {
1281 dllpDW1[ FNX_PCIE_XTR_DLLP_VENDOR_DATA_SLC ] = DllpVendorData;
1282 }
1283
1284 // Create Expected Vector From DLLP DW 1 and 16-bit LCRC
1285 if (GenLCRC16)
1286 FormExpected[totalBits-1:0] = { dllpDW1, { FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH {1'bx} } };
1287 else
1288 FormExpected[totalBits-1:0] = { dllpDW1, DllpLCRC16 };
1289 }
1290 // End -> Create DLLP Expect Vector
1291 ///////////////////////////////////////////////////////
1292
1293 PCIEX_QR_D3( "%s %s -> Expected Vector Created:\n Data=%h",
1294 GetIDStr(), XactorName, FormExpected[totalBits-1:0] );
1295}
1296
1297task FNXPCIEXactorPacket::UpdatePktState()
1298{
1299 integer i;
1300 string MethodName = "UpdatePktState";
1301
1302 if (PktStateUpdated)
1303 return;
1304
1305 ///////////////////////////////////////////////////////
1306 // Begin -> TLP Parsing
1307 //
1308 if (isTlp()) {
1309
1310 // Determine Number of DWs in TLP and if Data Payload is Present
1311 case (CmnFmt) {
1312 2'b00 : { // 3 DW header, no data payload
1313 NumTLPHdrDWs = 3;
1314 PyldPres = 0;
1315 }
1316 2'b01 : { // 4 DW header, no data payload
1317 NumTLPHdrDWs = 4;
1318 PyldPres = 0;
1319 }
1320 2'b10 : { // 3 DW header, with data payload
1321 NumTLPHdrDWs = 3;
1322 PyldPres = 1;
1323 }
1324 2'b11 : { // 4 DW header, with data payload
1325 NumTLPHdrDWs = 4;
1326 PyldPres = 1;
1327 }
1328 default : PCIEX_QR_ERR("%s %s -> Hit default case element CmnFmt=%h",
1329 XactionID.GetSString(), XactorName, CmnFmt );
1330 }
1331
1332 // Initially Set Common Header as Present
1333 TLPHdrPresVec[ FNX_PCIE_XTR_CMN_HDR ] = 1;
1334
1335 // Determine Other Header Presence From Packet Type
1336
1337 // Message Request Headers Present
1338 if ( (Util.FmtTypeIsMsg(GetFmtType())) ||
1339 (Util.FmtTypeIsMsgD(GetFmtType())) ) {
1340
1341 TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] = 1;
1342 TLPHdrPresVec[ FNX_PCIE_XTR_MSG_HDR ] = 1;
1343 }
1344 else { // Not a MSG or MSGD Request Packet
1345
1346 case (GetFmtType()) {
1347
1348 // 32-bit Memory Read/Write Request Headers Present
1349 FNX_PCIE_XTR_FMT_TYPE_MRD_32,
1350 FNX_PCIE_XTR_FMT_TYPE_MRDLK_32,
1351 FNX_PCIE_XTR_FMT_TYPE_MWR_32 : {
1352 TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] = 1;
1353 TLPHdrPresVec[ FNX_PCIE_XTR_BE_HDR ] = 1;
1354 TLPHdrPresVec[ FNX_PCIE_XTR_LOWER_ADDR_HDR ] = 1;
1355 }
1356
1357 // 64-bit Memory Read/Write Request Headers Present
1358 FNX_PCIE_XTR_FMT_TYPE_MRD_64,
1359 FNX_PCIE_XTR_FMT_TYPE_MRDLK_64,
1360 FNX_PCIE_XTR_FMT_TYPE_MWR_64 : {
1361 TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] = 1;
1362 TLPHdrPresVec[ FNX_PCIE_XTR_BE_HDR ] = 1;
1363 TLPHdrPresVec[ FNX_PCIE_XTR_LOWER_ADDR_HDR ] = 1;
1364 TLPHdrPresVec[ FNX_PCIE_XTR_UPPER_ADDR_HDR ] = 1;
1365 }
1366
1367 // I/O Read/Write Request Headers Present
1368 FNX_PCIE_XTR_FMT_TYPE_IORD,
1369 FNX_PCIE_XTR_FMT_TYPE_IOWR : {
1370 TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] = 1;
1371 TLPHdrPresVec[ FNX_PCIE_XTR_BE_HDR ] = 1;
1372 TLPHdrPresVec[ FNX_PCIE_XTR_LOWER_ADDR_HDR ] = 1;
1373 }
1374
1375 // Configuration Read/Write Request Headers Present
1376 FNX_PCIE_XTR_FMT_TYPE_CFGRD0,
1377 FNX_PCIE_XTR_FMT_TYPE_CFGWR0,
1378 FNX_PCIE_XTR_FMT_TYPE_CFGRD1,
1379 FNX_PCIE_XTR_FMT_TYPE_CFGWR1 : {
1380 TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] = 1;
1381 TLPHdrPresVec[ FNX_PCIE_XTR_BE_HDR ] = 1;
1382 TLPHdrPresVec[ FNX_PCIE_XTR_CFG_HDR ] = 1;
1383 }
1384
1385 // Completion Pakcet Headers Present
1386 FNX_PCIE_XTR_FMT_TYPE_CPL,
1387 FNX_PCIE_XTR_FMT_TYPE_CPLD,
1388 FNX_PCIE_XTR_FMT_TYPE_CPLLK,
1389 FNX_PCIE_XTR_FMT_TYPE_CPLDLK : {
1390 TLPHdrPresVec[ FNX_PCIE_XTR_CMPL_HDR ] = 1;
1391 TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] = 1;
1392 }
1393
1394 default : PCIEX_QR_ERR("%s %s -> Hit default case element fmtType=%h",
1395 XactionID.GetSString(), XactorName, GetFmtType() );
1396 }
1397 }
1398
1399 ///////////////////////////////////////////////////////
1400 // Begin -> Parse TLP Reserved Field Information
1401 //
1402 // all packets have DLL framing Resv field 9
1403 TLPResvFieldsPresVec[9] = 1;
1404 NumTLPResvFieldsPres = 1;
1405
1406 // common TLP header has Resv fields 1-4
1407 if (TLPHdrPresVec[ FNX_PCIE_XTR_CMN_HDR ]) {
1408 TLPResvFieldsPresVec[1] = 1;
1409 TLPResvFieldsPresVec[2] = 1;
1410 TLPResvFieldsPresVec[3] = 1;
1411 TLPResvFieldsPresVec[4] = 1;
1412 NumTLPResvFieldsPres += 4;
1413 }
1414
1415 // cmpl TLP header has Resv field 5
1416 if (TLPHdrPresVec[ FNX_PCIE_XTR_CMPL_HDR ]) {
1417 TLPResvFieldsPresVec[5] = 1;
1418 NumTLPResvFieldsPres++;
1419 }
1420 // lower addr TLP header has Resv field 6
1421 if (TLPHdrPresVec[ FNX_PCIE_XTR_LOWER_ADDR_HDR ]) {
1422 TLPResvFieldsPresVec[6] = 1;
1423 NumTLPResvFieldsPres++;
1424 }
1425
1426 // config TLP header has Resv fields 7-8
1427 if (TLPHdrPresVec[ FNX_PCIE_XTR_CFG_HDR ]) {
1428 TLPResvFieldsPresVec[7] = 1;
1429 TLPResvFieldsPresVec[8] = 1;
1430 NumTLPResvFieldsPres += 2;
1431 }
1432
1433 // determine if any present reserved fields are non-zero
1434 TLPNonZeroResvFieldsPres = 0;
1435 NonZeroTLPResvFieldsPresVec = 0;
1436 for (i=1; i<=FNX_PCIE_XTR_NUM_RESV_FIELDS; i++) {
1437 if (TLPResvFieldsPresVec[i]) {
1438 if (GetTLPResvFieldVal(i) !== 0) {
1439 TLPNonZeroResvFieldsPres = 1;
1440 NonZeroTLPResvFieldsPresVec[i] = 1;
1441 }
1442 }
1443 }
1444 // End -> Parse TLP Reserved Field Information
1445 ///////////////////////////////////////////////////////
1446 }
1447 // End -> TLP Parsing
1448 ///////////////////////////////////////////////////////
1449
1450 ///////////////////////////////////////////////////////
1451 // Begin -> DLLP Parsing
1452 //
1453 if (isDllp()) {
1454 }
1455 // End -> DLLP Parsing
1456 ///////////////////////////////////////////////////////
1457
1458 // Mark Internal Packet State as Updated
1459 PktStateUpdated = 1;
1460}
1461
1462task FNXPCIEXactorPacket::Set( string FieldType, bit [ XACT_FIELD_WIDTH-1:0 ] FieldValue )
1463{
1464 integer denaliErr;
1465 string MethodName = "Set";
1466
1467 // Mark Internal Packet State as Stale
1468 PktStateUpdated = 0;
1469
1470 case ( FieldType ) {
1471
1472 "CmnFmt" : {
1473 CmnFmt = FieldValue[ FNX_PCIE_XTR_CMN_FORMAT_WIDTH-1:0 ];
1474 }
1475
1476 "CmnType" : {
1477 CmnType = FieldValue[ FNX_PCIE_XTR_CMN_TYPE_WIDTH-1:0 ];
1478 }
1479
1480 "CmnFmtType" : {
1481 CmnFmt = FieldValue[ FNX_PCIE_XTR_FMT_TYPE_FMT_INT_SLC ];
1482 CmnType = FieldValue[ FNX_PCIE_XTR_FMT_TYPE_TYPE_INT_SLC ];
1483 }
1484
1485 "CmnTC" : {
1486 CmnTC = FieldValue[ FNX_PCIE_XTR_CMN_TC_WIDTH-1:0 ];
1487 }
1488
1489 "CmnTD" : {
1490 CmnTD = FieldValue[ FNX_PCIE_XTR_CMN_TD_WIDTH-1:0 ];
1491 }
1492
1493 "CmnEP" : {
1494 CmnEP = FieldValue[ FNX_PCIE_XTR_CMN_EP_WIDTH-1:0 ];
1495 }
1496
1497 "CmnRO" : {
1498 CmnRO = FieldValue[ FNX_PCIE_XTR_CMN_RO_WIDTH-1:0 ];
1499 }
1500
1501 "CmnSnoop" : {
1502 CmnSnoop = FieldValue[ FNX_PCIE_XTR_CMN_SNOOP_WIDTH-1:0 ];
1503 }
1504
1505 "CmnAttr" : {
1506 SetAttr( FieldValue[ FNX_PCIE_XTR_CMN_ATTR_WIDTH-1:0 ] );
1507 }
1508
1509 "CmnLength" : {
1510 CmnLength = FieldValue[ FNX_PCIE_XTR_CMN_LENGTH_WIDTH-1:0 ];
1511 }
1512
1513 "ReqBusNum" : {
1514 ReqBusNum = FieldValue[ FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH-1:0 ];
1515 }
1516
1517 "ReqDeviceNum" : {
1518 ReqDeviceNum = FieldValue[ FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH-1:0 ];
1519 }
1520
1521 "ReqFuncNum" : {
1522 ReqFuncNum = FieldValue[ FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH-1:0 ];
1523 }
1524
1525 "ReqId" : {
1526 SetReqId( FieldValue[FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] );
1527 }
1528
1529 "ReqTag" : {
1530 ReqTag = FieldValue[ FNX_PCIE_XTR_REQ_TAG_WIDTH-1:0 ];
1531 }
1532
1533 "BELastDW" : {
1534 BELastDW = FieldValue[ FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH-1:0 ];
1535 }
1536
1537 "BEFirstDW" : {
1538 BEFirstDW = FieldValue[ FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH-1:0 ];
1539 }
1540
1541 "MsgCode" : {
1542 MsgCode = FieldValue[ FNX_PCIE_XTR_MSG_MESSAGE_CODE_WIDTH-1:0 ];
1543 MsgRouting = FieldValue[ FNX_PCIE_XTR_MSG_ROUTING_WIDTH-1:0 ];
1544 }
1545
1546 "MsgRouting" : {
1547 MsgRouting = FieldValue[ FNX_PCIE_XTR_MSG_ROUTING_WIDTH-1:0 ];
1548 }
1549
1550 "MsgDW3" : {
1551 MsgDW3 = FieldValue[FNX_PCIE_XTR_DW_WIDTH-1:0];
1552 }
1553
1554 "MsgDW4" : {
1555 MsgDW4 = FieldValue[FNX_PCIE_XTR_DW_WIDTH-1:0];
1556 }
1557
1558 "CmplBusNum" : {
1559 CmplBusNum = FieldValue[ FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH-1:0 ];
1560 }
1561
1562 "CmplDeviceNum" : {
1563 CmplDeviceNum = FieldValue[ FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH-1:0 ];
1564 }
1565
1566 "CmplFuncNum" : {
1567 CmplFuncNum = FieldValue[ FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH-1:0 ];
1568 }
1569
1570 "CmplId" : {
1571 SetCmplId( FieldValue[ FNX_PCIE_XTR_CMPL_COMPLETER_ID_WIDTH-1:0 ] );
1572 }
1573
1574 "CmplStatus" : {
1575 CmplStatus = FieldValue[ FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH-1:0 ];
1576 }
1577
1578 "CmplBCM" : {
1579 CmplBCM = FieldValue[ FNX_PCIE_XTR_CMPL_BCM_WIDTH-1:0 ];
1580 }
1581
1582 "CmplByteCount" : {
1583 CmplByteCount = FieldValue[ FNX_PCIE_XTR_CMPL_BYTE_COUNT_WIDTH-1:0 ];
1584 }
1585
1586 "CmplLowerAddr" : {
1587 CmplLowerAddr = FieldValue[ FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH-1:0 ];
1588 }
1589
1590 "AddrUpper" : {
1591 AddrUpper = FieldValue[ FNX_PCIE_XTR_ADDR_UPPER_ADDR_WIDTH-1:0 ];
1592 }
1593
1594 "AddrLower" : {
1595 AddrLower = FieldValue[ FNX_PCIE_XTR_ADDR_LOWER_ADDR_WIDTH-1:0 ];
1596 }
1597
1598 "CfgBusNum" : {
1599 CfgBusNum = FieldValue[ FNX_PCIE_XTR_CFG_BUS_NUM_WIDTH-1:0 ];
1600 }
1601
1602 "CfgDeviceNum" : {
1603 CfgDeviceNum = FieldValue[ FNX_PCIE_XTR_CFG_DEVICE_NUM_WIDTH-1:0 ];
1604 }
1605
1606 "CfgFuncNum" : {
1607 CfgFuncNum = FieldValue[ FNX_PCIE_XTR_CFG_FUNC_NUM_WIDTH-1:0 ];
1608 }
1609
1610 "CfgId" : {
1611 SetCfgId( FieldValue[ FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0 ] );
1612 }
1613
1614 "CfgExtRegNum" : {
1615 CfgExtRegNum = FieldValue[ FNX_PCIE_XTR_CFG_EXT_REG_NUM_WIDTH-1:0 ];
1616 }
1617
1618 "CfgRegNum" : {
1619 CfgRegNum = FieldValue[ FNX_PCIE_XTR_CFG_REG_NUM_WIDTH-1:0 ];
1620 }
1621
1622 "CmnResv1" : {
1623 CmnResv1 = FieldValue[ FNX_PCIE_XTR_CMN_RESV_1_WIDTH-1:0 ];
1624 }
1625
1626 "CmnResv2" : {
1627 CmnResv2 = FieldValue[ FNX_PCIE_XTR_CMN_RESV_2_WIDTH-1:0 ];
1628 }
1629
1630 "CmnResv3" : {
1631 CmnResv3 = FieldValue[ FNX_PCIE_XTR_CMN_RESV_3_WIDTH-1:0 ];
1632 }
1633
1634 "CmnResv4" : {
1635 CmnResv4 = FieldValue[ FNX_PCIE_XTR_CMN_RESV_4_WIDTH-1:0 ];
1636 }
1637
1638 "CmplResv5" : {
1639 CmplResv5 = FieldValue[ FNX_PCIE_XTR_CMPL_RESV_5_WIDTH-1:0 ];
1640 }
1641
1642 "AddrResv6" : {
1643 AddrResv6 = FieldValue[ FNX_PCIE_XTR_ADDR_RESV_6_WIDTH-1:0 ];
1644 }
1645
1646 "CfgResv7" : {
1647 CfgResv7 = FieldValue[ FNX_PCIE_XTR_CFG_RESV_7_WIDTH-1:0 ];
1648 }
1649
1650 "CfgResv8" : {
1651 CfgResv8 = FieldValue[ FNX_PCIE_XTR_CFG_RESV_8_WIDTH-1:0 ];
1652 }
1653
1654 "DLLFrmResv9" : {
1655 DLLFrmResv9 = FieldValue[ FNX_PCIE_XTR_DLL_FRM_RESV_9_WIDTH-1:0 ];
1656 }
1657
1658 "ECRC" : {
1659 ECRC = FieldValue[ FNX_PCIE_XTR_ECRC_WIDTH-1:0 ];
1660 }
1661
1662 "DLLFrmLCRC32" : {
1663 DLLFrmLCRC32 = FieldValue[ FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH-1:0 ];
1664 }
1665
1666 "DLLFrmSeqNum" : {
1667 DLLFrmSeqNum = FieldValue[ FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH-1:0 ];
1668 }
1669
1670 "PortNum" : {
1671 PortNum = FieldValue; // integer
1672 }
1673
1674 "GenTag" : {
1675 GenTag = FieldValue[0];
1676 }
1677
1678 "DllpType" : {
1679 DllpType = FieldValue[ FNX_PCIE_XTR_DLLP_TYPE_WIDTH-1:0 ];
1680 }
1681
1682 "DllpLCRC16" : {
1683 DllpLCRC16 = FieldValue[ FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH-1:0 ];
1684 }
1685
1686 "AckNakSeqNum" : {
1687 AckNakSeqNum = FieldValue[ FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_WIDTH-1:0 ];
1688 }
1689
1690 "AckNakResv" : {
1691 AckNakResv = FieldValue[ FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_WIDTH-1:0 ];
1692 }
1693
1694 "DllpFCType" : {
1695 DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_TYPE_INT_SLC] = FieldValue[ FNX_PCIE_XTR_DLLP_FC_TYPE_WIDTH-1:0 ];
1696 }
1697
1698 "DllpFCVC" : {
1699 DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_VC_INT_SLC] = FieldValue[ FNX_PCIE_XTR_DLLP_FC_VC_WIDTH-1:0 ];
1700 }
1701
1702 "DllpFCResv1" : {
1703 DllpFCResv1 = FieldValue[ FNX_PCIE_XTR_DLLP_FC_RESV_1_WIDTH-1:0 ];
1704 }
1705
1706 "DllpFCHdrFC" : {
1707 DllpFCHdrFC = FieldValue[ FNX_PCIE_XTR_DLLP_FC_HDR_FC_WIDTH-1:0 ];
1708 }
1709
1710 "DllpFCResv2" : {
1711 DllpFCResv2 = FieldValue[ FNX_PCIE_XTR_DLLP_FC_RESV_2_WIDTH-1:0 ];
1712 }
1713
1714 "DllpFCDataFC" : {
1715 DllpFCDataFC = FieldValue[ FNX_PCIE_XTR_DLLP_FC_DATA_FC_WIDTH-1:0 ];
1716 }
1717
1718 "DllpPMResv" : {
1719 DllpPMResv = FieldValue[ FNX_PCIE_XTR_DLLP_PM_RESV_WIDTH-1:0 ];
1720 }
1721
1722 "DllpVendorData" : {
1723 DllpVendorData = FieldValue[ FNX_PCIE_XTR_DLLP_VENDOR_DATA_WIDTH-1:0 ];
1724 }
1725
1726 "GenLCRC16" : {
1727 GenLCRC16 = FieldValue[0];
1728 }
1729
1730 "DenaliErr" : {
1731 denaliErr = FieldValue; // integer
1732 if (cast_assign( DenaliErr, denaliErr, CHECK) == 0)
1733 PCIEX_QR_ERR( "%s %s -> Cast Assign to Parameter DenaliErr Failed.",
1734 XactionID.GetSString(), XactorName );
1735 }
1736
1737 "GenECRC" : {
1738 GenECRC = FieldValue[0];
1739 }
1740
1741 "GenSeqNum" : {
1742 GenSeqNum = FieldValue[0];
1743 }
1744
1745 "GenLCRC32" : {
1746 GenLCRC32 = FieldValue[0];
1747 }
1748
1749 "PktType" : {
1750 PktType = FieldValue[ FNX_PCIE_XTR_PKT_TYPE_WIDTH-1:0 ];
1751 }
1752
1753 "CheckFmtTypeOnly" : {
1754 CheckFmtTypeOnly = FieldValue[0];
1755 }
1756
1757 "IgnoreTlpReqTag" : {
1758 IgnoreTlpReqTag = FieldValue[0];
1759 }
1760
1761 "ReceivedReqTag" : {
1762 ReceivedReqTag = FieldValue[FNX_PCIE_XTR_REQ_TAG_WIDTH-1:0];
1763 }
1764
1765 default : PCIEX_QR_ERR( "%s %s -> Hit default case element FieldType=%s",
1766 XactionID.GetSString(), XactorName, FieldType );
1767 }
1768}
1769
1770function bit [ XACT_FIELD_WIDTH-1:0 ] FNXPCIEXactorPacket::Get( string FieldType )
1771{
1772 string MethodName = "Get";
1773
1774 case ( FieldType ) {
1775
1776 "CmnFmt" : {
1777 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_FORMAT_WIDTH){1'b0}}, CmnFmt };
1778 }
1779
1780 "CmnType" : {
1781 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_TYPE_WIDTH){1'b0}}, CmnType };
1782 }
1783
1784 "CmnFmtType" : {
1785 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_FMT_TYPE_WIDTH){1'b0}}, GetFmtType() };
1786 }
1787
1788 "CmnTC" : {
1789 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_TC_WIDTH){1'b0}}, CmnTC };
1790 }
1791
1792 "CmnTD" : {
1793 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_TD_WIDTH){1'b0}}, CmnTD };
1794 }
1795
1796 "CmnEP" : {
1797 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_EP_WIDTH){1'b0}}, CmnEP };
1798 }
1799
1800 "CmnRO" : {
1801 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_RO_WIDTH){1'b0}}, CmnRO };
1802 }
1803
1804 "CmnSnoop" : {
1805 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_SNOOP_WIDTH){1'b0}}, CmnSnoop };
1806 }
1807
1808 "CmnAttr" : {
1809 Get = { { (XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_ATTR_WIDTH){1'b0}}, GetAttr() };
1810 }
1811
1812 "CmnLength" : {
1813 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_LENGTH_WIDTH){1'b0}}, CmnLength };
1814 }
1815
1816 "ReqBusNum" : {
1817 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH){1'b0}}, ReqBusNum };
1818 }
1819
1820 "ReqDeviceNum" : {
1821 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH){1'b0}}, ReqDeviceNum };
1822 }
1823
1824 "ReqFuncNum" : {
1825 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH){1'b0}}, ReqFuncNum };
1826 }
1827
1828 "ReqId" : {
1829 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH){1'b0}}, GetReqId() };
1830 }
1831
1832 "ReqTag" : {
1833 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_TAG_WIDTH){1'b0}}, ReqTag };
1834 }
1835
1836 "BELastDW" : {
1837 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH){1'b0}}, BELastDW };
1838 }
1839
1840 "BEFirstDW" : {
1841 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH){1'b0}}, BEFirstDW };
1842 }
1843
1844 "MsgCode" : {
1845 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_MSG_MESSAGE_CODE_WIDTH){1'b0}}, MsgCode };
1846 }
1847
1848 "MsgRouting" : {
1849 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_MSG_ROUTING_WIDTH){1'b0}}, MsgRouting };
1850 }
1851
1852 "MsgDW3" : {
1853 Get = { {(XACT_FIELD_WIDTH-32){1'b0}}, MsgDW3 };
1854 }
1855
1856 "MsgDW4" : {
1857 Get = { {(XACT_FIELD_WIDTH-32){1'b0}}, MsgDW4 };
1858 }
1859
1860 "CmplBusNum" : {
1861 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH){1'b0}}, CmplBusNum };
1862 }
1863
1864 "CmplDeviceNum" : {
1865 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH){1'b0}}, CmplDeviceNum };
1866 }
1867
1868 "CmplFuncNum" : {
1869 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH){1'b0}}, CmplFuncNum };
1870 }
1871
1872 "CmplId" : {
1873 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMPL_COMPLETER_ID_WIDTH){1'b0}}, GetCmplId() };
1874 }
1875
1876 "CmplStatus" : {
1877 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH){1'b0}}, CmplStatus };
1878 }
1879
1880 "CmplBCM" : {
1881 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMPL_BCM_WIDTH){1'b0}}, CmplBCM };
1882 }
1883
1884 "CmplByteCount" : {
1885 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMPL_BYTE_COUNT_WIDTH){1'b0}}, CmplByteCount };
1886 }
1887
1888 "CmplLowerAddr" : {
1889 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH){1'b0}}, CmplLowerAddr };
1890 }
1891
1892 "AddrUpper" : {
1893 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_ADDR_UPPER_ADDR_WIDTH){1'b0}}, AddrUpper };
1894 }
1895
1896 "AddrLower" : {
1897 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_ADDR_LOWER_ADDR_WIDTH){1'b0}}, AddrLower };
1898 }
1899
1900 "CfgBusNum" : {
1901 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_BUS_NUM_WIDTH){1'b0}}, CfgBusNum };
1902 }
1903
1904 "CfgDeviceNum" : {
1905 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_DEVICE_NUM_WIDTH){1'b0}}, CfgDeviceNum };
1906 }
1907
1908 "CfgFuncNum" : {
1909 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_FUNC_NUM_WIDTH){1'b0}}, CfgFuncNum };
1910 }
1911
1912 "CfgId" : {
1913 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH){1'b0}}, GetCfgId() };
1914 }
1915
1916 "CfgExtRegNum" : {
1917 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_EXT_REG_NUM_WIDTH){1'b0}}, CfgExtRegNum };
1918 }
1919
1920 "CfgRegNum" : {
1921 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_REG_NUM_WIDTH){1'b0}}, CfgRegNum };
1922 }
1923
1924 "CmnResv1" : {
1925 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_RESV_1_WIDTH){1'b0}}, CmnResv1 };
1926 }
1927
1928 "CmnResv2" : {
1929 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_RESV_2_WIDTH){1'b0}}, CmnResv2 };
1930 }
1931
1932 "CmnResv3" : {
1933 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_RESV_3_WIDTH){1'b0}}, CmnResv3 };
1934 }
1935
1936 "CmnResv4" : {
1937 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMN_RESV_4_WIDTH){1'b0}}, CmnResv4 };
1938 }
1939
1940 "CmplResv5" : {
1941 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CMPL_RESV_5_WIDTH){1'b0}}, CmplResv5 };
1942 }
1943
1944 "AddrResv6" : {
1945 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_ADDR_RESV_6_WIDTH){1'b0}}, AddrResv6 };
1946 }
1947
1948 "CfgResv7" : {
1949 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_RESV_7_WIDTH){1'b0}}, CfgResv7 };
1950 }
1951
1952 "CfgResv8" : {
1953 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_CFG_RESV_8_WIDTH){1'b0}}, CfgResv8 };
1954 }
1955
1956 "DLLFrmResv9" : {
1957 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLL_FRM_RESV_9_WIDTH){1'b0}}, DLLFrmResv9 };
1958 }
1959
1960 "ECRC" : {
1961 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_ECRC_WIDTH){1'b0}}, ECRC };
1962 }
1963
1964 "DLLFrmLCRC32" : {
1965 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH){1'b0}}, DLLFrmLCRC32 };
1966 }
1967
1968 "DLLFrmSeqNum" : {
1969 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH){1'b0}}, DLLFrmSeqNum };
1970 }
1971
1972 "PortNum" : {
1973 Get = 0;
1974 Get = PortNum; // integer
1975 }
1976
1977 "DenaliErr" : {
1978 Get = 0;
1979 Get = DenaliErr; // enum returned as integer
1980 }
1981
1982 "GenTag" : {
1983 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, GenTag };
1984 }
1985
1986 "GenECRC" : {
1987 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, GenECRC };
1988 }
1989
1990 "GenSeqNum" : {
1991 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, GenSeqNum };
1992 }
1993
1994 "GenLCRC32" : {
1995 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, GenLCRC32 };
1996 }
1997
1998 "PktType" : {
1999 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_PKT_TYPE_WIDTH){1'b0}}, PktType };
2000 }
2001
2002 "DllpType" : {
2003 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_TYPE_WIDTH){1'b0}}, DllpType };
2004 }
2005
2006 "DllpLCRC16" : {
2007 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_LCRC_16_WIDTH){1'b0}}, DllpLCRC16 };
2008 }
2009
2010 "AckNakSeqNum" : {
2011 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_WIDTH){1'b0}}, AckNakSeqNum };
2012 }
2013
2014 "AckNakResv" : {
2015 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_WIDTH){1'b0}}, AckNakResv };
2016 }
2017
2018 "DllpFCType" : {
2019 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_FC_TYPE_WIDTH){1'b0}}, GetDllpFCType() };
2020 }
2021
2022 "DllpFCVC" : {
2023 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_FC_VC_WIDTH){1'b0}}, GetDllpFCVC() };
2024 }
2025
2026 "DllpFCResv1" : {
2027 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_FC_RESV_1_WIDTH){1'b0}}, DllpFCResv1 };
2028 }
2029
2030 "DllpFCHdrFC" : {
2031 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_FC_HDR_FC_WIDTH){1'b0}}, DllpFCHdrFC };
2032 }
2033
2034 "DllpFCResv2" : {
2035 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_FC_RESV_2_WIDTH){1'b0}}, DllpFCResv2 };
2036 }
2037
2038 "DllpFCDataFC" : {
2039 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_FC_DATA_FC_WIDTH){1'b0}}, DllpFCDataFC };
2040 }
2041
2042 "DllpPMResv" : {
2043 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_PM_RESV_WIDTH){1'b0}}, DllpPMResv };
2044 }
2045
2046 "DllpVendorData" : {
2047 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_DLLP_VENDOR_DATA_WIDTH){1'b0}}, DllpVendorData };
2048 }
2049
2050 "GenLCRC16" : {
2051 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, GenLCRC16 };
2052 }
2053
2054 "CheckFmtTypeOnly" : {
2055 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, CheckFmtTypeOnly };
2056 }
2057
2058 "IgnoreTlpReqTag" : {
2059 Get = { {(XACT_FIELD_WIDTH-1){1'b0}}, IgnoreTlpReqTag };
2060 }
2061
2062 "ReceivedReqTag" : {
2063 Get = { {(XACT_FIELD_WIDTH-FNX_PCIE_XTR_REQ_TAG_WIDTH){1'b0}}, ReceivedReqTag };
2064 }
2065
2066 default : PCIEX_QR_ERR( "%s %s -> Hit default case element FieldType=%s",
2067 XactionID.GetSString(), XactorName, FieldType );
2068 }
2069}
2070
2071task FNXPCIEXactorPacket::SetPyld( bit [7:0] _Pyld[*] )
2072{
2073 integer _NumPyldBytes, i;
2074 string MethodName = "SetPyld";
2075
2076 // Mark Internal Packet State as Stale
2077 PktStateUpdated = 0;
2078
2079 _NumPyldBytes = _Pyld.size();
2080
2081 if (_NumPyldBytes > FNX_PCIE_XTR_FNX_MAX_NUM_PYLD_BYTES) {
2082// PCIEX_QR_ERR( "%m %s %s -> NumPyldBytes=%0h(%0d) exceeds MaxPyldSize=%0h(%0d)",
2083 PCIEX_QR_I( "%m %s %s -> NumPyldBytes=%0h(%0d) exceeds MaxPyldSize=%0h(%0d)",
2084 XactionID.GetSString(), XactorName, _NumPyldBytes, _NumPyldBytes,
2085 FNX_PCIE_XTR_FNX_MAX_NUM_PYLD_BYTES, FNX_PCIE_XTR_FNX_MAX_NUM_PYLD_BYTES );
2086// return;
2087 }
2088
2089 if ( (_NumPyldBytes % 4) !== 0) {
2090 PCIEX_QR_ERR( "%s %s -> NumPyldBytes='h%0h(%0d) is not a multiple of 4 (DW aligned)",
2091 XactionID.GetSString(), XactorName, _NumPyldBytes, _NumPyldBytes );
2092 return;
2093 }
2094
2095 NumPyldBytes = _NumPyldBytes;
2096 if( NumPyldBytes == 0 ){
2097 Pyld = new[1];
2098 Pyld.delete();
2099 }else{
2100 Pyld = new[NumPyldBytes] (_Pyld);
2101 }
2102}
2103
2104task FNXPCIEXactorPacket::GetPyld( var bit [7:0] _Pyld[*] )
2105{
2106 _Pyld = new[Pyld.size()] (Pyld);
2107}
2108
2109task FNXPCIEXactorPacket::ParseDLLPByteStream( bit [8:0] pktData[*] )
2110{
2111 bit [FNX_PCIE_XTR_DW_WIDTH-1:0] dllpDW1;
2112 bit [8:0] tmpByte0, tmpByte1, tmpByte2, tmpByte3;
2113 string MethodName = "ParseDLLPByteStream";
2114
2115 // Packet Type is DLLP
2116 PktType = FNX_PCIE_XTR_PKT_TYPE_DLLP;
2117
2118 // Ensure DLLP Size in Bytes is Correct Before Parsing
2119 if (pktData.size() !== FNX_PCIE_XTR_NUM_DLLP_BYTES) {
2120//N2 DMT Bypass Link Train PCIEX_QR_I( "%s -> NumberOfBytes=%0d in DLLP Data Stream != %0d",
2121// return;
2122 PCIEX_QR_ERR( "%s -> NumberOfBytes=%0d in DLLP Data Stream != %0d",
2123 XactorName, pktData.size(), FNX_PCIE_XTR_NUM_DLLP_BYTES );
2124 }
2125
2126 // Extract DLLP DW0 and LCRC16
2127 tmpByte0 = pktData[0]; tmpByte1 = pktData[1];
2128 tmpByte2 = pktData[2]; tmpByte3 = pktData[3];
2129 dllpDW1 = { tmpByte0[7:0], tmpByte1[7:0], tmpByte2[7:0], tmpByte3[7:0] };
2130 tmpByte0 = pktData[4]; tmpByte1 = pktData[5];
2131 DllpLCRC16 = { tmpByte0[7:0], tmpByte1[7:0] };
2132 GenLCRC16 = 0;
2133
2134 // Extract DLLP Type
2135 DllpType = dllpDW1[FNX_PCIE_XTR_DLLP_TYPE_SLC];
2136
2137 // Ensure DLLP Type is Valid Before Parsing Further
2138 // but do not report error if this is an error injection case
2139// DenaliErr = %s \n ", DenaliErr);
2140// inject_unsupport_dllp_type = %d \n ", inject_unsupport_dllp_type);
2141// if (DenaliErr == PCIE_EI_RSRVD_TYPE) {
2142 if (inject_unsupport_dllp_type == 1 ) {
2143 if (!(isDllpAckNak() || isDllpFC() || isDllpVendor() || isDllpPM()) ) {
2144 PCIEX_QR_I( "AC: Forcing %s -> Invalid DLLP Type at time %d. \n", XactorName, get_time(LO) );
2145 printf("AC: inside PCIE_EI_RSRVD_TYPE \n");
2146 inject_unsupport_dllp_type = 0;
2147 }
2148 }
2149 else if (!(isDllpAckNak() || isDllpFC() || isDllpVendor() || isDllpPM()) ) {
2150 PCIEX_QR_ERR( "%s -> Invalid DLLP Type.", XactorName );
2151 return;
2152 }
2153
2154 // Ensure Packet's Internal State is Up-to-Date
2155 UpdatePktState();
2156
2157 // Extract Ack/Nak DLLP Fields
2158 if (isDllpAckNak()) {
2159 AckNakSeqNum = dllpDW1[ FNX_PCIE_XTR_DLLP_ACK_NAK_SEQ_NUM_SLC ];
2160 AckNakResv = dllpDW1[ FNX_PCIE_XTR_DLLP_ACK_NAK_RESV_SLC ];
2161 }
2162
2163 // Extract FC DLLP Fields
2164 if (isDllpFC()) {
2165 DllpFCResv1 = dllpDW1[ FNX_PCIE_XTR_DLLP_FC_RESV_1_SLC ];
2166 DllpFCHdrFC = dllpDW1[ FNX_PCIE_XTR_DLLP_FC_HDR_FC_SLC ];
2167 DllpFCResv2 = dllpDW1[ FNX_PCIE_XTR_DLLP_FC_RESV_2_SLC ];
2168 DllpFCDataFC = dllpDW1[ FNX_PCIE_XTR_DLLP_FC_DATA_FC_SLC ];
2169 }
2170
2171 // Extract PM DLLP Fields
2172 if (isDllpPM()) {
2173 DllpPMResv = dllpDW1[ FNX_PCIE_XTR_DLLP_PM_RESV_SLC ];
2174 }
2175
2176 // Extract Vendor DLLP Fields
2177 if (isDllpVendor()) {
2178 DllpVendorData = dllpDW1[ FNX_PCIE_XTR_DLLP_VENDOR_DATA_SLC ];
2179 }
2180}
2181
2182task FNXPCIEXactorPacket::ParseTLPByteStream( bit [8:0] pktData[*] )
2183{
2184 bit [FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH-1:0] dllPrefix;
2185 bit [FNX_PCIE_XTR_DW_WIDTH-1:0] tlpDWs[*], currDW;
2186 bit [8:0] tmpByte0, tmpByte1, tmpByte2, tmpByte3;
2187 integer i, j, k, numDWs, numBytes;
2188 string MethodName = "ParseTLPByteStream";
2189
2190 // Packet Type is TLP
2191 PktType = FNX_PCIE_XTR_PKT_TYPE_TLP;
2192
2193
2194 tmpByte0 = pktData[0];
2195 tmpByte1 = pktData[1];
2196 dllPrefix = { tmpByte0[7:0], tmpByte1[7:0] };
2197
2198
2199 numBytes = pktData.size() - (FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH/8);
2200 numDWs = numBytes/4;
2201 if ((numBytes % 4) !== 0) {
2202 PCIEX_QR_ERR( "%s -> Number of Bytes in Data Stream Excluding DLL Prefix is Not DW Aligned.\n%s",
2203 XactorName, Util.ByteStreamToStr(pktData, GetPktPrefixStr(), "Byte Stream" ) );
2204 return;
2205 }
2206
2207
2208 DLLFrmResv9 = dllPrefix[ FNX_PCIE_XTR_DLL_FRM_PREFIX_RESV_9_SLC ];
2209 DLLFrmSeqNum = dllPrefix[ FNX_PCIE_XTR_DLL_FRM_PREFIX_SEQ_NUM_SLC ];
2210 GenSeqNum = 0;
2211
2212 // Create TLP DWs To Be Parsed
2213 tlpDWs = new[numDWs];
2214 k = FNX_PCIE_XTR_DLL_FRM_PREFIX_WIDTH/8;
2215 for (i=0; i < numDWs; i++) {
2216 tmpByte0 = pktData[k++];
2217 tmpByte1 = pktData[k++];
2218 tmpByte2 = pktData[k++];
2219 tmpByte3 = pktData[k++];
2220 tlpDWs[i] = { tmpByte0[7:0], tmpByte1[7:0], tmpByte2[7:0], tmpByte3[7:0] };
2221 }
2222
2223 k = 0;
2224
2225 ////////////////////////////////////////////////////
2226 // Parse Common TLP Header DW 1
2227 //
2228 currDW = tlpDWs[k++];
2229 CmnResv1 = currDW[ FNX_PCIE_XTR_CMN_RESV_1_SLC ];
2230 CmnFmt = currDW[ FNX_PCIE_XTR_CMN_FORMAT_SLC ];
2231 CmnType = currDW[ FNX_PCIE_XTR_CMN_TYPE_SLC ];
2232 CmnResv2 = currDW[ FNX_PCIE_XTR_CMN_RESV_2_SLC ];
2233 CmnTC = currDW[ FNX_PCIE_XTR_CMN_TC_SLC ];
2234 CmnResv3 = currDW[ FNX_PCIE_XTR_CMN_RESV_3_SLC ];
2235 CmnTD = currDW[ FNX_PCIE_XTR_CMN_TD_SLC ];
2236 CmnEP = currDW[ FNX_PCIE_XTR_CMN_EP_SLC ];
2237 CmnRO = currDW[ FNX_PCIE_XTR_CMN_RO_SLC ];
2238 CmnSnoop = currDW[ FNX_PCIE_XTR_CMN_SNOOP_SLC ];
2239 CmnResv4 = currDW[ FNX_PCIE_XTR_CMN_RESV_4_SLC ];
2240 CmnLength = currDW[ FNX_PCIE_XTR_CMN_LENGTH_SLC ];
2241 ////////////////////////////////////////////////////
2242
2243 // Ensure TLP Type is Valid Before Parsing Further
2244 if (!(isTlpRequest() || isTlpCompletion() || isTlpMessage())) {
2245 PCIEX_QR_ERR( "%s -> Invalid TLP Type.", XactorName );
2246 return;
2247 }
2248
2249 // Ensure Packet's Internal State is Up-to-Date
2250 UpdatePktState();
2251
2252 if ( TLPHdrPresVec[ FNX_PCIE_XTR_MSG_HDR ] ) {
2253 MsgRouting = currDW[ FNX_PCIE_XTR_MSG_CMN_ROUTING_SLC ];
2254 }
2255
2256 ////////////////////////////////////////////////////
2257 // Parse TLP Header DW 2
2258 //
2259 currDW = tlpDWs[k++];
2260 if ( (TLPHdrPresVec[ FNX_PCIE_XTR_REQ_HDR ] ) &&
2261 !( TLPHdrPresVec[ FNX_PCIE_XTR_CMPL_HDR ] ) ) {
2262 ReqBusNum = currDW[ FNX_PCIE_XTR_REQ_BUS_NUM_SLC ];
2263 ReqDeviceNum = currDW[ FNX_PCIE_XTR_REQ_DEVICE_NUM_SLC ];
2264 ReqFuncNum = currDW[ FNX_PCIE_XTR_REQ_FUNC_NUM_SLC ];
2265 ReqTag = currDW[ FNX_PCIE_XTR_REQ_TAG_SLC ];
2266 GenTag = 0;
2267 }
2268 if ( TLPHdrPresVec[ FNX_PCIE_XTR_BE_HDR ] ) {
2269 BELastDW = currDW[ FNX_PCIE_XTR_BE_LAST_DW_BE_SLC ];
2270 BEFirstDW = currDW[ FNX_PCIE_XTR_BE_FIRST_DW_BE_SLC ];
2271 }
2272 if ( TLPHdrPresVec[ FNX_PCIE_XTR_MSG_HDR ] ) {
2273 MsgCode = currDW[ FNX_PCIE_XTR_MSG_MESSAGE_CODE_SLC ];
2274 }
2275 if ( TLPHdrPresVec[ FNX_PCIE_XTR_CMPL_HDR ] ) {
2276 CmplBusNum = currDW[ FNX_PCIE_XTR_REQ_BUS_NUM_SLC ];
2277 CmplDeviceNum = currDW[ FNX_PCIE_XTR_REQ_DEVICE_NUM_SLC ];
2278 CmplFuncNum = currDW[ FNX_PCIE_XTR_REQ_FUNC_NUM_SLC ];
2279 CmplStatus = currDW[ FNX_PCIE_XTR_CMPL_CMPL_STATUS_SLC ];
2280 CmplBCM = currDW[ FNX_PCIE_XTR_CMPL_BCM_SLC ];
2281 CmplByteCount = currDW[ FNX_PCIE_XTR_CMPL_BYTE_COUNT_SLC ];
2282 }
2283 ////////////////////////////////////////////////////
2284
2285 ////////////////////////////////////////////////////
2286 // Parse TLP Header DW 3
2287 //
2288 currDW = tlpDWs[k++];
2289 if ( (TLPHdrPresVec[ FNX_PCIE_XTR_LOWER_ADDR_HDR ]) &&
2290 !(TLPHdrPresVec[ FNX_PCIE_XTR_UPPER_ADDR_HDR ]) ) {
2291 AddrLower = currDW[ FNX_PCIE_XTR_ADDR_LOWER_ADDR_SLC ];
2292 AddrResv6 = currDW[ FNX_PCIE_XTR_ADDR_RESV_6_SLC ];
2293 }
2294 if ( TLPHdrPresVec[ FNX_PCIE_XTR_UPPER_ADDR_HDR ] ) {
2295 AddrUpper = currDW[ FNX_PCIE_XTR_ADDR_UPPER_ADDR_SLC ];
2296 }
2297 if ( TLPHdrPresVec[ FNX_PCIE_XTR_MSG_HDR ] ) {
2298 MsgDW3 = currDW;
2299 }
2300 if ( TLPHdrPresVec[ FNX_PCIE_XTR_CMPL_HDR ] ) {
2301 ReqBusNum = currDW[ FNX_PCIE_XTR_REQ_BUS_NUM_SLC ];
2302 ReqDeviceNum = currDW[ FNX_PCIE_XTR_REQ_DEVICE_NUM_SLC ];
2303 ReqFuncNum = currDW[ FNX_PCIE_XTR_REQ_FUNC_NUM_SLC ];
2304 ReqTag = currDW[ FNX_PCIE_XTR_REQ_TAG_SLC ];
2305 CmplResv5 = currDW[ FNX_PCIE_XTR_CMPL_RESV_5_SLC ];
2306 CmplLowerAddr = currDW[ FNX_PCIE_XTR_CMPL_LOWER_ADDR_SLC ];
2307 GenTag = 0;
2308 }
2309 if ( TLPHdrPresVec[ FNX_PCIE_XTR_CFG_HDR ] ) {
2310 CfgBusNum = currDW[ FNX_PCIE_XTR_CFG_BUS_NUM_SLC ];
2311 CfgDeviceNum = currDW[ FNX_PCIE_XTR_CFG_DEVICE_NUM_SLC ];
2312 CfgFuncNum = currDW[ FNX_PCIE_XTR_CFG_FUNC_NUM_SLC ];
2313 CfgResv7 = currDW[ FNX_PCIE_XTR_CFG_RESV_7_SLC ];
2314 CfgExtRegNum = currDW[ FNX_PCIE_XTR_CFG_EXT_REG_NUM_SLC ];
2315 CfgRegNum = currDW[ FNX_PCIE_XTR_CFG_REG_NUM_SLC ];
2316 CfgResv8 = currDW[ FNX_PCIE_XTR_CFG_RESV_8_SLC ];
2317 }
2318 ////////////////////////////////////////////////////
2319
2320 ////////////////////////////////////////////////////
2321 // Parse TLP Header DW 4
2322 //
2323 if (NumTLPHdrDWs === 4) {
2324 currDW = tlpDWs[k++];
2325 if ( TLPHdrPresVec[ FNX_PCIE_XTR_MSG_HDR ] ) {
2326 MsgDW4 = currDW;
2327 }
2328 if ( (TLPHdrPresVec[ FNX_PCIE_XTR_LOWER_ADDR_HDR ]) &&
2329 (TLPHdrPresVec[ FNX_PCIE_XTR_UPPER_ADDR_HDR ]) ) {
2330 AddrLower = currDW[ FNX_PCIE_XTR_ADDR_LOWER_ADDR_SLC ];
2331 AddrResv6 = currDW[ FNX_PCIE_XTR_ADDR_RESV_6_SLC ];
2332 }
2333 }
2334 ////////////////////////////////////////////////////
2335
2336 // Extract Data Payload If Present
2337 if (PyldPres) {
2338 NumPyldBytes = CmnLength*4;
2339 Pyld = new[ NumPyldBytes ];
2340 for (i=0; i < CmnLength; i++) {
2341 currDW = tlpDWs[k++];
2342 for (j=0; j <4; j++)
2343 Pyld[i*4+j] = currDW[FNX_PCIE_XTR_DW_WIDTH-(j*8)-1:FNX_PCIE_XTR_DW_WIDTH-(j+1)*8];
2344 }
2345 }
2346
2347 // Extract Digest If Present
2348 if (CmnTD === 1'b1) {
2349 currDW = tlpDWs[k++];
2350 ECRC = currDW[ FNX_PCIE_XTR_ECRC_SLC ];
2351 GenECRC = 0;
2352 }
2353
2354 // Extract 32-bit LCRC
2355 currDW = tlpDWs[k++];
2356 DLLFrmLCRC32 = currDW[ FNX_PCIE_XTR_DLL_FRM_LCRC_32_SLC ];
2357 GenLCRC32 = 0;
2358}
2359
2360// Task Creates a New Denali PCIE Packet Representation of This
2361// Packet Classes Contents and Returns a Handle to it
2362function denaliPciePacket FNXPCIEXactorPacket::CreateDenaliPkt()
2363{
2364 // Possible Denali PCI-E Packet Types for DenaliPkt
2365 denaliPcieTlpMsgPacket msgPkt;
2366 denaliPcieTlpCplPacket cplPkt;
2367 denaliPcieTlpMemPacket memPkt;
2368 denaliPcieTlpIoPacket ioPkt;
2369 denaliPcieTlpCfgPacket cfgPkt;
2370 denaliPcieDlpPacket dlpPkt;
2371 denaliPcieDllpPacket dllpPkt;
2372 denaliPciePlpPacket plpPkt;
2373 denaliPciePllpPacket pllpPkt;
2374 denaliPcieRawDlpPacket rawDlpPkt;
2375 denaliPcieRawPacket rawPkt; // RawDllp / RawTlp / RawData
2376 denaliPcieOrderedSet ordSetPkt;
2377 denaliPcieTrainingSet trnSetPkt;
2378
2379 // Additional Denali PCI-E Packet Handles
2380 denaliPcieTlpPacket tlpPkt;
2381 denaliPcieTlpReqPacket reqPkt;
2382
2383 // Denali Requester IDs
2384 denaliPcieTlpIdInfo reqId, cmplId;
2385
2386 string MethodName = "CreateDenaliPkt";
2387
2388 integer cast_ok, i;
2389
2390 case (PktType) {
2391
2392 FNX_PCIE_XTR_PKT_TYPE_TLP : {
2393
2394 case ( {isTlpMessage(),isTlpRequest(),isTlpCompletion()} ) {
2395
2396 3'b110 : { // Message Request
2397
2398 if (Util.FmtTypeIsMsg(GetFmtType())) {
2399 msgPkt = new( DENALI_PCIE_TL_Msg );
2400 }
2401 if (Util.FmtTypeIsMsgD(GetFmtType())) {
2402 msgPkt = new( DENALI_PCIE_TL_MsgD );
2403 }
2404 CreateDenaliPkt = msgPkt;
2405 }
2406
2407 3'b010 : { // Request
2408
2409 // Ensure Request Packet Handles Are Null Before Check At End
2410 memPkt = null;
2411 cfgPkt = null;
2412 ioPkt = null;
2413
2414 // Determine Exact Type of Memory/IO/Config Request
2415 case (GetFmtType()) {
2416
2417 // Memory Request Packets
2418 FNX_PCIE_XTR_FMT_TYPE_MRD_32 : memPkt = new( DENALI_PCIE_TL_MRd_32 );
2419 FNX_PCIE_XTR_FMT_TYPE_MRD_64 : memPkt = new( DENALI_PCIE_TL_MRd_64 );
2420 FNX_PCIE_XTR_FMT_TYPE_MRDLK_32 : memPkt = new( DENALI_PCIE_TL_MRdLk_32 );
2421 FNX_PCIE_XTR_FMT_TYPE_MRDLK_64 : memPkt = new( DENALI_PCIE_TL_MRdLk_64 );
2422 FNX_PCIE_XTR_FMT_TYPE_MWR_32 : memPkt = new( DENALI_PCIE_TL_MWr_32 );
2423 FNX_PCIE_XTR_FMT_TYPE_MWR_64 : memPkt = new( DENALI_PCIE_TL_MWr_64 );
2424
2425 // IO Request Packets
2426 FNX_PCIE_XTR_FMT_TYPE_IORD : ioPkt = new( DENALI_PCIE_TL_IORd );
2427 FNX_PCIE_XTR_FMT_TYPE_IOWR : ioPkt = new( DENALI_PCIE_TL_IOWr );
2428
2429 // Config Request Packets
2430 FNX_PCIE_XTR_FMT_TYPE_CFGRD0 : cfgPkt = new( DENALI_PCIE_TL_CfgRd0 );
2431 FNX_PCIE_XTR_FMT_TYPE_CFGWR0 : cfgPkt = new( DENALI_PCIE_TL_CfgWr0 );
2432 FNX_PCIE_XTR_FMT_TYPE_CFGRD1 : cfgPkt = new( DENALI_PCIE_TL_CfgRd1 );
2433 FNX_PCIE_XTR_FMT_TYPE_CFGWR1 : cfgPkt = new( DENALI_PCIE_TL_CfgWr1 );
2434
2435 default : PCIEX_QR_ERR( "%s %s -> Hit default case element fmtType=%0h w/ isMsg=0 isReq=1 isCmpl=0",
2436 XactionID.GetSString(), XactorName, GetFmtType() );
2437 }
2438 if ( memPkt !== null )
2439 CreateDenaliPkt = memPkt;
2440 if ( cfgPkt !== null )
2441 CreateDenaliPkt = cfgPkt;
2442 if ( ioPkt !== null )
2443 CreateDenaliPkt = ioPkt;
2444 }
2445
2446 3'b001 : { // Completion
2447
2448 case (GetFmtType()) {
2449 FNX_PCIE_XTR_FMT_TYPE_CPL : cplPkt = new( DENALI_PCIE_TL_Cpl );
2450 FNX_PCIE_XTR_FMT_TYPE_CPLD : cplPkt = new( DENALI_PCIE_TL_CplD );
2451 FNX_PCIE_XTR_FMT_TYPE_CPLLK : cplPkt = new( DENALI_PCIE_TL_CplLk );
2452 FNX_PCIE_XTR_FMT_TYPE_CPLDLK : cplPkt = new( DENALI_PCIE_TL_CplDLk );
2453 default : PCIEX_QR_ERR( "%s %s -> Hit default case element fmtType=%0h w/ isMsg=0 isReq=0 isCmpl=1",
2454 XactionID.GetSString(), XactorName, GetFmtType() );
2455 }
2456 CreateDenaliPkt = cplPkt;
2457 }
2458
2459 default : PCIEX_QR_ERR( "%s %s -> PktType=TLP inconsistent with isMsg=%0b isReq=%0b isCmpl=%0b",
2460 XactionID.GetSString(), XactorName, isTlpMessage(), isTlpRequest(), isTlpCompletion() );
2461 }
2462 }
2463
2464 FNX_PCIE_XTR_PKT_TYPE_RAW_TLP : {
2465
2466 rawPkt = new( DENALI_PCIE__RawTlp );
2467 CreateDenaliPkt = rawPkt;
2468 }
2469
2470 FNX_PCIE_XTR_PKT_TYPE_DLP : {
2471 dlpPkt = new(); // denaliPcieDlpPacket w/ Type==DENALI_PCIE__Dlp
2472 CreateDenaliPkt = dlpPkt;
2473 }
2474
2475 FNX_PCIE_XTR_PKT_TYPE_RAW_DLP : {
2476 rawDlpPkt = new(); // denaliPcieRawDlpPacket w/ Type=DENALI_PCIE__RawDlp
2477 CreateDenaliPkt = rawDlpPkt;
2478 }
2479
2480 FNX_PCIE_XTR_PKT_TYPE_DLLP : {
2481 dllpPkt = new( Util.DllpTypeToType(DllpType) );
2482 CreateDenaliPkt = dllpPkt;
2483 }
2484
2485 FNX_PCIE_XTR_PKT_TYPE_PLP : {
2486 plpPkt = new(); // denaliPciePlPacket w/ Type==DENALI_PCIE__Plp
2487 CreateDenaliPkt = plpPkt;
2488 }
2489
2490 FNX_PCIE_XTR_PKT_TYPE_PLLP : {
2491 pllpPkt = new(); // denaliPciePlPacket w/ Type==DENALI_PCIE__Pllp
2492 CreateDenaliPkt = pllpPkt;
2493 }
2494
2495 FNX_PCIE_XTR_PKT_TYPE_ORDERED_SET : {
2496 // [review jbanta 10/06/03]: Pass in OS Type of enum denaliPciePlTypeT
2497 ordSetPkt = new( DENALI_PCIE_PL__unknown );
2498 CreateDenaliPkt = ordSetPkt;
2499 }
2500
2501 FNX_PCIE_XTR_PKT_TYPE_RAW_DATA : {
2502 rawPkt = new( DENALI_PCIE__RawData );
2503 CreateDenaliPkt = rawPkt;
2504 }
2505
2506 FNX_PCIE_XTR_PKT_TYPE_TRAINING_SET : {
2507 // [review jbanta 10/06/03]: Pass in TS Type of enum denaliPciePlTypeT
2508 trnSetPkt = new( DENALI_PCIE_PL__unknown );
2509 CreateDenaliPkt = trnSetPkt;
2510 }
2511
2512 default : {
2513 PCIEX_QR_ERR( "%s %s -> Hit default case element PktType=%0h", XactionID.GetSString(), XactorName, PktType );
2514 return;
2515 }
2516 }
2517
2518 // Ensure Packet's Internal State is Up-to-Date
2519 UpdatePktState();
2520
2521 // Set Fields Present in Base Denali Packet
2522
2523 // Error Injection Control
2524 // Note: All Packets Use The Relaxed Memory/ReqID Checks Added in
2525 // Denali Rev pcie,v3.1_11122003
2526 CreateDenaliPkt.setErrInject( PCIE_EI_RELAX_CHK );
2527
2528 ///////////////////////////////////////////////////
2529 // Begin -> Setup Denali TLP Packet
2530 //
2531 if (isTlp()) {
2532
2533 // cast to type denaliPcieTlpPacket
2534 cast_ok = cast_assign( tlpPkt, CreateDenaliPkt, CHECK );
2535 if (cast_ok === 0)
2536 PCIEX_QR_ERR( "%s %s -> Cast assign to tlpPkt failed.", XactionID.GetSString(), XactorName );
2537
2538 // Set Common Header Fields
2539 if (TLPHdrPresVec[FNX_PCIE_XTR_CMN_HDR]) {
2540
2541 // Format & Type Already Set Via Packet Parsing For PktType=TLP
2542 tlpPkt.setTrafficClass( CmnTC );
2543 tlpPkt.setHasDigest( CmnTD );
2544 tlpPkt.setIsPoisoned( CmnEP );
2545 tlpPkt.setAttr( { CmnRO, CmnSnoop } );
2546 tlpPkt.setLength( CmnLength );
2547
2548 if (({CmnResv1, CmnResv2, CmnResv3, CmnResv4}) !== 0) {
2549 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2550 }
2551 }
2552
2553 // Set Request Header Fields
2554 if (TLPHdrPresVec[FNX_PCIE_XTR_REQ_HDR]) {
2555
2556 // Create and Set Requester ID
2557 reqId = new();
2558 reqId.setBusNumber( ReqBusNum );
2559 reqId.setDeviceNumber( ReqDeviceNum );
2560 reqId.setFunctionNumber( ReqFuncNum );
2561 tlpPkt.setRequesterId( reqId );
2562
2563 // Set Transaction Tag Generation
2564 tlpPkt.setModelGensTag( GenTag );
2565 if (GenTag)
2566 tlpPkt.setTransactionIdTag( 0 );
2567 else
2568 tlpPkt.setTransactionIdTag( ReqTag );
2569 }
2570
2571 // Set Byte Enable Header Fields
2572 if (TLPHdrPresVec[FNX_PCIE_XTR_BE_HDR]) {
2573
2574 tlpPkt.setLastBe( BELastDW );
2575 tlpPkt.setFirstBe( BEFirstDW );
2576 }
2577
2578 // Set Message Header Fields
2579 if (TLPHdrPresVec[FNX_PCIE_XTR_MSG_HDR]) {
2580
2581 tlpPkt.setMessageType( Util.MsgCodeToType( MsgCode ) );
2582 tlpPkt.setVdMsgRouting( Util.MsgRoutingToType( MsgRouting ) );
2583 tlpPkt.setVendorId( MsgDW3[15:0] );
2584 // Create and Set Completer ID
2585 cmplId = new();
2586 cmplId.setBusNumber( MsgDW3[31:24] );
2587 cmplId.setDeviceNumber( MsgDW3[23:19] );
2588 cmplId.setFunctionNumber( MsgDW3[18:16] );
2589 tlpPkt.setCompleterId( cmplId );
2590 // [review jbanta 12/5/03] : Temporary debug message
2591 PCIEX_QR_I( "!!! %s -> Printing Denali Packet Contents:", XactorName );
2592 tlpPkt.printInfo();
2593 }
2594
2595 // Set Completion Header Fields
2596 if (TLPHdrPresVec[FNX_PCIE_XTR_CMPL_HDR]) {
2597
2598 // Create and Set Completer ID
2599 cmplId = new();
2600 cmplId.setBusNumber( CmplBusNum );
2601 cmplId.setDeviceNumber( CmplDeviceNum );
2602 cmplId.setFunctionNumber( CmplFuncNum );
2603 cplPkt.setCompleterId( cmplId );
2604
2605 cplPkt.setCompletionStatus( CmplStatus );
2606 cplPkt.setBcm( CmplBCM );
2607 cplPkt.setByteCount( CmplByteCount );
2608 cplPkt.setLowAddress( CmplLowerAddr );
2609
2610 if (CmplResv5 !== 0) {
2611 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2612 }
2613 }
2614
2615 // Set Lower Address Header Fields
2616 if (TLPHdrPresVec[FNX_PCIE_XTR_LOWER_ADDR_HDR]) {
2617
2618 tlpPkt.setAddress( AddrLower );
2619
2620 if (AddrResv6 !== 0) {
2621 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2622 }
2623 }
2624
2625 // Set Upper Address Header Fields
2626 if (TLPHdrPresVec[FNX_PCIE_XTR_UPPER_ADDR_HDR]) {
2627
2628 memPkt.setAddressHigh( AddrUpper);
2629 }
2630
2631 // Set Config Header Fields
2632 if (TLPHdrPresVec[FNX_PCIE_XTR_CFG_HDR]) {
2633
2634 // Create and Set Completer ID
2635 cmplId = new();
2636 cmplId.setBusNumber( CfgBusNum );
2637 cmplId.setDeviceNumber( CfgDeviceNum );
2638 cmplId.setFunctionNumber( CfgFuncNum );
2639 cfgPkt.setCompleterId( cmplId );
2640
2641 cfgPkt.setExtRegisterNumber( CfgExtRegNum );
2642 cfgPkt.setRegisterNumber( CfgRegNum );
2643
2644 if ( (CfgResv7 !== 0) || (CfgResv8 !== 0) ) {
2645 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2646 }
2647 }
2648
2649 // Set Specified ECRC if Generation is Disabled
2650 if (!(GenECRC))
2651 tlpPkt.setEcrc( ECRC );
2652
2653 // Set Payload if Present
2654 if ( (PyldPres) && (NumPyldBytes > 0) )
2655 tlpPkt.setPayload( Pyld );
2656 if( (PyldPres) && (NumPyldBytes === 0) )
2657 tlpPkt.setErrInject( PCIE_EI_TLP_NULL_PAYLOAD );// Error condition
2658
2659 // Set DLL Framing Modifications
2660 // [review jbanta 10/6/03]: Implement
2661 // [FNX_PCIE_XTR_DLL_FRM_RESV_9_WIDTH-1:0] DLLFrmResv9; // reserved
2662 // [FNX_PCIE_XTR_DLL_FRM_SEQ_NUM_WIDTH-1:0] DLLFrmSeqNum; // DLL Sequence Number
2663 // [FNX_PCIE_XTR_DLL_FRM_LCRC_32_WIDTH-1:0] DLLFrmLCRC32; // 32-bit DLL LCRC
2664 }
2665 // End -> Setup Denali TLP Packet
2666 ///////////////////////////////////////////////////
2667
2668 ///////////////////////////////////////////////////
2669 // Begin -> Setup Denali DLLP Packet
2670 //
2671 if (isDllp()) {
2672
2673 // Set Specific LCRC-16 If Not Being Generated By Xactor
2674 if (!(GenLCRC16))
2675 dllpPkt.setLcrc( DllpLCRC16 );
2676
2677 // Set Ack/Nak DLLP Specific Fields
2678 if (isDllpAckNak()) {
2679 dllpPkt.setSeqNum( AckNakSeqNum );
2680 }
2681
2682 // Set FC DLLP Specific Fields
2683 if (isDllpFC()) {
2684 dllpPkt.setVc( DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_VC_INT_SLC] );
2685 dllpPkt.setHdrFc( DllpFCHdrFC );
2686 dllpPkt.setDataFc( DllpFCDataFC );
2687 if (DllpFCResv1 !== 0) {
2688 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2689 }
2690 if (DllpFCResv2 !== 0) {
2691 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2692 }
2693 }
2694
2695 // Set Vendor Defined DLLP Specific Fields
2696 if (isDllpVendor()) {
2697 dllpPkt.setVendorValue( DllpVendorData );
2698 }
2699
2700 // Set PM DLLP Specific Fields
2701 if (isDllpPM()) {
2702 if (DllpPMResv !== 0) {
2703 // [review jbanta 10/06/03]: Add Handling For Non-Zero Reserved Fields
2704 }
2705 }
2706 }
2707
2708 // End -> Setup Denali DLLP Packet
2709 ///////////////////////////////////////////////////
2710}
2711
2712function bit [ FNX_PCE_XTR_MAX_RESV_FIELD_WIDTH-1:0 ] FNXPCIEXactorPacket::GetTLPResvFieldVal( integer idx )
2713{
2714 string MethodName = "GetTLPResvFieldVal";
2715
2716 GetTLPResvFieldVal = 0;
2717 case (idx) {
2718 1 : GetTLPResvFieldVal = CmnResv1;
2719 2 : GetTLPResvFieldVal = CmnResv2;
2720 3 : GetTLPResvFieldVal = CmnResv3;
2721 4 : GetTLPResvFieldVal = CmnResv4;
2722 5 : GetTLPResvFieldVal = CmplResv5;
2723 6 : GetTLPResvFieldVal = AddrResv6;
2724 7 : GetTLPResvFieldVal = CfgResv7;
2725 8 : GetTLPResvFieldVal = CfgResv8;
2726 9 : GetTLPResvFieldVal = DLLFrmResv9;
2727 default : PCIEX_QR_ERR( "%s %s -> Hit default case element idx=%0d", XactionID.GetSString(), XactorName, idx );
2728 }
2729}
2730
2731function string FNXPCIEXactorPacket::GetTLPResvFieldsStr()
2732{
2733 string tmp, nonZeroStr, idStr;
2734 integer i;
2735
2736 // Ensure Packet's Internal State is Up-to-Date
2737 UpdatePktState();
2738
2739 idStr = GetIDStr();
2740
2741 if (TLPNonZeroResvFieldsPres) {
2742 nonZeroStr = "";
2743 for (i=FNX_PCIE_XTR_NUM_RESV_FIELDS; i >= 1; i--) {
2744 if (NonZeroTLPResvFieldsPresVec[i] ) {
2745 nonZeroStr = { psprintf( "Resv%0d=%b ", i, GetTLPResvFieldVal(i) ), nonZeroStr };
2746 }
2747 }
2748 sprintf( GetTLPResvFieldsStr, "%s %s NonZeroResvFields:\n",
2749 idStr, GetPktPrefixStr() );
2750 sprintf( tmp, "%s %s %s",
2751 idStr, GetPktPrefixStr(), nonZeroStr );
2752 GetTLPResvFieldsStr = { GetTLPResvFieldsStr, tmp };
2753 }
2754 else
2755 sprintf( GetTLPResvFieldsStr, "%s %s ResvFields: All-Zero\n",
2756 idStr, GetPktPrefixStr() );
2757}
2758
2759function ReportClass FNXPCIEXactorPacket::CreateReport()
2760{
2761 CreateReport = MyReport;
2762}
2763
2764function string FNXPCIEXactorPacket::GetPktPrefixStr()
2765{
2766 sprintf( GetPktPrefixStr, "PCIE_%s_%0d", Util.PktTypeToStr( PktType ), PortNum );
2767}
2768
2769function bit FNXPCIEXactorPacket::isTlp()
2770{
2771 if (PktType == FNX_PCIE_XTR_PKT_TYPE_TLP)
2772 isTlp = 1;
2773 else
2774 isTlp = 0;
2775}
2776
2777function bit FNXPCIEXactorPacket::isTlpMessage()
2778{
2779 if ( (Util.TypeIsMsg(CmnType)) ||
2780 (Util.TypeIsMsgD(CmnType)) )
2781 isTlpMessage = 1;
2782 else
2783 isTlpMessage = 0;
2784}
2785
2786function bit FNXPCIEXactorPacket::isTlpVendorMessage()
2787{
2788 if ( ( isTlpMessage() ) &&
2789 ( (MsgCode === FNX_PCIE_XTR_MSG_CODE_VD_TYPE0) ||
2790 (MsgCode === FNX_PCIE_XTR_MSG_CODE_VD_TYPE1) ) )
2791 isTlpVendorMessage = 1;
2792 else
2793 isTlpVendorMessage = 0;
2794}
2795
2796function bit FNXPCIEXactorPacket::isTlpRequest()
2797{
2798 if (isTlpMessage()) {
2799 isTlpRequest = 1;
2800 }
2801 else { // Not a MSG or MSGD Request Packet
2802
2803 case (CmnType) {
2804
2805 FNX_PCIE_XTR_TYPE_MRD,
2806 FNX_PCIE_XTR_TYPE_MRDLK,
2807 FNX_PCIE_XTR_TYPE_MWR,
2808 FNX_PCIE_XTR_TYPE_IORD,
2809 FNX_PCIE_XTR_TYPE_IOWR,
2810 FNX_PCIE_XTR_TYPE_CFGRD0,
2811 FNX_PCIE_XTR_TYPE_CFGWR0,
2812 FNX_PCIE_XTR_TYPE_CFGRD1,
2813 FNX_PCIE_XTR_TYPE_CFGWR1 : isTlpRequest = 1;
2814
2815 default : isTlpRequest = 0;
2816 }
2817 }
2818}
2819
2820function bit FNXPCIEXactorPacket::isTlpIORequest()
2821{
2822 case (CmnType) {
2823 FNX_PCIE_XTR_TYPE_IORD,
2824 FNX_PCIE_XTR_TYPE_IOWR : isTlpIORequest = 1;
2825 default : isTlpIORequest = 0;
2826 }
2827}
2828
2829function bit FNXPCIEXactorPacket::isTlpCfgRequest()
2830{
2831 case (CmnType) {
2832 FNX_PCIE_XTR_TYPE_CFGRD0,
2833 FNX_PCIE_XTR_TYPE_CFGWR0,
2834 FNX_PCIE_XTR_TYPE_CFGRD1,
2835 FNX_PCIE_XTR_TYPE_CFGWR1 : isTlpCfgRequest = 1;
2836 default : isTlpCfgRequest = 0;
2837 }
2838}
2839
2840function bit FNXPCIEXactorPacket::isTlpMemRequest32()
2841{
2842 case (GetFmtType()) {
2843 FNX_PCIE_XTR_FMT_TYPE_MRD_32,
2844 FNX_PCIE_XTR_FMT_TYPE_MRDLK_32,
2845 FNX_PCIE_XTR_FMT_TYPE_MWR_32 : isTlpMemRequest32 = 1;
2846 default : isTlpMemRequest32 = 0;
2847 }
2848}
2849
2850function bit FNXPCIEXactorPacket::isTlpMemRequest64()
2851{
2852 case (GetFmtType()) {
2853 FNX_PCIE_XTR_FMT_TYPE_MRD_64,
2854 FNX_PCIE_XTR_FMT_TYPE_MRDLK_64,
2855 FNX_PCIE_XTR_FMT_TYPE_MWR_64 : isTlpMemRequest64 = 1;
2856 default : isTlpMemRequest64 = 0;
2857 }
2858}
2859
2860function bit FNXPCIEXactorPacket::isTlpCompletion()
2861{
2862 case (CmnType) {
2863 FNX_PCIE_XTR_TYPE_CPL,
2864 FNX_PCIE_XTR_TYPE_CPLD,
2865 FNX_PCIE_XTR_TYPE_CPLLK,
2866 FNX_PCIE_XTR_TYPE_CPLDLK : isTlpCompletion = 1;
2867 default : isTlpCompletion = 0;
2868 }
2869}
2870
2871function bit FNXPCIEXactorPacket::isDllp()
2872{
2873 if (PktType == FNX_PCIE_XTR_PKT_TYPE_DLLP)
2874 isDllp = 1;
2875 else
2876 isDllp = 0;
2877}
2878
2879function bit FNXPCIEXactorPacket::isDllpAckNak()
2880{
2881 case (DllpType) {
2882 FNX_PCIE_XTR_DLLP_TYPE_ACK,
2883 FNX_PCIE_XTR_DLLP_TYPE_NAK : isDllpAckNak = 1;
2884 default : isDllpAckNak = 0;
2885 }
2886}
2887
2888function bit FNXPCIEXactorPacket::isDllpFC()
2889{
2890 case (DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_TYPE_INT_SLC]) {
2891 FNX_PCIE_XTR_FC_DLLP_TYPE_INIT_FC1_P,
2892 FNX_PCIE_XTR_FC_DLLP_TYPE_INIT_FC1_NP,
2893 FNX_PCIE_XTR_FC_DLLP_TYPE_INIT_FC1_CPL,
2894 FNX_PCIE_XTR_FC_DLLP_TYPE_INIT_FC2_P,
2895 FNX_PCIE_XTR_FC_DLLP_TYPE_INIT_FC2_NP,
2896 FNX_PCIE_XTR_FC_DLLP_TYPE_INIT_FC2_CPL,
2897 FNX_PCIE_XTR_FC_DLLP_TYPE_UPDATE_FC_P,
2898 FNX_PCIE_XTR_FC_DLLP_TYPE_UPDATE_FC_NP,
2899 FNX_PCIE_XTR_FC_DLLP_TYPE_UPDATE_FC_CPL : isDllpFC = 1;
2900 default : isDllpFC = 0;
2901 }
2902}
2903
2904function bit FNXPCIEXactorPacket::isDllpFCUpdate()
2905{
2906 case (DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_TYPE_INT_SLC]) {
2907 FNX_PCIE_XTR_FC_DLLP_TYPE_UPDATE_FC_P,
2908 FNX_PCIE_XTR_FC_DLLP_TYPE_UPDATE_FC_NP,
2909 FNX_PCIE_XTR_FC_DLLP_TYPE_UPDATE_FC_CPL : isDllpFCUpdate = 1;
2910 default : isDllpFCUpdate = 0;
2911 }
2912}
2913
2914function bit FNXPCIEXactorPacket::isDllpVendor()
2915{
2916 case (DllpType) {
2917 FNX_PCIE_XTR_DLLP_TYPE_VENDOR : isDllpVendor = 1;
2918 default : isDllpVendor = 0;
2919 }
2920}
2921
2922function bit FNXPCIEXactorPacket::isDllpPM()
2923{
2924 case (DllpType) {
2925 FNX_PCIE_XTR_DLLP_TYPE_PM_ENTER_L1,
2926 FNX_PCIE_XTR_DLLP_TYPE_PM_ENTER_L23,
2927 FNX_PCIE_XTR_DLLP_TYPE_PM_ACTIVE_ST_REQ_L1,
2928 FNX_PCIE_XTR_DLLP_TYPE_PM_REQUEST_ACK : isDllpPM = 1;
2929 default : isDllpPM = 0;
2930 }
2931}
2932
2933task FNXPCIEXactorPacket::SyncDriveStart()
2934{
2935 sync( ANY, eDriveStart );
2936}
2937
2938task FNXPCIEXactorPacket::TriggerDriveStart()
2939{
2940 trigger( ONE_BLAST, eDriveStart );
2941}
2942
2943task FNXPCIEXactorPacket::SyncDriveEnd()
2944{
2945 sync( ANY, eDriveEnd );
2946}
2947
2948task FNXPCIEXactorPacket::TriggerDriveEnd()
2949{
2950 trigger( ONE_BLAST, eDriveEnd );
2951}
2952
2953task FNXPCIEXactorPacket::SyncReplayEnd()
2954{
2955 sync( ANY, eReplayEnd );
2956}
2957
2958task FNXPCIEXactorPacket::TriggerReplayEnd()
2959{
2960 trigger( ONE_BLAST, eReplayEnd );
2961}
2962
2963task FNXPCIEXactorPacket::SetTLPDefaultExpectFields() {
2964 PktReset();
2965 CmnTC = { FNX_PCIE_XTR_CMN_TC_WIDTH {1'b0} };
2966 CmnTD = { FNX_PCIE_XTR_CMN_TD_WIDTH {1'b0} };
2967 CmnEP = { FNX_PCIE_XTR_CMN_EP_WIDTH {1'b0} };
2968 CmnRO = { FNX_PCIE_XTR_CMN_RO_WIDTH {1'b0} };
2969 CmnSnoop = { FNX_PCIE_XTR_CMN_SNOOP_WIDTH {1'b0} };
2970 ReqBusNum = { FNX_PCIE_XTR_REQ_BUS_NUM_WIDTH {1'b0} };
2971 ReqDeviceNum = { FNX_PCIE_XTR_REQ_DEVICE_NUM_WIDTH {1'b0} };
2972 ReqFuncNum = { FNX_PCIE_XTR_REQ_FUNC_NUM_WIDTH {1'b0} };
2973 ReqTag = { FNX_PCIE_XTR_REQ_TAG_WIDTH {1'bx} };
2974}
2975
2976task FNXPCIEXactorPacket::SetMemTLPDefaultExpectFields() {
2977 SetTLPDefaultExpectFields();
2978}
2979
2980task FNXPCIEXactorPacket::SetIOTLPDefaultExpectFields() {
2981 SetTLPDefaultExpectFields();
2982 CmnLength = FNX_PCIE_XTR_CMN_LENGTH_WIDTH'b1;
2983 BELastDW = { FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH {1'b0} };
2984}
2985
2986task FNXPCIEXactorPacket::SetCfgTLPDefaultExpectFields() {
2987 SetTLPDefaultExpectFields();
2988 CmnLength = FNX_PCIE_XTR_CMN_LENGTH_WIDTH'b1;
2989 BELastDW = { FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH {1'b0} };
2990}
2991
2992task FNXPCIEXactorPacket::SetTLPDefaultDriveFields() {
2993 //PktReset();
2994 GenTag = 0;
2995}
2996
2997task FNXPCIEXactorPacket::SetCplTLPDefaultDriveFields() {
2998 SetTLPDefaultDriveFields();
2999 '{CmnFmt, CmnType} = FNX_PCIE_XTR_FMT_TYPE_CPL;
3000 CmnTC = { FNX_PCIE_XTR_CMN_TC_WIDTH {1'b0} };
3001 CmnLength = FNX_PCIE_XTR_CMN_LENGTH_WIDTH'b1;
3002 CmnTD = { FNX_PCIE_XTR_CMN_TD_WIDTH {1'b0} };
3003 CmnEP = { FNX_PCIE_XTR_CMN_EP_WIDTH {1'b0} };
3004 CmnRO = { FNX_PCIE_XTR_CMN_RO_WIDTH {1'b0} };
3005 CmplStatus = { FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH {1'b0} };
3006 CmplByteCount = 4;
3007 CmplLowerAddr = { FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH {1'b0} };
3008}
3009
3010task FNXPCIEXactorPacket::SetCplDTLPDefaultDriveFields() {
3011 SetTLPDefaultDriveFields();
3012 '{CmnFmt, CmnType} = FNX_PCIE_XTR_FMT_TYPE_CPLD;
3013 CmnTC = { FNX_PCIE_XTR_CMN_TC_WIDTH {1'b0} };
3014 CmnTD = { FNX_PCIE_XTR_CMN_TD_WIDTH {1'b0} };
3015 CmnEP = { FNX_PCIE_XTR_CMN_EP_WIDTH {1'b0} };
3016 CmnRO = { FNX_PCIE_XTR_CMN_RO_WIDTH {1'b0} };
3017 CmplStatus = { FNX_PCIE_XTR_CMPL_CMPL_STATUS_WIDTH {1'b0} };
3018 CmplLowerAddr = { FNX_PCIE_XTR_CMPL_LOWER_ADDR_WIDTH {1'b0} };
3019}
3020
3021task FNXPCIEXactorPacket::SetMemTLPDefaultDriveFields() {
3022 SetTLPDefaultDriveFields();
3023 CmnTC = { FNX_PCIE_XTR_CMN_TC_WIDTH {1'b0} };
3024 CmnTD = { FNX_PCIE_XTR_CMN_TD_WIDTH {1'b0} };
3025 CmnEP = { FNX_PCIE_XTR_CMN_EP_WIDTH {1'b0} };
3026 CmnRO = { FNX_PCIE_XTR_CMN_RO_WIDTH {1'b0} };
3027 CmnSnoop = { FNX_PCIE_XTR_CMN_SNOOP_WIDTH {1'b0} };
3028}
3029
3030task FNXPCIEXactorPacket::SetReqId( bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] reqId )
3031{
3032 ReqBusNum = reqId[ FNX_PCIE_XTR_REQ_ID_BUS_NUM_INT_SLC ];
3033 ReqDeviceNum = reqId[ FNX_PCIE_XTR_REQ_ID_DEVICE_NUM_INT_SLC ];
3034 ReqFuncNum = reqId[ FNX_PCIE_XTR_REQ_ID_FUNC_NUM_INT_SLC ];
3035}
3036
3037function bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] FNXPCIEXactorPacket::GetReqId()
3038{
3039 GetReqId[ FNX_PCIE_XTR_REQ_ID_BUS_NUM_INT_SLC ] = ReqBusNum;
3040 GetReqId[ FNX_PCIE_XTR_REQ_ID_DEVICE_NUM_INT_SLC ] = ReqDeviceNum;
3041 GetReqId[ FNX_PCIE_XTR_REQ_ID_FUNC_NUM_INT_SLC ] = ReqFuncNum;
3042}
3043
3044task FNXPCIEXactorPacket::SetCmplId( bit [FNX_PCIE_XTR_CMPL_COMPLETER_ID_WIDTH-1:0] cmplId )
3045{
3046 CmplBusNum = cmplId[ FNX_PCIE_XTR_REQ_ID_BUS_NUM_INT_SLC ];
3047 CmplDeviceNum = cmplId[ FNX_PCIE_XTR_REQ_ID_DEVICE_NUM_INT_SLC ];
3048 CmplFuncNum = cmplId[ FNX_PCIE_XTR_REQ_ID_FUNC_NUM_INT_SLC ];
3049}
3050
3051function bit [FNX_PCIE_XTR_CMPL_COMPLETER_ID_WIDTH-1:0] FNXPCIEXactorPacket::GetCmplId()
3052{
3053 GetCmplId[ FNX_PCIE_XTR_REQ_ID_BUS_NUM_INT_SLC ] = CmplBusNum;
3054 GetCmplId[ FNX_PCIE_XTR_REQ_ID_DEVICE_NUM_INT_SLC ] = CmplDeviceNum;
3055 GetCmplId[ FNX_PCIE_XTR_REQ_ID_FUNC_NUM_INT_SLC ] = CmplFuncNum;
3056}
3057
3058task FNXPCIEXactorPacket::SetCfgId( bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] cfgId )
3059{
3060 CfgBusNum = cfgId[ FNX_PCIE_XTR_REQ_ID_BUS_NUM_INT_SLC ];
3061 CfgDeviceNum = cfgId[ FNX_PCIE_XTR_REQ_ID_DEVICE_NUM_INT_SLC ];
3062 CfgFuncNum = cfgId[ FNX_PCIE_XTR_REQ_ID_FUNC_NUM_INT_SLC ];
3063}
3064
3065function bit [FNX_PCIE_XTR_REQ_REQUESTER_ID_WIDTH-1:0] FNXPCIEXactorPacket::GetCfgId()
3066{
3067 GetCfgId[ FNX_PCIE_XTR_REQ_ID_BUS_NUM_INT_SLC ] = CfgBusNum;
3068 GetCfgId[ FNX_PCIE_XTR_REQ_ID_DEVICE_NUM_INT_SLC ] = CfgDeviceNum;
3069 GetCfgId[ FNX_PCIE_XTR_REQ_ID_FUNC_NUM_INT_SLC ] = CfgFuncNum;
3070}
3071
3072task FNXPCIEXactorPacket::SetFmtType( bit [FNX_PCIE_XTR_CMN_FMT_TYPE_WIDTH-1:0] fmtType )
3073{
3074 CmnFmt = fmtType[FNX_PCIE_XTR_FMT_TYPE_FMT_INT_SLC];
3075 CmnType = fmtType[FNX_PCIE_XTR_FMT_TYPE_TYPE_INT_SLC];
3076}
3077
3078function bit [FNX_PCIE_XTR_CMN_FMT_TYPE_WIDTH-1:0] FNXPCIEXactorPacket::GetFmtType()
3079{
3080 GetFmtType[FNX_PCIE_XTR_FMT_TYPE_FMT_INT_SLC] = CmnFmt;
3081 GetFmtType[FNX_PCIE_XTR_FMT_TYPE_TYPE_INT_SLC] = CmnType;
3082 if ( (Util.FmtTypeIsMsg(GetFmtType)) ||
3083 (Util.FmtTypeIsMsgD(GetFmtType)) ) {
3084 GetFmtType[ FNX_PCIE_XTR_FMT_TYPE_MSG_ROUTING_SLC ] = MsgRouting;
3085 }
3086}
3087
3088task FNXPCIEXactorPacket::SetAttr( bit [FNX_PCIE_XTR_CMN_ATTR_WIDTH-1:0] attr )
3089{
3090 CmnRO = attr[ FNX_PCIE_XTR_ATTR_RO_INT_SLC ];
3091 CmnSnoop = attr[ FNX_PCIE_XTR_ATTR_SNOOP_INT_SLC ];
3092}
3093
3094function bit [FNX_PCIE_XTR_CMN_ATTR_WIDTH-1:0] FNXPCIEXactorPacket::GetAttr()
3095{
3096 GetAttr[FNX_PCIE_XTR_ATTR_RO_INT_SLC] = CmnRO;
3097 GetAttr[FNX_PCIE_XTR_ATTR_SNOOP_INT_SLC] = CmnSnoop;
3098}
3099
3100task FNXPCIEXactorPacket::SetDllpFCType( bit [FNX_PCIE_XTR_DLLP_FC_TYPE_WIDTH-1:0] fcType )
3101{
3102 DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_TYPE_INT_SLC] = fcType;
3103}
3104
3105function bit [FNX_PCIE_XTR_DLLP_FC_TYPE_WIDTH-1:0] FNXPCIEXactorPacket::GetDllpFCType()
3106{
3107 GetDllpFCType = DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_TYPE_INT_SLC];
3108}
3109
3110task FNXPCIEXactorPacket::SetDllpFCVC( bit [FNX_PCIE_XTR_DLLP_FC_VC_WIDTH-1:0] fcVC )
3111{
3112 DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_VC_INT_SLC] = fcVC;
3113}
3114
3115function bit [FNX_PCIE_XTR_DLLP_FC_VC_WIDTH-1:0] FNXPCIEXactorPacket::GetDllpFCVC()
3116{
3117 GetDllpFCVC = DllpType[FNX_PCIE_XTR_DLLP_FC_TYPE_VC_INT_SLC];
3118}
3119
3120// Returns Number of Payload Bytes Being Transferred by The Packet
3121function integer FNXPCIEXactorPacket::NumBytes()
3122{
3123 integer i, numBytesEnabled;
3124
3125 // If a TLP IO/Cfg Request Account for First(Only) DW Byte Enables
3126 if ((isTlpIORequest()) || (isTlpCfgRequest())) {
3127 NumBytes = 0;
3128 if (CmnLength === 1) {
3129 for (i=0; i < FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH; i++) {
3130 if (BEFirstDW[i] === 1'b1)
3131 NumBytes++;
3132 }
3133 }
3134 return;
3135 }
3136
3137 // If a TLP Memory Request Determine Bytes from Length and Byte Enables
3138 if ((isTlpMemRequest32()) || (isTlpMemRequest64())) {
3139
3140 // Initially Set Number of Bytes to Length Times Four
3141 NumBytes = CmnLength * 4;
3142
3143 // Subtract Out Unenabled Bytes in First/Only DW
3144 if (NumBytes > 0) {
3145 numBytesEnabled = 0;
3146 for (i=0; i < FNX_PCIE_XTR_BE_FIRST_DW_BE_WIDTH; i++) {
3147 if (BEFirstDW[i] === 1'b1)
3148 numBytesEnabled++;
3149 }
3150 NumBytes = NumBytes - 4;
3151 NumBytes = NumBytes + numBytesEnabled;
3152 }
3153
3154 // Subtract Out Unenabled Bytes in First DW
3155 if (NumBytes > 4) {
3156 numBytesEnabled = 0;
3157 for (i=0; i < FNX_PCIE_XTR_BE_LAST_DW_BE_WIDTH; i++) {
3158 if (BELastDW[i] === 1'b1)
3159 numBytesEnabled++;
3160 }
3161 NumBytes = NumBytes - 4;
3162 NumBytes = NumBytes + numBytesEnabled;
3163 }
3164 return;
3165 }
3166
3167 // If TLP is a Completion Then Number of Bytes is Length Times Four
3168 if (isTlpCompletion()) {
3169 NumBytes = CmnLength * 4;
3170 return;
3171 }
3172}