Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / env / fnx / vlib / FNXPCIEXactor / src / FNXPCIEXactorBuilder.vr
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: FNXPCIEXactorBuilder.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// XactorFmwork and XactorComponents libraries
38#include "XactorBaseBuilder.vrh"
39#include "XactorBasePacket.vrh"
40#include "XactorBaseSignalInterface.vrh"
41#include "XactorBaseManager.vrh"
42#include "XactorManager.vrh"
43#include "XactorHash.vrh"
44#include "XactorBinTree.vrh"
45#include "XactorList.vrh"
46#include "XactorListWildCard.vrh"
47#include "XactorCtrl.vrh"
48#include "XactorUtilities.vrh"
49#include "XactorDefines.vri"
50#include "XactorClk.port.vri"
51
52// DenaliPCIE libary
53#include "DenaliPCIE.vri"
54
55// FNXPCIEXactor library
56#include "FNXPCIEXactorDefines.vri"
57#include "FNXPCIEXactorPorts.vri"
58
59// report library
60#include "cReport.vrh"
61#include "FNXPCIEXactorReportMacros.vri"
62
63class FNXPCIEXactorBuilder extends XactorBaseBuilder {
64
65 // Inherited Members
66 // MyReport declared in XactorBaseBuilder
67
68 // Base Class and Method Names For QR Macros
69 local string ClassName = "FNXPCIEXactorBuilder";
70 local string MethodName = null;
71
72 local FNXPCIEXactorManager Manager;
73 FNXPCIEXactorSignalInterface SignalInterface;
74
75 local string XactorName; // Name of transactor
76 local integer PortNum; // PCIE Port Number
77
78 local XactorClk ClkPort; // Clock port
79 local FNXPCIEXactorDenaliClkPort DenaliClkPort; // Denali PCIE Clocks
80 FNXPCIEXactorMiscPort MiscPort; // 3/4/04
81
82 local bit AssertCovEnabled;
83 local FNXPCIEXactorAssertCovDatabase AssertCovDatabase;
84
85 // Denali PCIE Device Reference For This Transactor
86 FNXPCIEXactorDenaliDevice PCIEDevice;
87
88 // Flow Control Engine
89 FNXPCIEXactorFCEngine FCEngine;
90
91 // Utilities
92 static FNXPCIEXactorUtilities Util;
93
94 // SelfExpect members
95 bit SelfExpectEnable;
96 integer MinSelfExpectDly;
97 integer MaxSelfExpectDly;
98
99 task new( ReportClass _Report,
100 XactorClk _ClkPort,
101 FNXPCIEXactorDenaliClkPort _DenaliClkPort,
102 FNXPCIEXactorDenaliDevice _PCIEDevice,
103 FNXPCIEXactorMiscPort _MiscPort,
104 integer _PortNum,
105 string _XactorName = FNX_PCIE_XTR_XACTOR_NAME );
106
107 // public methods
108 virtual function string CreateName();
109 virtual function XactorBasePacket CreatePacket();
110 virtual function XactorBaseManager CreateManager();
111 virtual function XactorBaseSignalInterface CreateSignalInterface();
112 virtual function XactorBaseExpectDataStruct CreateExpectDataStruct();
113 virtual function XactorBaseExpectDataStruct CreateXExpectDataStruct();
114 virtual function XactorBaseExpectDataStruct CreateHashElement();
115 virtual function ReportClass CreateReport();
116 virtual function XactorClk CreateClock();
117 virtual task AddDenaliCbk( denaliPcieCbReasonT DenCbk );
118 virtual task EnableAssertCov();
119 virtual function bit GetAssertCovEnabled();
120 virtual task ResetAssertCov();
121 virtual task AddAssertPt( denaliPcieErrorTypeT covPt );
122 virtual function bit IsAssertPtCovered( denaliPcieErrorTypeT covPt );
123 virtual function integer GetAssertPtCnt( denaliPcieErrorTypeT covPt );
124 virtual task DisplayAssertCov( ReportType rptType );
125 virtual task SetUnexpectedTLPErr();
126 virtual task SuppressUnexpectedTLPErr();
127 virtual task SomaSet( string somaParm, string somaValue );
128 virtual task Epilogue( ReportType rptType );
129
130 //Made Public since all errors need to be supressed if a Denali reset is asserted
131 task DenaliMemoryModelInit();
132 // protected methods
133 local task EnableDefaultDenaliCbks();
134
135} // end of builder sub-class
136
137// constructor
138task FNXPCIEXactorBuilder::new( ReportClass _Report,
139 XactorClk _ClkPort,
140 FNXPCIEXactorDenaliClkPort _DenaliClkPort,
141 FNXPCIEXactorDenaliDevice _PCIEDevice,
142 FNXPCIEXactorMiscPort _MiscPort,
143 integer _PortNum,
144 string _XactorName = FNX_PCIE_XTR_XACTOR_NAME )
145{
146 sprintf( XactorName, "%s_%0d", _XactorName, _PortNum );
147 ClkPort = _ClkPort;
148 DenaliClkPort = _DenaliClkPort;
149 MyReport = _Report;
150 PCIEDevice = _PCIEDevice;
151 PortNum = _PortNum;
152 MiscPort = _MiscPort;
153
154 if ( Util == null )
155 Util = new( MyReport, XactorName );
156
157 // Create Xactor Manager
158 Manager = new( this,
159 ClkPort );
160
161 // Create Assertion Coverage Database and Default Assertion Coverage to Disabled
162 AssertCovDatabase = new( MyReport, XactorName );
163 AssertCovEnabled = 0;
164
165 // Create Signal Interface
166 SignalInterface = new( Manager.ExpectFifo, // incoming TLP transactions Fifo
167 Manager.DllpExpectFifo, // incoming DLLP transactions Fifo
168 Manager.DriveFifo, // outgoing TLP/DLLP transactions Fifo
169 Manager.RetryPktFifo, // retried TLP transactions Fifo
170 MyReport, // Report reference
171 XactorName, // Name of transactor
172 Manager._XactorCtrl, // control (Enable/Disable xactor)
173 ClkPort, // Transactor clock port
174 DenaliClkPort, // Denali PCIE Clock Port
175 PCIEDevice, // Denali PCIE Device reference
176 MiscPort, // Port for Denali reset and Receive Detect signals
177 Util, // Xactor Utilities
178 AssertCovDatabase, // Assertion Coverage Database
179 PortNum, // PCIE Port Number (only used for reporting)
180 Manager.Bluntend_TX_fifo // EP blunt end data transmit fifo
181 );
182
183 // Flow Control Engine
184 FCEngine = new( MyReport, SignalInterface, DenaliClkPort, Util, XactorName );
185
186 // Default Self-Expect Members
187 SelfExpectEnable = 1'b0;
188 MinSelfExpectDly = 0;
189 MaxSelfExpectDly = 50;
190
191 // Register Default Denali Callbacks For This PCIE Device
192 EnableDefaultDenaliCbks();
193
194 // Initialize ReqID and BAR Setup of Denali Memory Model
195 DenaliMemoryModelInit();
196}
197
198function string FNXPCIEXactorBuilder::CreateName()
199{
200 CreateName = XactorName;
201}
202
203function XactorBasePacket FNXPCIEXactorBuilder::CreatePacket()
204{
205 FNXPCIEXactorPacket Packet = new( MyReport,
206 XactorName,
207 Util,
208 PortNum );
209 CreatePacket = Packet;
210}
211
212function XactorBaseManager FNXPCIEXactorBuilder::CreateManager()
213{
214 CreateManager = Manager;
215}
216
217function XactorBaseSignalInterface FNXPCIEXactorBuilder::CreateSignalInterface()
218{
219 CreateSignalInterface = SignalInterface;
220}
221
222function XactorBaseExpectDataStruct FNXPCIEXactorBuilder::CreateExpectDataStruct()
223{
224 XactorList DataStruct = new;
225 CreateExpectDataStruct = DataStruct;
226}
227
228function XactorBaseExpectDataStruct FNXPCIEXactorBuilder::CreateXExpectDataStruct()
229{
230 XactorListWildCard XDataStruct = new;
231 CreateXExpectDataStruct = XDataStruct;
232}
233
234function XactorBaseExpectDataStruct FNXPCIEXactorBuilder::CreateHashElement()
235{
236 XactorList HashElement = new;
237 CreateHashElement = HashElement;
238}
239
240function ReportClass FNXPCIEXactorBuilder::CreateReport()
241{
242 CreateReport = MyReport;
243}
244
245function XactorClk FNXPCIEXactorBuilder::CreateClock()
246{
247 CreateClock = ClkPort;
248}
249
250task FNXPCIEXactorBuilder::AddDenaliCbk( denaliPcieCbReasonT DenCbk )
251{
252 string MethodName = "AddDenaliCbk";
253 integer status;
254 status = PCIEDevice.addCb( DenCbk );
255 if (status < 0)
256 PCIEX_QR_ERR( "%s-> Failed to Add Callback=%s",
257 XactorName, DenCbk );
258 else {
259 PCIEX_QR_I( "AC: %s-> Add Callback=%s",
260 XactorName, DenCbk );
261 }
262}
263
264// This task should enabled all Denali callback points for which
265// this Xactor has handlers for in the Signal Interface
266task FNXPCIEXactorBuilder::EnableDefaultDenaliCbks()
267{
268 // User Queue Callbacks (Packets Generated By Model)
269 AddDenaliCbk( PCIE_CB_TL_user_queue_enter );
270 AddDenaliCbk( PCIE_CB_TL_user_queue_exit );
271
272 // Transaction Layer Xmit Callbacks
273 // AddDenaliCbk( PCIE_CB_TL_transmit_queue_enter );
274 // AddDenaliCbk( PCIE_CB_TL_transmit_queue_exit );
275 AddDenaliCbk( PCIE_CB_TL_to_DL );
276
277 // DLL Xmit Callbacks
278 // AddDenaliCbk( PCIE_CB_DL_TX_queue_enter );
279 // AddDenaliCbk( PCIE_CB_DL_TX_queue_exit );
280 AddDenaliCbk( PCIE_CB_DL_to_PL );
281
282 // Physical Layer Xmit Callbacks
283 AddDenaliCbk( PCIE_CB_PL_TX_start_packet ); // Drive Start
284 AddDenaliCbk( PCIE_CB_PL_TX_end_packet ); // Drive End
285
286 // Transmission Related Callbacks
287 // AddDenaliCbk( PCIE_CB_TX_trans_done );
288
289 // DLL Replay Callbacks
290 // AddDenaliCbk( PCIE_CB_DL_TX_retry_buffer_enter );
291 AddDenaliCbk( PCIE_CB_DL_TX_retry_buffer_exit );
292 // AddDenaliCbk( PCIE_CB_DL_TX_retry_buffer_purge );
293
294 // Physical Layer Recv Callbacks
295 AddDenaliCbk( PCIE_CB_PL_RX_start_packet );
296 AddDenaliCbk( PCIE_CB_PL_RX_end_packet );
297 AddDenaliCbk( PCIE_CB_PL_to_DL );
298
299 // DLL Recv Callbacks
300 AddDenaliCbk( PCIE_CB_DL_RX_queue_enter );
301 AddDenaliCbk( PCIE_CB_DL_RX_queue_exit );
302 // AddDenaliCbk( PCIE_CB_DL_to_TL );
303
304 // Transaction Layer Recv Callbacks
305 // AddDenaliCbk( PCIE_CB_TL_RX_packet );
306
307 // Reception Related Callbacks
308 // AddDenaliCbk( PCIE_CB_RX_trans_done );
309
310 // Completion Related Callbacks
311 // AddDenaliCbk( PCIE_CB_TL_TX_completion_queue_enter );
312 // AddDenaliCbk( PCIE_CB_TL_TX_completion_queue_exit );
313 // AddDenaliCbk( PCIE_CB_TL_RX_completion_queue_enter );
314 // AddDenaliCbk( PCIE_CB_TL_RX_completion_queue_exit );
315
316 // Error Related Callbacks
317 AddDenaliCbk( PCIE_CB_TX_error );
318 AddDenaliCbk( PCIE_CB_RX_error );
319 AddDenaliCbk( PCIE_CB_error );
320 AddDenaliCbk( PCIE_CB_unknown );
321}
322
323task FNXPCIEXactorBuilder::EnableAssertCov()
324{
325 string MethodName = "EnableAssertCov";
326 AssertCovEnabled = 1;
327 AddDenaliCbk( PCIE_CB_assert_pass );
328 PCIEX_QR_I( "%s-> Denali Assertion Coverage Enabled.", XactorName );
329}
330
331function bit FNXPCIEXactorBuilder::GetAssertCovEnabled()
332{
333 GetAssertCovEnabled = AssertCovEnabled;
334}
335
336task FNXPCIEXactorBuilder::DenaliMemoryModelInit()
337{
338 // Setup Default ReqID for Denali Model in DEV_CTRL Register
339 // NOTE: The FNX PCIE Xactor Does Not Make Use of the Denali Memory Model So The Value
340 // Set For a Xactor's ReqID is Unimportant Other Than to Make The Model Happy
341 SignalInterface.SetReqID( FNX_PCIE_XTR_DEFAULT_BUS_NUM,
342 PCIEDevice.getId(), // uniquify across Xactor instances
343 FNX_PCIE_XTR_DEFAULT_FUNC_NUM );
344
345 // Setup Default 64-bit BAR for Denali Model in REG0_BASE_0 and REG0_BASE_1 Registers
346 SignalInterface.SetupBAR64( PCIE_REG0_BASE_0,
347 PCIE_REG0_BASE_1,
348 FNX_PCIE_XTR_DEFAULT_BAR_64_SIZE, // NOTE: Should match width in default SOMA file
349 FNX_PCIE_XTR_DEFAULT_BAR_64_OFFSET );
350
351
352 /////////////////////////////////////////////////////////
353 // Begin -> Suppress Denali Error Checks
354 //
355 // Disable Self-Addressing TLP Check
356 SignalInterface.SuppressDenaliErr( PCIE_TL_COR_TLP_ADDRSELF_2);
357
358 // Disable Device Number Matches Stored Device Number Check
359 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlRidDev );
360
361 // Disable Bus Number Matches Stored Bus Number Check
362 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlRidBus );
363
364 // Disable Function Number Matches Stored Function Number Check
365 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlRidFunc );
366
367 // Disable Completion's BCM must not be set by PCI Express completer.
368 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlCplBCM0 );
369
370 // Disable BAR Address Check For a Device in Specified Memory/IO Range
371 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_ADNON_1 );
372
373 // Disable Check For a Device with Specified ID
374 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_IDNON_2 );
375
376 // Disable Check For 64-bit Addresses That Are Below 4GB
377 //SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlAddr4GB ); // somePerson
378
379 // Disable Check That Received Cpl/CplD Packets Have a Matching Request
380 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_CPLQ0_1 );
381
382 // Disable Check That Request Is Not Supported By Device
383 SignalInterface.SuppressDenaliErr( PCIE_TL_COR_TLP_UR_1 );
384
385 // Disable Check That Request Address/Length Combination Crosses 4K Boundary
386 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlLen4KB );
387
388 // Discard the data embedded in CplD for an earlier CfgRd, because the RequesterID
389 // was changed unexpectedly after the request packet [transId=0x%06x] was sent.
390 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_CPLUDN );
391
392 // Disable Check That Completer ID Is Not Same As Requester ID
393 SignalInterface.SuppressDenaliErr( PCIE_TL_COR_TLP_IDSELF_2 );
394
395 // Disable Check That Port Function is defined as Configuration 0.
396 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlCfg1 );
397
398 // Disable Check That Completion is Supplied For Every Driven Request
399 SignalInterface.SuppressDenaliErr( PCIE_TL_COR_TLP_CPLTO_2 );
400
401 // Disable Check two different devices write the same data to a config. register
402 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_CPLUN );
403
404 // Allow FNXPCIEXtr to send any ReqID in Cfg requests. Added by RFT. Approved by JCB.
405 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlCfgBus);
406 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlCfgDev);
407 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlCfgFun);
408
409 // Allow usage of any requester ID by Xactor regardless of pending
410 // requests in Denali's User/TX Queues
411 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_DID_TXQ);
412 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_DID_USERQ);
413 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_DID_RXCPLQ);
414
415 // Transactions pending in various Denali Q's need not conform to the BAR
416 // configuration associated with new requests since the Xactor is being
417 // used as a traffic generator
418 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_TXCPLQ);
419 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_TXCPLQ0);
420 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_RXCPLQ);
421 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_RXCPLQ0);
422 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_TXQ );
423 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_TXQ0);
424 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_USERQ);
425 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_CFG_MID_USERQ0);
426
427 // [review jcb 2/9/04] [DEN #17235] Workaround For Issue w/ Denali v1.000-14, Denali Claims CplH/CplD
428 // Credits Advertised During FC Init by an EP Must be Infinite
429 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_FCPE_INI_CPLH );
430 SignalInterface.SuppressDenaliErr( PCIE_TL_FATAL_FCPE_INI_CPLD );
431
432 // Request size is greater than Max_Read_Request_Size in Device Control Register.
433 SignalInterface.SuppressDenaliErr( PCIE_TL_NONFATAL_TLP_MF_vlLenMRR);
434 //
435 // End -> Suppress Denali Error Checks
436 /////////////////////////////////////////////////////////
437}
438
439task FNXPCIEXactorBuilder::ResetAssertCov()
440{
441 AssertCovDatabase.Reset();
442}
443
444task FNXPCIEXactorBuilder::AddAssertPt( denaliPcieErrorTypeT covPt )
445{
446 AssertCovDatabase.Add( covPt );
447}
448
449function bit FNXPCIEXactorBuilder::IsAssertPtCovered( denaliPcieErrorTypeT covPt )
450{
451 IsAssertPtCovered = AssertCovDatabase.Covered( covPt );
452}
453
454function integer FNXPCIEXactorBuilder::GetAssertPtCnt( denaliPcieErrorTypeT covPt )
455{
456 GetAssertPtCnt = AssertCovDatabase.Count( covPt );
457}
458
459task FNXPCIEXactorBuilder::DisplayAssertCov( ReportType rptType )
460{
461 AssertCovDatabase.Display( rptType );
462}
463
464task FNXPCIEXactorBuilder::Epilogue( ReportType rptType )
465{
466 string MethodName = "Epilogue";
467
468 PCIEX_QR_Type( rptType, "%s -> Begin\n%s", XactorName, SignalInterface.GetEpilogueStr() );
469 PCIEX_QR_Type( rptType, "%s -> End", XactorName );
470}
471
472task FNXPCIEXactorBuilder::SetUnexpectedTLPErr()
473{
474 string MethodName = "SetUnexpectedTLPErr";
475
476 Manager.UnexpectedTLPIsErr = 1;
477 PCIEX_QR_I( "%s -> Unexpected TLP Errors Enabled.", XactorName );
478}
479
480task FNXPCIEXactorBuilder::SuppressUnexpectedTLPErr()
481{
482 string MethodName = "SuppressUnexpectedTLPErr";
483
484 Manager.UnexpectedTLPIsErr = 0;
485 PCIEX_QR_I("%s -> Unexpected TLP Errors Suppressed.", XactorName );
486}
487
488task FNXPCIEXactorBuilder::SomaSet( string somaParm, string somaValue )
489{
490 string MethodName = "SomaSet";
491 string somaSetStr;
492 integer status;
493
494 status = DenaliDDVTclEval( { "mmsomaset", " ", PCIEDevice.GetInstanceName(), " ", somaParm, " ", somaValue } );
495 if (status >= 0)
496 PCIEX_QR_I( "Inst=%s Parm=%s Val=%s",
497 PCIEDevice.GetInstanceName(), somaParm, somaValue );
498 else
499 PCIEX_QR_ERR( "mmsomaset Failed. Inst=%s Parm=%s Val=%s",
500 PCIEDevice.GetInstanceName(), somaParm, somaValue );
501}