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

Subversion Repositories alu_with_selectable_inputs_and_outputs

[/] [alu_with_selectable_inputs_and_outputs/] [trunk/] [verif_env/] [checker/] [checker.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dragos_don
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////      This project has been provided to you on behalf of:    ////
4
////                                                             ////
5
////            S.C. ASICArt S.R.L.                              ////
6
////                            www.asicart.com                  ////
7
////                            eli_f@asicart.com                ////
8
////                                                             ////
9
////        Author: Dragos Constantin Doncean                    ////
10
////        Email: doncean@asicart.com                           ////
11
////        Mobile: +40-740-936997                               ////
12
////                                                             ////
13
////      Downloaded from: http://www.opencores.org/             ////
14
////                                                             ////
15
/////////////////////////////////////////////////////////////////////
16
////                                                             ////
17
//// Copyright (C) 2007 Dragos Constantin Doncean                ////
18
////                         www.asicart.com                     ////
19
////                         doncean@asicart.com                 ////
20
////                                                             ////
21
//// This source file may be used and distributed without        ////
22
//// restriction provided that this copyright statement is not   ////
23
//// removed from the file and that any derivative work contains ////
24
//// the original copyright notice and the associated disclaimer.////
25
////                                                             ////
26
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
27
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
28
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
29
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
30
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
31
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
32
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
33
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
34
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
35
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
36
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
37
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
38
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
39
////                                                             ////
40
/////////////////////////////////////////////////////////////////////
41
 
42
 
43
//CHECKER
44
 
45
module CHECKER(c_clk, c_res,
46
        ic_data_0, ic_data_1, ic_data_2, ic_data_3,
47
        oc_data,
48
        oc_parity,
49
        ic_data_collected,
50
        oc_data_collected);
51
 
52
input c_clk, c_res;
53
input [7:0] ic_data_0, ic_data_1, ic_data_2, ic_data_3;
54
input [15:0] oc_data;
55
input oc_parity;
56
input [0:127] ic_data_collected, oc_data_collected;
57
 
58
integer i, j;
59
 
60
reg [15:0] checker_result;
61
reg checker_result_parity;
62
reg [3:0] checker_operator_type;
63
reg [2:0] checker_operator_symbol;
64
 
65
integer fh;
66
 
67
always @ (posedge c_clk or posedge c_res)
68
if(c_res)
69
begin
70
        i = 0;
71
        j = 0;
72
        checker_result = 16'b0;
73
        checker_result_parity = 1'b0;
74
        checker_operator_type = 4'b1111;
75
        checker_operator_symbol = 3'b111;
76
end
77
 
78
always @ (ic_data_collected[i])
79
if(ic_data_collected[i])
80
begin
81
                #1
82
                if(fh === 32'bx)
83
                        fh = $fopen("checker.out");
84
 
85
                $fdisplay(fh, "%0d INFO: Collected IN transaction no %0d: ic_data_0 = %b, ic_data_1 = %b, ic_data_2 = %b, ic_data_3 = %b",
86
                        $time, i, ic_data_0, ic_data_1, ic_data_2, ic_data_3);
87
 
88
                //calculate checker's alu result
89
                checker_operator_type = ic_data_0[7:4];
90
                checker_operator_symbol = ic_data_0[3:1];
91
 
92
                case (checker_operator_type)
93
                'd0: //Arithmetic
94
                begin
95
                        $fdisplay(fh, "Arithmetic operator");
96
                        case(checker_operator_symbol)
97
                        'd0: //Multiply
98
                        begin
99
                                checker_result = (ic_data_1 * ic_data_2);
100
                                $fdisplay(fh, "OPERATION * (Multiply): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
101
                                        ic_data_1, ic_data_2, checker_result);
102
                        end
103
                        'd1: //Divide
104
                        begin
105
                                checker_result = (ic_data_1 / ic_data_2);
106
                                $fdisplay(fh, "OPERATION / (Divide): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
107
                                        ic_data_1, ic_data_2, checker_result);
108
                        end
109
                        'd2: //Add
110
                        begin
111
                                checker_result = (ic_data_1 + ic_data_2);
112
                                $fdisplay(fh, "OPERATION + (Add): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
113
                                        ic_data_1, ic_data_2, checker_result);
114
                        end
115
                        'd3: //Substract
116
                        begin
117
                                checker_result = (ic_data_1 - ic_data_2);
118
                                $fdisplay(fh, "OPERATION - (Substract): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
119
                                        ic_data_1, ic_data_2, checker_result);
120
                        end
121
                        'd4: //Modulus
122
                        begin
123
                                checker_result = (ic_data_1 % ic_data_2);
124
                                $fdisplay(fh, "OPERATION  (Modulus): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
125
                                        ic_data_1, ic_data_2, checker_result);
126
                        end
127
                        endcase
128
                end
129
                'd1: //Logical
130
                begin
131
                        $fdisplay(fh, "Logical operator");
132
                        case(checker_operator_symbol)
133
                        'd0: //Logical negation
134
                        begin
135
                                checker_result = (!ic_data_1);
136
                                $fdisplay(fh, "OPERATION ! (Logical negation): ic_data_1 = %b, checker_result = %b",
137
                                        ic_data_1, checker_result);
138
                        end
139
                        'd1: //Logical and
140
                        begin
141
                                checker_result = (ic_data_1 && ic_data_2);
142
                                $fdisplay(fh, "OPERATION && (Logical and): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
143
                                        ic_data_1, ic_data_2, checker_result);
144
                        end
145
                        'd2: //Logical or
146
                        begin
147
                                checker_result = (ic_data_1 || ic_data_2);
148
                                $fdisplay(fh, "OPERATION || (Logical or): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
149
                                        ic_data_1, ic_data_2, checker_result);
150
                        end
151
                        endcase
152
                end
153
                'd2: //Relational
154
                begin
155
                        $fdisplay(fh, "Relational operator");
156
                        case(checker_operator_symbol)
157
                        'd0: //Greater than
158
                        begin
159
                                checker_result = (ic_data_1 > ic_data_2);
160
                                $fdisplay(fh, "OPERATION > (Greater than): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
161
                                        ic_data_1, ic_data_2, checker_result);
162
                        end
163
                        'd1: //Less than
164
                        begin
165
                                checker_result = (ic_data_1 < ic_data_2);
166
                                $fdisplay(fh, "OPERATION < (Less than): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
167
                                        ic_data_1, ic_data_2, checker_result);
168
                        end
169
                        'd2: //Greater than or equal
170
                        begin
171
                                checker_result = (ic_data_1 >= ic_data_2);
172
                                $fdisplay(fh, "OPERATION >= (Greater than or equal): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
173
                                        ic_data_1, ic_data_2, checker_result);
174
                        end
175
                        'd3: //Less than or equal
176
                        begin
177
                                checker_result = (ic_data_1 <= ic_data_2);
178
                                $fdisplay(fh, "OPERATION <= (Less than or equal): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
179
                                        ic_data_1, ic_data_2, checker_result);
180
                        end
181
                        endcase
182
                end
183
                'd3: //Equality
184
                begin
185
                        $fdisplay(fh, "Equality operator");
186
                        case(checker_operator_symbol)
187
                        'd0: //Equality
188
                        begin
189
                                checker_result = (ic_data_1 == ic_data_2);
190
                                $fdisplay(fh, "OPERATION == (Equality): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
191
                                        ic_data_1, ic_data_2, checker_result);
192
                        end
193
                        'd1: //Inequality
194
                        begin
195
                                checker_result = (ic_data_1 != ic_data_2);
196
                                $fdisplay(fh, "OPERATION != (Inequality): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
197
                                        ic_data_1, ic_data_2, checker_result);
198
                        end
199
                        'd2: //Case equality
200
                        begin
201
                                checker_result = (ic_data_1 === ic_data_2);
202
                                $fdisplay(fh, "OPERATION === (Case equality): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
203
                                        ic_data_1, ic_data_2, checker_result);
204
                        end
205
                        'd3: //Case inequality
206
                        begin
207
                                checker_result = (ic_data_1 !== ic_data_2);
208
                                $fdisplay(fh, "OPERATION !== (Case inequality): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
209
                                        ic_data_1, ic_data_2, checker_result);
210
                        end
211
                        endcase
212
                end
213
                'd4: //Bitwise
214
                begin
215
                        $fdisplay(fh, "Bitwise operator");
216
                        case(checker_operator_symbol)
217
                        'd0: //Bitwise negation
218
                        begin
219
                                checker_result = (~ ic_data_1);
220
                                $fdisplay(fh, "OPERATION ~ (Bitwise negation): ic_data_1 = %b, checker_result = %b",
221
                                        ic_data_1, checker_result);
222
                        end
223
                        'd1: //Bitwise and
224
                        begin
225
                                checker_result = (ic_data_1 & ic_data_2);
226
                                $fdisplay(fh, "OPERATION & (Bitwise and): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
227
                                        ic_data_1, ic_data_2, checker_result);
228
                        end
229
                        'd2: //Bitwise or
230
                        begin
231
                                checker_result = (ic_data_1 | ic_data_2);
232
                                $fdisplay(fh, "OPERATION | (Bitwise or): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
233
                                        ic_data_1, ic_data_2, checker_result);
234
                        end
235
                        'd3: //Bitwise xor
236
                        begin
237
                                checker_result = (ic_data_1 ^ ic_data_2);
238
                                $fdisplay(fh, "OPERATION ^ (Bitwise xor): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
239
                                        ic_data_1, ic_data_2, checker_result);
240
                        end
241
                        'd4: //Bitwise xnor (1st operator symbol)
242
                        begin
243
                                checker_result = (ic_data_1 ^~ ic_data_2);
244
                                $fdisplay(fh, "OPERATION ^~ (Bitwise xnor (1st operator symbol)): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
245
                                        ic_data_1, ic_data_2, checker_result);
246
                        end
247
                        'd5: //Bitwise xnor (2nd operator symbol)
248
                        begin
249
                                checker_result = (ic_data_1 ~^ ic_data_2);
250
                                $fdisplay(fh, "OPERATION ~^ (Bitwise xnor (2nd operator symbol)): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
251
                                        ic_data_1, ic_data_2, checker_result);
252
                        end
253
                        endcase
254
                end
255
                'd5: //Reduction
256
                begin
257
                        $fdisplay(fh, "Reduction operator");
258
                        case(checker_operator_symbol)
259
                        'd0: //Reduction and
260
                        begin
261
                                checker_result = (& ic_data_1);
262
                                $fdisplay(fh, "OPERATION & (Reduction and): ic_data_1 = %b, checker_result = %b",
263
                                        ic_data_1, checker_result);
264
                        end
265
                        'd1: //Reduction nand
266
                        begin
267
                                checker_result = (~& ic_data_1);
268
                                $fdisplay(fh, "OPERATION ~& (Reduction nand): ic_data_1 = %b, checker_result = %b",
269
                                        ic_data_1, checker_result);
270
                        end
271
                        'd2: //Reduction or
272
                        begin
273
                                checker_result = (| ic_data_1);
274
                                $fdisplay(fh, "OPERATION | (Reduction or): ic_data_1 = %b, checker_result = %b",
275
                                        ic_data_1, checker_result);
276
                        end
277
                        'd3: //Reduction nor
278
                        begin
279
                                checker_result = (~| ic_data_1);
280
                                $fdisplay(fh, "OPERATION ~| (Reduction nor): ic_data_1 = %b, checker_result = %b",
281
                                        ic_data_1, checker_result);
282
                        end
283
                        'd4: //Reduction xor
284
                        begin
285
                                checker_result = (^ ic_data_1);
286
                                $fdisplay(fh, "OPERATION ^ (Reduction xor): ic_data_1 = %b, checker_result = %b",
287
                                        ic_data_1, checker_result);
288
                        end
289
                        'd5: //Reduction xnor (1st operator symbol)
290
                        begin
291
                                checker_result = (^~ ic_data_1);
292
                                $fdisplay(fh, "OPERATION ^~ (Reduction xnor (1st operator symbol)): ic_data_1 = %b, checker_result = %b",
293
                                        ic_data_1, checker_result);
294
                        end
295
                        'd6: //Reduction xnor (2nd operator symbol)
296
                        begin
297
                                checker_result = (~^ ic_data_1);
298
                                $fdisplay(fh, "OPERATION ~^ (Reduction xnor (2nd operator symbol)): ic_data_1 = %b, checker_result = %b",
299
                                        ic_data_1, checker_result);
300
                        end
301
                        endcase
302
                end
303
                'd6: //Shift
304
                begin
305
                        $fdisplay(fh, "Shift operator");
306
                        case(checker_operator_symbol)
307
                        'd0: //Right shift
308
                        begin
309
                                checker_result = (ic_data_1 >> ic_data_2);
310
                                $fdisplay(fh, "OPERATION >> (Right shift): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
311
                                        ic_data_1, ic_data_2, checker_result);
312
                        end
313
                        'd1: //Left shift
314
                        begin
315
                                checker_result = (ic_data_1 << ic_data_2);
316
                                $fdisplay(fh, "OPERATION << (Left shift): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
317
                                        ic_data_1, ic_data_2, checker_result);
318
                        end
319
                        endcase
320
                end
321
                'd7: //Concatenation
322
                begin
323
                        $fdisplay(fh, "Concatenation operator");
324
                        case(checker_operator_symbol)
325
                        'd0: //Concatenation
326
                        begin
327
                                checker_result = {ic_data_1, ic_data_2};
328
                                $fdisplay(fh, "OPERATION {} (Concatenation): ic_data_1 = %b, ic_data_2 = %b, checker_result = %b",
329
                                        ic_data_1, ic_data_2, checker_result);
330
                        end
331
                        endcase
332
                end
333
                'd8: //Replication
334
                begin
335
                        $fdisplay(fh, "Replication operator");
336
                        case(checker_operator_symbol)
337
                        'd0: //Replication
338
                        begin
339
                                checker_result = { 2 {ic_data_1} };
340
                                $fdisplay(fh, "OPERATION { { } } (Replication): ic_data_1 = %b - replicated twice: checker_result = %b",
341
                                        ic_data_1, checker_result);
342
                        end
343
                        endcase
344
                end
345
                'd9: //Conditional
346
                begin
347
                        $fdisplay(fh, "Conditional operator");
348
                        case(checker_operator_symbol)
349
                        'd0: //Conditional
350
                        begin
351
                                checker_result = (ic_data_1 ? ic_data_2 : ic_data_3);
352
                                $fdisplay(fh, "OPERATION ?: (Conditional): ic_data_1 = %b, ic_data_2 = %b, ic_data_3=%b, checker_result = %b",
353
                                        ic_data_1, ic_data_2, ic_data_3, checker_result);
354
                        end
355
                        endcase
356
                end
357
                endcase
358
                checker_result_parity = ^checker_result; //Parity = XOR of all result's bits
359
                i = i + 1;
360
 
361
                //$fclose(fh);
362
end
363
 
364
always @ (oc_data_collected[j])
365
begin
366
        if(oc_data_collected[j])
367
        begin
368
                $fdisplay(fh, "%0d INFO: Collected OUT transaction no %0d: %b", $time, j, oc_data);
369
                //checker result
370
                if(checker_result[15:0] === oc_data[15:0])
371
                        $fdisplay(fh, "%0d INFO: Calculus of data for transaction no. %0d match! (%b - %b)",
372
                                $time, j, checker_result[15:0], oc_data[15:0]);
373
                else
374
                        $fdisplay(fh, "%0d ERROR: Calculus of data for transaction no. %0d DO NOT match! (%b - %b)",
375
                                $time, j, checker_result[15:0], oc_data[15:0]);
376
                //checker parity
377
                if(checker_result_parity === oc_parity)
378
                        $fdisplay(fh, "%0d INFO: Calculus of parity for transaction no. %0d match! (%b - %b)\n",
379
                                $time, j, checker_result_parity, oc_parity);
380
                else
381
                        $fdisplay(fh, "%0d ERROR: Calculus of parity for transaction no. %0d DO NOT match! (%b - %b)\n",
382
                                $time, j, checker_result_parity, oc_parity);
383
                j = j + 1;
384
        end
385
end
386
 
387
endmodule

powered by: WebSVN 2.1.0

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