@@ -25,10 +25,52 @@ class ht_inner_scoreboard;
25
25
26
26
logic [TABLE_ADDR_CNT - 1 : 0 ] empty_ptr_mask;
27
27
28
+ typedef enum int unsigned {
29
+ HEAD_TABLE_WR ,
30
+
31
+ DATA_TABLE_WR ,
32
+ DATA_TABLE_RD ,
33
+
34
+ EMPTY_PTR_SRST ,
35
+ EMPTY_PTR_STORAGE_ADD ,
36
+ EMPTY_PTR_STORAGE_DEL ,
37
+
38
+ // just calcing how much we execute this functions
39
+ FUNC_CHECK_ONE_ADDR ,
40
+ FUNC_CHECK_HEAD_TABLE_EQUAL_PTR ,
41
+ FUNC_GO_THROUGH_ALL_DATA ,
42
+
43
+ // it's "fake" constant
44
+ STAT_CNT
45
+
46
+ } stat_t ;
47
+
48
+ typedef enum int unsigned {
49
+ HEAD_TABLE_BUCKET_LINKS ,
50
+
51
+ DATA_TABLE_RD_FROM_EMPTY ,
52
+
53
+ EMPTY_PTR_STORAGE_REEMPTY ,
54
+ EMPTY_PTR_STORAGE_NOTEMPTY ,
55
+
56
+ MORE_THAN_ONE_LINK ,
57
+ PTR_VAL_TO_EMPTY_ADDR ,
58
+ KEY_BUCKET_MISMATCH ,
59
+
60
+ // "fake" constant
61
+ ERR_STAT_CNT
62
+ } stat_err_t ;
63
+
64
+ int stats [STAT_CNT - 1 : 0 ];
65
+ int stats_err [ERR_STAT_CNT - 1 : 0 ];
66
+
67
+ `define INC_STATS ( x ) stats [ x ] + = 1 ;
68
+ `define INC_ERR_STATS ( x ) stats_err[ x ] + = 1 ;
69
+
28
70
function new ( input virtual head_table_if _head_table_if,
29
71
virtual data_table_if _data_table_if,
30
72
virtual empty_ptr_storage_if _eps_if
31
- );
73
+ );
32
74
33
75
this ._head_t_if = _head_table_if;
34
76
this ._data_t_if = _data_table_if;
@@ -43,14 +85,46 @@ class ht_inner_scoreboard;
43
85
eps_thread ( );
44
86
join
45
87
endtask
88
+
89
+ function void show_stat ( );
90
+ $display (" %m :" );
91
+
92
+ for ( int i = 0 ; i < STAT_CNT ; i++ )
93
+ begin
94
+ $display ( " | %-35s | %10d |" , stat_t ' (i), stats[i] );
95
+ end
96
+
97
+ $display (" " );
98
+
99
+ for ( int i = 0 ; i < ERR_STAT_CNT ; i++ )
100
+ begin
101
+ $display ( " | ERR_%-31s | %10d |" , stat_err_t ' (i), stats_err[i] );
102
+ end
103
+ endfunction
104
+
105
+ // return 1, if no error happend
106
+ function bit test_passed ( );
107
+ bit rez = 1'b1 ;
108
+
109
+ for ( int i = 0 ; i < ERR_STAT_CNT ; i++ )
110
+ begin
111
+ if ( stats_err[i] > 0 )
112
+ rez = 1'b0 ;
113
+ end
114
+
115
+ return rez;
116
+ endfunction
46
117
47
118
task head_table_thread ( );
48
119
forever
49
120
begin
50
121
@ ( _head_t_if.cb )
51
122
52
123
if ( _head_t_if.cb.wr_en )
53
- head_table[ _head_t_if.wr_addr ] = _head_t_if.wr_data;
124
+ begin
125
+ `INC_STATS ( HEAD_TABLE_WR )
126
+ head_table[ _head_t_if.cb.wr_addr ] = _head_t_if.cb.wr_data;
127
+ end
54
128
55
129
end
56
130
endtask
@@ -63,15 +137,21 @@ class ht_inner_scoreboard;
63
137
64
138
if ( _data_t_if.cb.wr_en )
65
139
begin
140
+ `INC_STATS ( DATA_TABLE_WR )
141
+
66
142
data_table[ _data_t_if.cb.wr_addr ] = _data_t_if.cb.wr_data;
143
+
67
144
do_tables_check ( );
68
145
end
69
146
70
147
if ( _data_t_if.cb.rd_en )
71
148
begin
149
+ `INC_STATS ( DATA_TABLE_RD )
150
+
72
151
// checking that we don't read from addreses that we think is empty
73
152
if ( empty_ptr_mask[ _data_t_if.cb.rd_addr ] == 1'b1 )
74
153
begin
154
+ `INC_ERR_STATS ( DATA_TABLE_RD_FROM_EMPTY )
75
155
$error ( " ERROR: reading from empty addr = 0x%x " , _data_t_if.cb.rd_addr );
76
156
end
77
157
@@ -87,13 +167,19 @@ class ht_inner_scoreboard;
87
167
88
168
if ( _eps_if.cb.srst )
89
169
begin
170
+ `INC_STATS ( EMPTY_PTR_SRST )
171
+
90
172
empty_ptr_mask = '0 ;
91
173
end
92
174
93
175
if ( _eps_if.cb.add_empty_ptr_en )
94
176
begin
177
+
178
+ `INC_STATS ( EMPTY_PTR_STORAGE_ADD )
179
+
95
180
if ( empty_ptr_mask[ _eps_if.cb.add_empty_ptr ] == 1'b1 )
96
181
begin
182
+ `INC_ERR_STATS ( EMPTY_PTR_STORAGE_REEMPTY )
97
183
$error ( " ERROR: trying to empty addr = 0x%x , that is already empty!" ,
98
184
_eps_if.cb.add_empty_ptr );
99
185
end
@@ -103,8 +189,12 @@ class ht_inner_scoreboard;
103
189
104
190
if ( _eps_if.cb.next_empty_ptr_rd_ack )
105
191
begin
192
+ `INC_STATS ( EMPTY_PTR_STORAGE_DEL )
193
+
106
194
if ( empty_ptr_mask[ _eps_if.cb.next_empty_ptr ] == 1'b0 )
107
195
begin
196
+ `INC_ERR_STATS ( EMPTY_PTR_STORAGE_NOTEMPTY )
197
+
108
198
$error ( " ERROR: trying to make not empty addr = 0x%x , that is already not empty!" ,
109
199
_eps_if.cb.next_empty_ptr );
110
200
end
@@ -122,7 +212,8 @@ class ht_inner_scoreboard;
122
212
123
213
function automatic void check_head_table_equal_ptr ( );
124
214
int ptr_cnt [BUCKETS_CNT - 1 : 0 ];
125
-
215
+
216
+ `INC_STATS ( FUNC_CHECK_HEAD_TABLE_EQUAL_PTR )
126
217
127
218
// calculating how much ptr exists in head_table
128
219
for ( int i = 0 ; i < HEAD_TABLE_WORDS ; i++ )
@@ -135,6 +226,7 @@ class ht_inner_scoreboard;
135
226
begin
136
227
if ( ptr_cnt[i] > 1 )
137
228
begin
229
+ `INC_ERR_STATS ( HEAD_TABLE_BUCKET_LINKS )
138
230
$error (" failed! bucket_num = %d ptr_cnt = %d " , i, ptr_cnt[i] );
139
231
end
140
232
end
@@ -147,22 +239,32 @@ class ht_inner_scoreboard;
147
239
int rez;
148
240
149
241
rez = 0 ;
242
+
243
+ `INC_STATS ( FUNC_CHECK_ONE_ADDR )
150
244
151
245
if ( data_addr_cnt[ _addr ] > 1 )
152
246
begin
247
+ `INC_ERR_STATS ( MORE_THAN_ONE_LINK )
248
+
153
249
$error (" ERROR: addr = 0x%x . More than one link to this addr." , _addr );
250
+
154
251
rez = - 1 ;
155
252
end
156
253
157
254
if ( empty_ptr_mask[ _addr ] == 1'b1 )
158
255
begin
256
+ `INC_ERR_STATS ( PTR_VAL_TO_EMPTY_ADDR )
257
+
159
258
$error (" ERROR: addr = 0x%x . This addr is empty, but ptr is val" , _addr );
160
259
161
260
rez = - 1 ;
162
261
end
163
262
263
+ // NOTE: only for dummy hashing
164
264
if ( data_table[ _addr ].key[KEY_WIDTH - 1 : KEY_WIDTH - BUCKET_WIDTH ] != _bucket_num )
165
265
begin
266
+ `INC_ERR_STATS ( KEY_BUCKET_MISMATCH )
267
+
166
268
$error (" ERROR: addr = 0x%x key=0x%x don't match bucket_num = 0x%x " ,
167
269
_addr, data_table[_addr].key, _bucket_num );
168
270
@@ -174,6 +276,8 @@ class ht_inner_scoreboard;
174
276
175
277
function automatic void go_through_all_data ( );
176
278
bit [BUCKET_WIDTH - 1 : 0 ] _bucket_num;
279
+
280
+ `INC_STATS ( FUNC_GO_THROUGH_ALL_DATA )
177
281
178
282
foreach ( data_addr_cnt[i] )
179
283
data_addr_cnt[i] = 0 ;
0 commit comments