-
Notifications
You must be signed in to change notification settings - Fork 1
/
TCC_Transaction.vr
112 lines (90 loc) · 3.19 KB
/
TCC_Transaction.vr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// See LICENSE for license details.
#ifndef INC_TCC_TRANSACTION
#define INC_TCC_TRANSACTION
//////////////////////////////////////////////////////////////////////////////
// File name: TCC_Transaction.vr
//
// This file represents a TCC transaction. A transaction has a state (IDLE,
// STARTED, COMMIT_BEGAN, COMMIT_DONE, VIOLATED), and an associated list of
// Trace_trans which were executed under the transaction.
//////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
//----- Include Related Files Here
//------------------------------------------------------------------------------
#include "generic_trans.vrh"
#include "Trace_trans.vrh"
// declare external tasks/classes/functions here if necessary
//------------------------------------------------------------------------------
//----- Place Special Definitions Here
//------------------------------------------------------------------------------
// --- Some of the definitions are placed in FromTheVerilog_defs.vrh
//------------------------------------------------------------------------------
//----- Place Auxiliary Classes Here
//------------------------------------------------------------------------------
class TCC_Transaction
{
integer _DEBUG_;
/*transactions completed under this TCC transaction*/
Trace_trans ttQ[$];
/*this represents a transaction which is underway*/
bit valid;
/* this represents a transaction which is comitting*/
bit committing;
/* this represents whether a transaction CAN complete.
* So, if a transaction is violated (according to the
* scoreboard), it will be set. But, just because it is
* 0 does not mean that this MUST complete... or does it?
* maybe we can check for false-positive violations as well!
*/
bit can_commit;
/* this represents whether a transaction CAN be violated.
* this means that it has read an address that was written
* by another transaction. The ultimate violation will
* happen depending on the order of commits.
*/
bit can_violate;
/*processor issuing this transaction*/
integer proc;
// Constructor
//-------------
task new(integer _DEBUG, integer proc);
task reset();
task LogMeToFile(integer fd);
}
//----------------------------------------
task TCC_Transaction::new(integer _DEBUG, integer _proc)
{
valid = 0;
committing = 0;
can_commit = 1;
proc = _proc;
can_violate = 0;
}
//----------------------------------------
task TCC_Transaction::reset()
{
Trace_trans popped;
valid = 0;
committing = 0;
can_commit = 1;
can_violate = 0;
while (!ttQ.empty()){
popped = ttQ.pop_front();
}
}
//----------------------------------------
task TCC_Transaction::LogMeToFile(integer fd)
{
integer ii;
if (fd){
fprintf(fd, "TCC_Transaction for proc %d:\n", proc);
fprintf(fd , " \t VALID= %d, COMMITTING= %d\n, CAN_COMMIT= %d, CAN_VIOLATE= %d", valid, committing, can_commit, can_violate);
for (ii = 0; ii < ttQ.size(); ii++){
Trace_trans t = ttQ[ii];
fprintf(fd, "\t");
ttQ[ii].LogMeToFile(fd);
}
fprintf(fd, "-------------------------------------------------\n");
}
}
#endif