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

Subversion Repositories t6507lp

[/] [t6507lp/] [trunk/] [rtl/] [verilog/] [t6507lp_alu_tb.v] - Blame information for rev 150

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 127 gabrielosh
`include "timescale.v"
2 136 gabrielosh
module t6507lp_alu_tb;
3 127 gabrielosh
 
4 136 gabrielosh
`include  "t6507lp_package.v"
5 127 gabrielosh
 
6 136 gabrielosh
reg         clk;
7 140 gabrielosh
reg         reset_n;
8 136 gabrielosh
reg         alu_enable;
9
wire [7:0]  alu_result;
10
wire [7:0]  alu_status;
11
reg  [7:0]  alu_opcode;
12
reg  [7:0]  alu_a;
13
wire [7:0]  alu_x;
14
wire [7:0]  alu_y;
15
reg  [31:0] i;
16 127 gabrielosh
 
17
reg [7:0] alu_result_expected;
18
reg [7:0] alu_status_expected;
19
reg [7:0] alu_x_expected;
20
reg [7:0] alu_y_expected;
21
 
22
reg c_aux;
23
reg [7:0] temp;
24
 
25 136 gabrielosh
t6507lp_alu DUT (
26
                        .clk            (clk),
27
                        .reset_n        (reset_n),
28 127 gabrielosh
                        .alu_enable     (alu_enable),
29
                        .alu_result     (alu_result),
30
                        .alu_status     (alu_status),
31
                        .alu_opcode     (alu_opcode),
32
                        .alu_a          (alu_a),
33
                        .alu_x          (alu_x),
34
                        .alu_y          (alu_y)
35
                );
36
 
37
 
38
localparam period = 10;
39
 
40
task check;
41
        begin
42
                $display("               RESULTS       EXPECTED");
43
                $display("alu_result       %h             %h   ", alu_result, alu_result_expected);
44
                $display("alu_status    %b       %b   ", alu_status, alu_status_expected);
45
                $display("alu_x            %h             %h   ", alu_x,      alu_x_expected     );
46
                $display("alu_y            %h             %h   ", alu_y,      alu_y_expected     );
47 150 gabrielosh
                if ((alu_result_expected == alu_result) && (alu_status_expected == alu_status) && (alu_x_expected == alu_x) && (alu_y_expected == alu_y))
48 127 gabrielosh
                begin
49 150 gabrielosh
                        $display("Instruction %h... OK!", alu_opcode);
50 127 gabrielosh
                end
51
                else
52
                begin
53 150 gabrielosh
                        $display("ERROR at instruction %h",alu_opcode);
54
                        $finish;
55 127 gabrielosh
                end
56
        end
57
endtask
58
 
59
 
60
always begin
61 136 gabrielosh
        #(period/2) clk = ~clk;
62 127 gabrielosh
end
63
 
64
initial
65
begin
66
        // Reset
67 136 gabrielosh
        clk = 0;
68
        reset_n = 0;
69 140 gabrielosh
        @(negedge clk);
70 150 gabrielosh
        //@(negedge clk);
71 148 gabrielosh
        reset_n = 1;
72 127 gabrielosh
        alu_enable = 1;
73
        alu_result_expected = 8'h00;
74
        alu_status_expected = 8'b00100010;
75
        alu_x_expected = 8'h00;
76
        alu_y_expected = 8'h00;
77
 
78
        // LDA
79
        alu_a = 0;
80
        alu_opcode = LDA_IMM;
81
        //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
82
        //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
83 140 gabrielosh
        @(negedge clk);
84 127 gabrielosh
        alu_result_expected = 8'h00;
85
        //                       NV1BDIZC
86 149 gabrielosh
    alu_status_expected = 8'b00100010;
87 127 gabrielosh
        check();
88
 
89
        // ADC
90
        alu_opcode = ADC_IMM;
91
        alu_a = 1;
92
        for (i = 0; i < 1000; i = i + 1)
93
        begin
94 149 gabrielosh
                alu_a = $random;
95 140 gabrielosh
                @(negedge clk);
96 149 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
97
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
98
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], DUT.result);
99 127 gabrielosh
                {alu_status_expected[C], alu_result_expected} = alu_a + alu_result_expected + alu_status_expected[C];
100
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
101
                alu_status_expected[N] = alu_result_expected[7];
102
                alu_status_expected[V] = ((alu_a[7] == DUT.A[7]) && (alu_a[7] != alu_result_expected[7]));
103
                check();
104
        end
105
 
106 148 gabrielosh
        // ASL
107 145 gabrielosh
        alu_opcode = ASL_ABS;
108
        for (i = 0; i < 1000; i = i + 1)
109
        begin
110
                alu_a = i;
111
                @(negedge clk);
112
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
113
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
114
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
115
                {alu_status_expected[C], alu_result_expected} = {alu_a,1'b0};
116
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
117
                alu_status_expected[N] = alu_result_expected[7];
118
                check();
119
        end
120
 
121
        // LDA
122
        alu_a = 0;
123
        alu_opcode = LDA_IMM;
124
    //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
125
        //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
126
        @(negedge clk);
127
        alu_result_expected = 8'h00;
128
        //                       NV1BDIZC
129
        alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
130
        alu_status_expected[N] = alu_result_expected[7];
131
        check();
132
 
133 127 gabrielosh
        // SBC
134
        alu_opcode = SBC_IMM;
135
        for (i = 0; i < 1000; i = i + 1)
136
        begin
137 145 gabrielosh
                alu_a = 1;
138 140 gabrielosh
                @(negedge clk);
139 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
140
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
141
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
142
                {alu_status_expected[C], alu_result_expected} = alu_result_expected - alu_a - ~alu_status_expected[C];
143
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
144
                alu_status_expected[N] = alu_result_expected[7];
145
                alu_status_expected[V] = ((alu_a[7] == DUT.A[7]) && (alu_a[7] != alu_result_expected[7]));
146
                check();
147
        end
148
 
149
        // LDA
150
        alu_opcode = LDA_IMM;
151
        for (i = 0; i < 1000; i = i + 1)
152
        begin
153
                alu_a = i;
154 140 gabrielosh
                @(negedge clk);
155 127 gabrielosh
                alu_result_expected = i;
156
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
157
                alu_status_expected[N] = alu_result_expected[7];
158
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
159
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
160
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
161
                check();
162
        end
163
 
164
        // LDX
165
        alu_opcode = LDX_IMM;
166
        for (i = 0; i < 1000; i = i + 1)
167
        begin
168
                alu_a = i;
169 140 gabrielosh
                @(negedge clk);
170 127 gabrielosh
                alu_x_expected = i;
171
                //alu_result_expected = i;
172
                alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
173
                alu_status_expected[N] = alu_x_expected[7];
174
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
175
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
176
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
177
                check();
178
        end
179
 
180
        // LDY
181
        alu_opcode = LDY_IMM;
182
        for (i = 0; i < 1001; i = i + 1)
183
        begin
184
                alu_a = i;
185 140 gabrielosh
                @(negedge clk);
186 127 gabrielosh
                alu_y_expected = i;
187
                //alu_result_expected = i;
188
                alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
189
                alu_status_expected[N] = alu_y_expected[7];
190
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
191
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
192
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
193
                check();
194
        end
195
 
196
        // STA
197
        alu_opcode = STA_ABS;
198
        for (i = 0; i < 1000; i = i + 1)
199
        begin
200
                alu_a = i;
201 140 gabrielosh
                @(negedge clk);
202 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
203
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
204
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
205
                check();
206
        end
207
 
208
        // STX
209
        alu_opcode = STX_ABS;
210
        for (i = 0; i < 1000; i = i + 1)
211
        begin
212
                alu_a = i;
213 140 gabrielosh
                @(negedge clk);
214 127 gabrielosh
                //alu_result_expected = i;
215
                //alu_x_expected = i;
216
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
217
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
218
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
219
                check();
220
        end
221
 
222
        // STY
223
        alu_opcode = STY_ABS;
224
        for (i = 0; i < 1000; i = i + 1)
225
        begin
226
                alu_a = i;
227 140 gabrielosh
                @(negedge clk);
228 127 gabrielosh
                //alu_result_expected = i;
229
                //alu_y_expected = i;
230
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
231
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
232
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
233
                check();
234
        end
235
 
236
        // CMP
237
        alu_opcode = CMP_IMM;
238
        for (i = 0; i < 1000; i = i + 1)
239
        begin
240
                alu_a = i;
241 140 gabrielosh
                @(negedge clk);
242 127 gabrielosh
                temp = alu_result_expected - alu_a;
243
                alu_status_expected[Z] = (temp == 0) ? 1 : 0;
244
                alu_status_expected[N] = temp[7];
245
                alu_status_expected[C] = (alu_result_expected >= alu_a) ? 1 : 0;
246
                //alu_result_expected = i;
247
                //alu_y_expected = i;
248
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
249
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
250
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
251
                check();
252
        end
253
 
254
        // CPX
255
        alu_opcode = CPX_IMM;
256
        for (i = 0; i < 1000; i = i + 1)
257
        begin
258
                alu_a = i;
259 140 gabrielosh
                @(negedge clk);
260 127 gabrielosh
                temp = alu_x_expected - alu_a;
261
                alu_status_expected[Z] = (temp == 0) ? 1 : 0;
262
                alu_status_expected[N] = temp[7];
263
                alu_status_expected[C] = (alu_x_expected >= alu_a) ? 1 : 0;
264
                //alu_result_expected = i;
265
                //alu_y_expected = i;
266
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
267
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
268
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
269
                check();
270
        end
271
 
272
        // CPY
273
        alu_opcode = CPY_IMM;
274
        for (i = 0; i < 1000; i = i + 1)
275
        begin
276
                alu_a = i;
277 140 gabrielosh
                @(negedge clk);
278 127 gabrielosh
                temp = alu_y_expected - alu_a;
279
                alu_status_expected[Z] = (temp == 0) ? 1 : 0;
280
                alu_status_expected[N] = temp[7];
281
                alu_status_expected[C] = (alu_y_expected >= alu_a) ? 1 : 0;
282
                //alu_result_expected = i;
283
                //alu_y_expected = i;
284
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
285
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
286
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
287
                check();
288
        end
289
 
290
 
291
        // AND
292
        alu_opcode = AND_IMM;
293
        for (i = 0; i < 1000; i = i + 1)
294
        begin
295
                alu_a = i;
296 140 gabrielosh
                @(negedge clk);
297 127 gabrielosh
                alu_result_expected = i & alu_result_expected;
298
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
299
                alu_status_expected[N] = alu_result_expected[7];
300
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
301
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
302
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
303
                check();
304
        end
305
 
306
        // ASL
307
        alu_opcode = ASL_ACC;
308
        for (i = 0; i < 1000; i = i + 1)
309
        begin
310
                alu_a = i;
311 140 gabrielosh
                @(negedge clk);
312 127 gabrielosh
                alu_status_expected[C] = alu_result_expected[7];
313
                alu_result_expected[7:0] = alu_result_expected << 1;
314
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
315
                alu_status_expected[N] = alu_result_expected[7];
316
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
317
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
318
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
319
                check();
320
        end
321
 
322
        // INC
323
        alu_opcode = INC_ZPG;
324
        for (i = 0; i < 1000; i = i + 1)
325
        begin
326
                alu_a = i;
327 140 gabrielosh
                @(negedge clk);
328 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
329
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
330
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
331
                alu_result_expected = alu_a + 1;
332
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
333
                alu_status_expected[N] = alu_result_expected[7];
334
                check();
335
        end
336
 
337
        // INX
338
        alu_opcode = INX_IMP;
339
        for (i = 0; i < 1000; i = i + 1)
340
        begin
341
                alu_a = i;
342 140 gabrielosh
                @(negedge clk);
343 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
344
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
345
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
346
                alu_x_expected = alu_x_expected + 1;
347
                alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
348
                alu_status_expected[N] = alu_x_expected[7];
349
                check();
350
        end
351
 
352
        // INY
353
        alu_opcode = INY_IMP;
354
        for (i = 0; i < 1000; i = i + 1)
355
        begin
356
                alu_a = i;
357 140 gabrielosh
                @(negedge clk);
358 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
359
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
360
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
361
                alu_y_expected = alu_y_expected + 1;
362
                alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
363
                alu_status_expected[N] = alu_y_expected[7];
364
                check();
365
        end
366
 
367
        // DEC
368
        alu_opcode = DEC_ZPG;
369
        for (i = 0; i < 1000; i = i + 1)
370
        begin
371
                alu_a = i;
372 140 gabrielosh
                @(negedge clk);
373 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
374
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
375
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
376
                alu_result_expected = alu_a - 1;
377
                alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
378
                alu_status_expected[N] = alu_result_expected[7];
379
                check();
380
        end
381
 
382
        // DEX
383
        alu_opcode = DEX_IMP;
384
        for (i = 0; i < 1000; i = i + 1)
385
        begin
386
                alu_a = i;
387 140 gabrielosh
                @(negedge clk);
388 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
389
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
390
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
391
                alu_x_expected = alu_x_expected - 1;
392
                alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
393
                alu_status_expected[N] = alu_x_expected[7];
394
                check();
395
        end
396
 
397
        // DEY
398
        alu_opcode = DEY_IMP;
399
        for (i = 0; i < 1000; i = i + 1)
400
        begin
401
                alu_a = i;
402 140 gabrielosh
                @(negedge clk);
403 127 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
404
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
405
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
406
                alu_y_expected = alu_y_expected - 1;
407
                alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
408
                alu_status_expected[N] = alu_y_expected[7];
409
                check();
410
        end
411
 
412
 
413
        // LDA
414
        alu_a = 0;
415
        alu_opcode = LDA_IMM;
416
        //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
417
        //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
418 140 gabrielosh
        @(negedge clk);
419 127 gabrielosh
        alu_result_expected = 8'h00;
420
        //                       NV1BDIZC
421
        alu_status_expected = 8'b00100010;
422
        check();
423
 
424
        // BIT
425
        alu_opcode = BIT_ZPG;
426
        for (i = 0; i < 1000; i = i + 1)
427
        begin
428
                alu_a = i;
429 140 gabrielosh
                @(negedge clk);
430 149 gabrielosh
                //$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
431
                //$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
432
                //$display("op1 = %d op2 = %d  c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
433 127 gabrielosh
                alu_status_expected[Z] = ((alu_a & alu_result_expected) == 0) ? 1 : 0;
434
                alu_status_expected[V] = alu_a[6];
435
                alu_status_expected[N] = alu_a[7];
436
                check();
437
        end
438
 
439
        // SEC
440
        alu_opcode = SEC_IMP;
441 140 gabrielosh
        @(negedge clk);
442 127 gabrielosh
        alu_status_expected[C] = 1;
443
        check();
444
 
445
        // SED
446
        alu_opcode = SED_IMP;
447 140 gabrielosh
        @(negedge clk);
448 127 gabrielosh
        alu_status_expected[D] = 1;
449
        check();
450
 
451
        // SEI
452
        alu_opcode = SEI_IMP;
453 140 gabrielosh
        @(negedge clk);
454 127 gabrielosh
        alu_status_expected[I] = 1;
455
        check();
456
 
457
        // CLC
458
        alu_opcode = CLC_IMP;
459 140 gabrielosh
        @(negedge clk);
460 127 gabrielosh
        alu_status_expected[C] = 0;
461
        check();
462
 
463
        // CLD
464
        alu_opcode = CLD_IMP;
465 140 gabrielosh
        @(negedge clk);
466 127 gabrielosh
        alu_status_expected[D] = 0;
467
        check();
468
 
469
        // CLI
470
        alu_opcode = CLI_IMP;
471 140 gabrielosh
        @(negedge clk);
472 127 gabrielosh
        alu_status_expected[I] = 0;
473
        check();
474
 
475
        // CLV
476
        alu_opcode = CLV_IMP;
477 140 gabrielosh
        @(negedge clk);
478 127 gabrielosh
        alu_status_expected[V] = 0;
479
        check();
480
 
481
        // LDA
482
        alu_opcode = LDA_IMM;
483
        alu_a = 8'h76;
484 140 gabrielosh
        @(negedge clk);
485 127 gabrielosh
        alu_result_expected = alu_a;
486
        alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
487
        alu_status_expected[N] = alu_result_expected[7];
488
        check();
489
 
490
        // TAX
491
        alu_opcode = TAX_IMP;
492 140 gabrielosh
        @(negedge clk);
493 127 gabrielosh
        alu_x_expected = alu_result_expected;
494
        alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
495
        alu_status_expected[N] = alu_x_expected[7];
496
        check();
497
 
498
        // TAY
499
        alu_opcode = TAY_IMP;
500 140 gabrielosh
        @(negedge clk);
501 127 gabrielosh
        alu_y_expected = alu_result_expected;
502
        alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
503
        alu_status_expected[N] = alu_y_expected[7];
504
        check();
505
 
506
        // TSX
507
        alu_opcode = TSX_IMP;
508 140 gabrielosh
        @(negedge clk);
509 127 gabrielosh
        alu_x_expected = alu_a;
510
        //alu_result_expected = alu_a;
511
        alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
512
        alu_status_expected[N] = alu_x_expected[7];
513
        check();
514
 
515
        // TXA
516
        alu_opcode = TXA_IMP;
517 140 gabrielosh
        @(negedge clk);
518 127 gabrielosh
        alu_result_expected = alu_x_expected;
519
        alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
520
        alu_status_expected[N] = alu_result_expected[7];
521
        check();
522
 
523
        // TXS
524
        alu_opcode = TXS_IMP;
525 140 gabrielosh
        @(negedge clk);
526 127 gabrielosh
        alu_result_expected = alu_x_expected;
527
        check();
528
 
529
        // TYA
530
        alu_opcode = TYA_IMP;
531 140 gabrielosh
        @(negedge clk);
532 127 gabrielosh
        alu_result_expected = alu_y_expected;
533
        alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
534
        alu_status_expected[N] = alu_result_expected[7];
535
        check();
536
 
537
        // Nothing should happen
538
        // BCC
539
        alu_opcode = BCC_REL;
540 140 gabrielosh
        @(negedge clk);
541 127 gabrielosh
        check();
542
 
543
        // BCS
544
        alu_opcode = BCS_REL;
545 140 gabrielosh
        @(negedge clk);
546 127 gabrielosh
        check();
547
 
548
        // BEQ
549
        alu_opcode = BEQ_REL;
550 140 gabrielosh
        @(negedge clk);
551 127 gabrielosh
        check();
552
 
553
        // BMI
554
        alu_opcode = BMI_REL;
555 140 gabrielosh
        @(negedge clk);
556 127 gabrielosh
        check();
557
 
558
        // BNE
559
        alu_opcode = BNE_REL;
560 140 gabrielosh
        @(negedge clk);
561 127 gabrielosh
        check();
562
 
563
        // BPL
564
        alu_opcode = BPL_REL;
565 140 gabrielosh
        @(negedge clk);
566 127 gabrielosh
        check();
567
 
568
        // BVC
569
        alu_opcode = BVC_REL;
570 140 gabrielosh
        @(negedge clk);
571 127 gabrielosh
        check();
572
 
573
        // BVS
574
        alu_opcode = BVS_REL;
575 140 gabrielosh
        @(negedge clk);
576 127 gabrielosh
        check();
577
 
578
        // JMP
579
        alu_opcode = JMP_ABS;
580 140 gabrielosh
        @(negedge clk);
581 127 gabrielosh
        check();
582
 
583
        // JMP
584
        alu_opcode = JMP_IND;
585 140 gabrielosh
        @(negedge clk);
586 127 gabrielosh
        check();
587
 
588
        // JSR
589
        alu_opcode = JSR_ABS;
590 140 gabrielosh
        @(negedge clk);
591 127 gabrielosh
        check();
592
 
593
        // NOP
594
        alu_opcode = NOP_IMP;
595 140 gabrielosh
        @(negedge clk);
596 127 gabrielosh
        check();
597
 
598
        // RTS
599
        alu_opcode = RTS_IMP;
600 140 gabrielosh
        @(negedge clk);
601 127 gabrielosh
        check();
602
 
603
        $display("TEST PASSED");
604
        $finish;
605
end
606
 
607
endmodule
608
 

powered by: WebSVN 2.1.0

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