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

Subversion Repositories ps2

[/] [ps2/] [tags/] [rel_6/] [bench/] [verilog/] [ps2_test_bench.v] - Blame information for rev 12

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

Line No. Rev Author Line
1 2 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  ps2_test_bench.v                                            ////
4
////                                                              ////
5
////  This file is part of the "ps2" project                      ////
6
////  http://www.opencores.org/cores/ps2/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - mihad@opencores.org                                   ////
10
////      - Miha Dolenc                                           ////
11
////                                                              ////
12
////  All additional information is avaliable in the README.txt   ////
13
////  file.                                                       ////
14
////                                                              ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 Miha Dolenc, mihad@opencores.org          ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 12 mihad
// Revision 1.4  2002/02/20 16:35:34  mihad
47
// Little/big endian changes continued
48
//
49 7 mihad
// Revision 1.3  2002/02/20 15:20:02  mihad
50
// Little/big endian changes incorporated
51
//
52 6 mihad
// Revision 1.2  2002/02/18 18:08:31  mihad
53
// One bug fixed
54
//
55 5 mihad
// Revision 1.1.1.1  2002/02/18 16:16:55  mihad
56
// Initial project import - working
57 2 mihad
//
58 5 mihad
//
59 2 mihad
 
60
`include "timescale.v"
61
`include "ps2_testbench_defines.v"
62
`include "ps2_defines.v"
63
 
64
`define KBD_STATUS_REG      32'h64
65
`define KBD_CNTL_REG        32'h64
66
`define KBD_DATA_REG        32'h60
67
/*
68
 * controller commands
69
 */
70 7 mihad
`define KBD_READ_MODE       32'h20_00_00_00
71
`define KBD_WRITE_MODE      32'h60_00_00_00
72
`define KBD_SELF_TEST       32'hAA_00_00_00
73
`define KBD_SELF_TEST2      32'hAB_00_00_00
74
`define KBD_CNTL_ENABLE     32'hAE_00_00_00
75 2 mihad
/*
76
 * keyboard commands
77
 */
78 7 mihad
`define KBD_ENABLE          32'hF4_00_00_00
79
`define KBD_DISABLE         32'hF5_00_00_00
80
`define KBD_RESET           32'hFF_00_00_00
81 2 mihad
/*
82
 * keyboard replies
83
 */
84
`define KBD_ACK             32'hFA
85
`define KBD_POR             32'hAA
86
/*
87
 * status register bits
88
 */
89
`define KBD_OBF             32'h01
90
`define KBD_IBF             32'h02
91
`define KBD_GTO             32'h40
92
`define KBD_PERR            32'h80
93
/*
94
 * keyboard controller mode register bits
95
 */
96 7 mihad
`define KBD_EKI             32'h01_00_00_00
97
`define KBD_SYS             32'h04_00_00_00
98
`define KBD_DMS             32'h20_00_00_00
99
`define KBD_KCC             32'h40_00_00_00
100
`define KBD_DISABLE_COMMAND 32'h10_00_00_00
101 12 mihad
`define AUX_OBUF_FULL       8'h20               /* output buffer (from device) full */
102
`define AUX_INTERRUPT_ON    32'h02_000000       /* enable controller interrupts */
103 2 mihad
 
104 12 mihad
`ifdef PS2_AUX
105
`define AUX_ENABLE      32'ha8_000000       /* enable aux */
106
`define AUX_DISABLE         32'ha7_000000       /* disable aux */
107
`define AUX_MAGIC_WRITE 32'hd4_000000       /* value to send aux device data */
108
`define AUX_SET_SAMPLE  32'hf3_000000       /* set sample rate */
109
`define AUX_SET_RES     32'he8_000000       /* set resolution */
110
`define AUX_SET_SCALE21 32'he7_000000       /* set 2:1 scaling */
111
`define AUX_INTS_OFF    32'h65_000000       /* disable controller interrupts */
112
`define AUX_INTS_ON     32'h47_000000       /* enable controller interrupts */
113
`define AUX_ENABLE_DEV  32'hf4_000000       /* enable aux device */
114
`endif
115
 
116 2 mihad
module ps2_test_bench() ;
117
 
118
parameter [31:0] MAX_SEQUENCE_LENGTH = 10 ;
119
wire kbd_clk_cable  ;
120
wire kbd_data_cable ;
121
 
122
pullup(kbd_clk_cable)  ;
123
pullup(kbd_data_cable) ;
124
 
125 12 mihad
`ifdef PS2_AUX
126
pullup(aux_clk_cable)  ;
127
pullup(aux_data_cable) ;
128
wire   wb_intb ;
129
reg    stop_mouse_tests ;
130
`endif
131
 
132 2 mihad
reg wb_clock ;
133
reg wb_reset ;
134
 
135
wire [7:0] received_char ;
136
wire       char_valid ;
137
 
138
`ifdef XILINX
139
    assign glbl.GSR = wb_reset ;
140
`endif
141
ps2_keyboard_model i_ps2_keyboard_model
142
(
143
    .kbd_clk_io  (kbd_clk_cable),
144
    .kbd_data_io (kbd_data_cable),
145
    .last_char_received_o (received_char),
146
    .char_valid_o (char_valid)
147
) ;
148
 
149 12 mihad
`ifdef PS2_AUX
150
wire [7:0] aux_received_char ;
151
ps2_keyboard_model i_ps2_mouse_model
152
(
153
    .kbd_clk_io  (aux_clk_cable),
154
    .kbd_data_io (aux_data_cable),
155
    .last_char_received_o (aux_received_char),
156
    .char_valid_o (aux_char_valid)
157
) ;
158
`endif
159
 
160 2 mihad
reg ok ;
161
reg error ;
162
 
163
integer watchdog_timer ;
164
reg     watchdog_reset ;
165
reg     watchdog_reset_previous ;
166
 
167
reg [7:0] normal_scancode_set2_mem [0:`PS2_NUM_OF_NORMAL_SCANCODES - 1] ;
168
reg [7:0] normal_scancode_set1_mem [0:`PS2_NUM_OF_NORMAL_SCANCODES - 1] ;
169
reg [7:0] extended_scancode_set2_mem [0:`PS2_NUM_OF_EXTENDED_SCANCODES - 1] ;
170
reg [7:0] extended_scancode_set1_mem [0:`PS2_NUM_OF_EXTENDED_SCANCODES - 1] ;
171
 
172
`define WB_PERIOD (1/`WB_FREQ)
173
initial
174
begin
175
 
176
    $readmemh("../../../bench/data/normal_scancodes_set2.hex", normal_scancode_set2_mem) ;
177
    $readmemh("../../../bench/data/normal_scancodes_set1.hex", normal_scancode_set1_mem) ;
178
    $readmemh("../../../bench/data/extended_scancodes_set2.hex", extended_scancode_set2_mem) ;
179
    $readmemh("../../../bench/data/extended_scancodes_set1.hex", extended_scancode_set1_mem) ;
180
 
181
    if ( ((`PS2_TIMER_5USEC_VALUE_PP * `WB_PERIOD) < 5000) || ((`PS2_TIMER_5USEC_VALUE_PP * `WB_PERIOD) > 6000) )
182
    begin
183
        $display("Warning! 5us timer max value is not defined correctly regarding to WISHBONE bus clock!") ;
184
        $stop ;
185
    end
186
 
187
    if ( ((`PS2_TIMER_60USEC_VALUE_PP * `WB_PERIOD) < 60000) || ((`PS2_TIMER_60USEC_VALUE_PP * `WB_PERIOD) > 61000) )
188
    begin
189
        $display("Warning! 60us timer max value is not defined correctly regarding to WISHBONE bus clock!") ;
190
        $stop ;
191
    end
192
 
193
    if ( (1 << `PS2_TIMER_5USEC_BITS_PP) < `PS2_TIMER_5USEC_VALUE_PP )
194
    begin
195
        $display("Warning! 5us timer max value is not defined correctly regarding to the length in bits of 5us timer!") ;
196
        $stop ;
197
    end
198
 
199
    if ( (1 << `PS2_TIMER_60USEC_BITS_PP) < `PS2_TIMER_60USEC_VALUE_PP )
200
    begin
201
        $display("Warning! 60us timer max value is not defined correctly regarding to the length in bits of 60us timer!") ;
202
        $stop ;
203
    end
204
 
205
    watchdog_timer = 32'h1000_0000 ;
206
    watchdog_reset = 0 ;
207
    watchdog_reset_previous = 0 ;
208
 
209
    wb_clock = 1'b1 ;
210
    wb_reset = 1'b1 ;
211
 
212
    #100 ;
213
 
214
    repeat ( 10 )
215
        @(posedge wb_clock) ;
216
    wb_reset <= 1'b0 ;
217
 
218
    @(posedge wb_clock) ;
219
    #1 initialize_controler ;
220
 
221
    test_scan_code_receiving ;
222
 
223 12 mihad
    `ifdef PS2_AUX
224
    fork
225
    begin
226
    `endif
227 2 mihad
    test_normal_scancodes ;
228 12 mihad
 
229 2 mihad
    test_extended_scancodes ;
230
 
231
    test_print_screen_and_pause_scancodes ;
232 12 mihad
    `ifdef PS2_AUX
233
    stop_mouse_tests = 1'b1 ;
234
    end
235
    begin
236
        stop_mouse_tests = 0 ;
237
        receive_mouse_movement ;
238
    end
239
    join
240
    `endif
241 2 mihad
 
242
    test_keyboard_inhibit ;
243
 
244
    #400 $stop ;
245
end
246
 
247
always
248
    #(`WB_PERIOD / 2) wb_clock = !wb_clock ;
249
 
250
wire wb_cyc,
251
     wb_stb,
252
     wb_we,
253
     wb_ack,
254
     wb_rty,
255
     wb_int ;
256
 
257
wire [3:0] wb_sel ;
258
 
259
wire [31:0] wb_adr, wb_dat_m_s, wb_dat_s_m ;
260 12 mihad
 
261
ps2_sim_top
262 2 mihad
i_ps2_top
263
(
264
    .wb_clk_i        (wb_clock),
265
    .wb_rst_i        (wb_reset),
266
    .wb_cyc_i        (wb_cyc),
267
    .wb_stb_i        (wb_stb),
268
    .wb_we_i         (wb_we),
269
    .wb_sel_i        (wb_sel),
270
    .wb_adr_i        (wb_adr),
271
    .wb_dat_i        (wb_dat_m_s),
272
    .wb_dat_o        (wb_dat_s_m),
273
    .wb_ack_o        (wb_ack),
274 12 mihad
 
275 2 mihad
    .wb_int_o        (wb_int),
276 12 mihad
 
277 2 mihad
    .ps2_kbd_clk_io  (kbd_clk_cable),
278
    .ps2_kbd_data_io (kbd_data_cable)
279 12 mihad
    `ifdef PS2_AUX
280
    ,
281
    .wb_intb_o(wb_intb),
282
 
283
    .ps2_aux_clk_io(aux_clk_cable),
284
    .ps2_aux_data_io(aux_data_cable)
285
    `endif
286 2 mihad
) ;
287
 
288
WB_MASTER_BEHAVIORAL i_wb_master
289
(
290
    .CLK_I    (wb_clock),
291
    .RST_I    (wb_reset),
292
    .TAG_I    (1'b0),
293
    .TAG_O    (),
294
    .ACK_I    (wb_ack),
295
    .ADR_O    (wb_adr),
296
    .CYC_O    (wb_cyc),
297
    .DAT_I    (wb_dat_s_m),
298
    .DAT_O    (wb_dat_m_s),
299
    .ERR_I    (1'b0),
300
    .RTY_I    (1'b0),
301
    .SEL_O    (wb_sel),
302
    .STB_O    (wb_stb),
303
    .WE_O     (wb_we),
304
    .CAB_O    ()
305
);
306
 
307
always@(posedge wb_clock)
308
begin
309
    if ( watchdog_timer === 0 )
310
    begin
311
        $display("Warning! Simulation watchdog timer has expired!") ;
312
        watchdog_timer = 32'hFFFF_FFFF ;
313 12 mihad
    end
314 2 mihad
    else if ( watchdog_reset !== watchdog_reset_previous )
315
        watchdog_timer = 32'hFFFF_FFFF ;
316
 
317
    watchdog_reset_previous = watchdog_reset ;
318 12 mihad
 
319 2 mihad
end
320
 
321
task initialize_controler ;
322
    reg [7:0] data ;
323
    reg status ;
324
begin:main
325
 
326 12 mihad
    // simulate keyboard driver's behaviour
327
    data   = `KBD_OBF ;
328
    status = 1 ;
329
    while ( data & `KBD_OBF )
330
    begin
331
        read_status_reg(data, status) ;
332
        if ( status !== 1 )
333
            #1 disable main ;
334 2 mihad
 
335 12 mihad
        if ( data & `KBD_OBF )
336
        begin
337
            read_data_reg(data, status) ;
338
            data = `KBD_OBF ;
339
        end
340 2 mihad
 
341 12 mihad
        if ( status !== 1 )
342
            #1 disable main ;
343
 
344
    end
345
 
346 2 mihad
    kbd_write(`KBD_CNTL_REG, `KBD_SELF_TEST, status) ;
347
 
348
    if ( status !== 1 )
349 12 mihad
        #1 disable main ;
350 2 mihad
 
351
    // command sent - wait for commands output to be ready
352
    data = 0 ;
353 12 mihad
    while( !( data & `KBD_OBF ) )
354
    begin
355 2 mihad
        read_status_reg(data, status) ;
356 12 mihad
        if ( status !== 1 )
357
            #1 disable main ;
358
    end
359 2 mihad
 
360
    read_data_reg( data, status ) ;
361
 
362
    if ( status !== 1 )
363 12 mihad
        #1 disable main ;
364 2 mihad
 
365
    if ( data !== 8'h55 )
366
    begin
367
        $display("Error! Keyboard controler should respond to self test command with hard coded value 0x55! ") ;
368
        #400 $stop ;
369 12 mihad
    end
370 2 mihad
 
371
    // perform self test 2
372
    kbd_write(`KBD_CNTL_REG, `KBD_SELF_TEST2, status) ;
373 12 mihad
 
374 2 mihad
    if ( status !== 1 )
375 12 mihad
        #1 disable main ;
376
 
377 2 mihad
    // command sent - wait for commands output to be ready
378
    data = 0 ;
379
    while( status && !( data & `KBD_OBF ) )
380
        read_status_reg(data, status) ;
381 12 mihad
 
382 2 mihad
    if ( status !== 1 )
383 12 mihad
        #1 disable main ;
384
 
385 2 mihad
    read_data_reg( data, status ) ;
386 12 mihad
 
387 2 mihad
    if ( status !== 1 )
388 12 mihad
        #1 disable main ;
389
 
390 2 mihad
    if ( data !== 8'h00 )
391
    begin
392
        $display("Error! Keyboard controler should respond to self test command 2 with hard coded value 0x00! ") ;
393
        #400 $stop ;
394
    end
395 12 mihad
 
396 2 mihad
    kbd_write(`KBD_CNTL_REG, `KBD_CNTL_ENABLE, status);
397 12 mihad
 
398 2 mihad
    if ( status !== 1 )
399 12 mihad
        #1 disable main ;
400 2 mihad
 
401
    // send reset command to keyboard
402
    kbd_write(`KBD_DATA_REG, `KBD_RESET, status) ;
403
 
404
    if ( status !== 1 )
405 12 mihad
        #1 disable main ;
406 2 mihad
 
407 12 mihad
    fork
408 2 mihad
    begin
409
        // wait for keyboard to respond with acknowledge
410
        data = 0 ;
411
        while( status && !( data & `KBD_OBF ) )
412
            read_status_reg(data, status) ;
413 12 mihad
 
414 2 mihad
        if ( status !== 1 )
415 12 mihad
            #1 disable main ;
416
 
417 2 mihad
        read_data_reg( data, status ) ;
418 12 mihad
 
419 2 mihad
        if ( status !== 1 )
420 12 mihad
            #1 disable main ;
421
 
422 2 mihad
        if ( data !== `KBD_ACK )
423
        begin
424
            $display("Error! Expected character from keyboard was 0x%h, actualy received 0x%h!", `KBD_ACK, data ) ;
425
            #400 $stop ;
426 12 mihad
        end
427 2 mihad
 
428
        // wait for keyboard to respond with BAT status
429
        data = 0 ;
430
        while( status && !( data & `KBD_OBF ) )
431
            read_status_reg(data, status) ;
432 12 mihad
 
433 2 mihad
        if ( status !== 1 )
434 12 mihad
            #1 disable main ;
435
 
436 2 mihad
        read_data_reg( data, status ) ;
437 12 mihad
 
438 2 mihad
        if ( status !== 1 )
439 12 mihad
            #1 disable main ;
440
 
441 2 mihad
        if ( data !== `KBD_POR )
442
        begin
443
            $display("Error! Expected character from keyboard was 0x%h, actualy received 0x%h!", `KBD_POR, data ) ;
444
            #400 $stop ;
445
        end
446
 
447
        // send disable command to keyboard
448
        kbd_write(`KBD_DATA_REG, `KBD_DISABLE, status) ;
449 12 mihad
 
450 2 mihad
        if ( status !== 1 )
451 12 mihad
            #1 disable main ;
452 2 mihad
 
453
        // wait for keyboard to respond with acknowledge
454
        data = 0 ;
455
        while( status && !( data & `KBD_OBF ) )
456
            read_status_reg(data, status) ;
457 12 mihad
 
458 2 mihad
        if ( status !== 1 )
459 12 mihad
            #1 disable main ;
460
 
461 2 mihad
        read_data_reg( data, status ) ;
462 12 mihad
 
463 2 mihad
        if ( status !== 1 )
464 12 mihad
            #1 disable main ;
465
 
466 2 mihad
        if ( data !== `KBD_ACK )
467
        begin
468
            $display("Error! Expected character from keyboard was 0x%h, actualy received 0x%h!", `KBD_ACK, data ) ;
469
            #400 $stop ;
470
        end
471 12 mihad
 
472 2 mihad
        kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, status);
473
        if ( status !== 1 )
474 12 mihad
            #1 disable main ;
475
 
476 2 mihad
        kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`KBD_DMS|`KBD_KCC, status);
477
        if ( status !== 1 )
478 12 mihad
            #1 disable main ;
479 2 mihad
 
480
        // send disable command to keyboard
481
        kbd_write(`KBD_DATA_REG, `KBD_ENABLE, status) ;
482 12 mihad
 
483 2 mihad
        if ( status !== 1 )
484 12 mihad
            #1 disable main ;
485
 
486 2 mihad
        // wait for keyboard to respond with acknowledge
487
        data = 0 ;
488
        while( status && !( data & `KBD_OBF ) )
489
            read_status_reg(data, status) ;
490 12 mihad
 
491 2 mihad
        if ( status !== 1 )
492 12 mihad
            #1 disable main ;
493
 
494 2 mihad
        read_data_reg( data, status ) ;
495 12 mihad
 
496 2 mihad
        if ( status !== 1 )
497 12 mihad
            #1 disable main ;
498
 
499 2 mihad
        if ( data !== `KBD_ACK )
500
        begin
501
            $display("Error! Expected character from keyboard was 0x%h, actualy received 0x%h!", `KBD_ACK, data ) ;
502
            #400 $stop ;
503 12 mihad
        end
504 2 mihad
 
505
        // now check if command byte is as expected
506
        kbd_write(`KBD_CNTL_REG, `KBD_READ_MODE, status);
507
        if ( status !== 1 )
508 12 mihad
            #1 disable main ;
509 2 mihad
 
510
        data = 0 ;
511
        while( status && !( data & `KBD_OBF ) )
512
            read_status_reg(data, status) ;
513
 
514
        if ( status !== 1 )
515 12 mihad
            #1 disable main ;
516 2 mihad
 
517
        read_data_reg(data, status) ;
518
 
519
        if ( status !== 1 )
520 12 mihad
            #1 disable main ;
521 2 mihad
 
522 7 mihad
        if ( ({data, 24'h0} & (`KBD_EKI|`KBD_SYS|`KBD_DMS|`KBD_KCC)) !== (`KBD_EKI|`KBD_SYS|`KBD_DMS|`KBD_KCC)  )
523 2 mihad
        begin
524
            $display("Error! Read command byte returned wrong value!") ;
525
            #400 $stop ;
526
        end
527
    end
528
    begin
529
        @(char_valid) ;
530 7 mihad
        if ( {received_char, 24'h0} !== `KBD_RESET )
531 2 mihad
        begin
532
            $display("Error! Keyboard received invalid character/command") ;
533 12 mihad
            #400 $stop ;
534 2 mihad
        end
535
 
536
        i_ps2_keyboard_model.kbd_send_char
537
        (
538 12 mihad
            `KBD_ACK,
539 2 mihad
            ok,
540
            error
541 12 mihad
        ) ;
542 2 mihad
 
543
        i_ps2_keyboard_model.kbd_send_char
544
        (
545
            `KBD_POR,
546
            ok,
547
            error
548
        ) ;
549
 
550
         @(char_valid) ;
551 7 mihad
        if ( {received_char,24'h0} !== `KBD_DISABLE )
552 2 mihad
        begin
553
            $display("Error! Keyboard received invalid character/command") ;
554
            #400 $stop ;
555
        end
556 12 mihad
 
557 2 mihad
        i_ps2_keyboard_model.kbd_send_char
558
        (
559
            `KBD_ACK,
560
            ok,
561
            error
562 12 mihad
        ) ;
563 2 mihad
 
564
        @(char_valid) ;
565 7 mihad
        if ( {received_char,24'h0} !== `KBD_ENABLE )
566 2 mihad
        begin
567
            $display("Error! Keyboard received invalid character/command") ;
568
            #400 $stop ;
569
        end
570 12 mihad
 
571 2 mihad
        i_ps2_keyboard_model.kbd_send_char
572
        (
573
            `KBD_ACK,
574
            ok,
575
            error
576
        ) ;
577 12 mihad
 
578 2 mihad
    end
579
    join
580
 
581
    watchdog_reset = !watchdog_reset ;
582
 
583 12 mihad
    `ifdef PS2_AUX
584
    kbd_write(`KBD_CNTL_REG, `AUX_ENABLE, status) ;
585
 
586
    if ( status !== 1 )
587
        #1 disable main ;
588
 
589
    // simulate aux driver's behaviour
590
    data   = 1 ;
591
    status = 1 ;
592
 
593
    kbd_write(`KBD_CNTL_REG, `AUX_MAGIC_WRITE, status) ;
594
    if ( status !== 1 )
595
        #1 disable main ;
596
 
597
    data = 1 ;
598
 
599
    kbd_write(`KBD_DATA_REG, `AUX_SET_SAMPLE, status) ;
600
 
601
    if ( status !== 1 )
602
        #1 disable main ;
603
 
604
    @(aux_char_valid) ;
605
    if ( {aux_received_char, 24'h000000} !== `AUX_SET_SAMPLE)
606
    begin
607
        $display("Time %t ", $time) ;
608
        $display("PS2 mouse didn't receive expected character! Expected %h, actual %h !", `AUX_SET_SAMPLE, aux_received_char ) ;
609
    end
610
 
611
    data   = 1 ;
612
    status = 1 ;
613
 
614
    kbd_write(`KBD_CNTL_REG, `AUX_MAGIC_WRITE, status) ;
615
    if ( status !== 1 )
616
        #1 disable main ;
617
 
618
    data = 1 ;
619
 
620
    kbd_write(`KBD_DATA_REG, `AUX_SET_RES, status) ;
621
 
622
    if ( status !== 1 )
623
        #1 disable main ;
624
 
625
 
626
    @(aux_char_valid) ;
627
    if ( {aux_received_char, 24'h000000} !== `AUX_SET_RES )
628
    begin
629
        $display("Time %t ", $time) ;
630
        $display("PS2 mouse didn't receive expected character! Expected %h, actual %h !", `AUX_SET_RES, aux_received_char ) ;
631
    end
632
 
633
    data   = 1 ;
634
    status = 1 ;
635
 
636
    kbd_write(`KBD_CNTL_REG, `AUX_MAGIC_WRITE, status) ;
637
    if ( status !== 1 )
638
        #1 disable main ;
639
 
640
    data = 1 ;
641
 
642
    kbd_write(`KBD_DATA_REG, {8'd100, 24'h000000}, status) ;
643
 
644
    if ( status !== 1 )
645
        #1 disable main ;
646
 
647
    @(aux_char_valid) ;
648
    if ( aux_received_char !== 8'd100 )
649
    begin
650
        $display("Time %t ", $time) ;
651
        $display("PS2 mouse didn't receive expected character! Expected %h, actual %h !", 100, aux_received_char ) ;
652
    end
653
 
654
    data   = 1 ;
655
    status = 1 ;
656
 
657
    kbd_write(`KBD_CNTL_REG, `AUX_MAGIC_WRITE, status) ;
658
    if ( status !== 1 )
659
        #1 disable main ;
660
 
661
    data = 1 ;
662
 
663
    kbd_write(`KBD_DATA_REG, {8'd3, 24'h000000}, status) ;
664
 
665
    if ( status !== 1 )
666
        #1 disable main ;
667
 
668
 
669
    @(aux_char_valid) ;
670
    if ( aux_received_char !== 8'd3 )
671
    begin
672
        $display("Time %t ", $time) ;
673
        $display("PS2 mouse didn't receive expected character! Expected %h, actual %h !", 3, aux_received_char ) ;
674
    end
675
 
676
    data   = 1 ;
677
    status = 1 ;
678
 
679
    kbd_write(`KBD_CNTL_REG, `AUX_MAGIC_WRITE, status) ;
680
    if ( status !== 1 )
681
        #1 disable main ;
682
 
683
    data = 1 ;
684
 
685
    kbd_write(`KBD_DATA_REG, `AUX_SET_SCALE21, status) ;
686
 
687
    if ( status !== 1 )
688
        #1 disable main ;
689
 
690
    @(aux_char_valid) ;
691
    if ( {aux_received_char, 24'h000000} !== `AUX_SET_SCALE21)
692
    begin
693
        $display("Time %t ", $time) ;
694
        $display("PS2 mouse didn't receive expected character! Expected %h, actual %h !", `AUX_SET_SCALE21, aux_received_char ) ;
695
    end
696
 
697
    kbd_write(`KBD_CNTL_REG, `AUX_DISABLE, status) ;
698
    if ( status !== 1 )
699
        #1 disable main ;
700
 
701
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, status) ;
702
    if ( status !== 1 )
703
        #1 disable main ;
704
 
705
    kbd_write(`KBD_DATA_REG, `AUX_INTS_OFF, status) ;
706
    if ( status !== 1 )
707
        #1 disable main ;
708
 
709
    data = 1 ;
710
 
711
    kbd_write(`KBD_CNTL_REG, `AUX_ENABLE, status) ;
712
    if ( status !== 1 )
713
        #1 disable main ;
714
 
715
    kbd_write(`KBD_CNTL_REG, `AUX_MAGIC_WRITE, status) ;
716
    if ( status !== 1 )
717
        #1 disable main ;
718
 
719
    data = 1 ;
720
 
721
    kbd_write(`KBD_DATA_REG, `AUX_ENABLE_DEV, status) ;
722
 
723
    if ( status !== 1 )
724
        #1 disable main ;
725
 
726
    @(aux_char_valid) ;
727
    if ( {aux_received_char, 24'h000000} !== `AUX_ENABLE_DEV)
728
    begin
729
        $display("Time %t ", $time) ;
730
        $display("PS2 mouse didn't receive expected character! Expected %h, actual %h !", `AUX_ENABLE_DEV, aux_received_char ) ;
731
    end
732
 
733
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, status) ;
734
    if ( status !== 1 )
735
        #1 disable main ;
736
 
737
    kbd_write(`KBD_DATA_REG, `AUX_INTS_ON, status) ;
738
    if ( status !== 1 )
739
        #1 disable main ;
740
 
741
    watchdog_reset = !watchdog_reset ;
742
    `endif
743
 
744 2 mihad
end
745 12 mihad
endtask // initialize_controler
746 2 mihad
 
747
task read_data_reg ;
748
    output [7:0] return_byte_o ;
749
    output ok_o ;
750
    reg `READ_STIM_TYPE    read_data ;
751
    reg `READ_RETURN_TYPE  read_status ;
752
    reg `WB_TRANSFER_FLAGS flags ;
753 12 mihad
    reg in_use ;
754
begin:main
755
    if ( in_use === 1 )
756
    begin
757
        $display("Task read_data_reg re-entered! Time %t", $time) ;
758
        #1 disable main ;
759
    end
760
    else
761
        in_use = 1 ;
762
 
763 2 mihad
    ok_o = 1 ;
764
    flags`WB_TRANSFER_SIZE     = 1 ;
765
    flags`WB_TRANSFER_AUTO_RTY = 0 ;
766
    flags`WB_TRANSFER_CAB      = 0 ;
767
    flags`INIT_WAITS           = 0 ;
768
    flags`SUBSEQ_WAITS         = 0 ;
769
 
770
    read_data`READ_ADDRESS = `KBD_DATA_REG ;
771 6 mihad
    read_data`READ_SEL     = 4'h8 ;
772 2 mihad
 
773
    read_status = 0 ;
774
 
775
    i_wb_master.wb_single_read( read_data, flags, read_status ) ;
776
 
777
    if ( read_status`CYC_ACK !== 1'b1 )
778
    begin
779
        $display("Error! Keyboard controler didn't acknowledge single read access!") ;
780
        #400 $stop ;
781
        ok_o = 0 ;
782
    end
783
    else
784
        return_byte_o = read_status`READ_DATA ;
785
 
786 12 mihad
    in_use = 0 ;
787
 
788
end
789 2 mihad
endtask //read_data_reg
790
 
791
task read_status_reg ;
792
    output [7:0] return_byte_o ;
793
    output ok_o ;
794
    reg `READ_STIM_TYPE    read_data ;
795
    reg `READ_RETURN_TYPE  read_status ;
796
    reg `WB_TRANSFER_FLAGS flags ;
797 12 mihad
    reg in_use ;
798
begin:main
799
    if ( in_use === 1 )
800
    begin
801
        $display("Task read_status_reg re-entered! Time %t !", $time) ;
802
        #1 disable main ;
803
    end
804
    else
805
        in_use = 1 ;
806
 
807 2 mihad
    ok_o = 1 ;
808
    flags`WB_TRANSFER_SIZE     = 1 ;
809
    flags`WB_TRANSFER_AUTO_RTY = 0 ;
810
    flags`WB_TRANSFER_CAB      = 0 ;
811
    flags`INIT_WAITS           = 0 ;
812
    flags`SUBSEQ_WAITS         = 0 ;
813 12 mihad
 
814 2 mihad
    read_data`READ_ADDRESS = `KBD_STATUS_REG ;
815 6 mihad
    read_data`READ_SEL     = 4'h8 ;
816 12 mihad
 
817 2 mihad
    read_status = 0 ;
818 12 mihad
 
819 2 mihad
    i_wb_master.wb_single_read( read_data, flags, read_status ) ;
820 12 mihad
 
821 2 mihad
    if ( read_status`CYC_ACK !== 1'b1 )
822
    begin
823
        $display("Error! Keyboard controler didn't acknowledge single read access!") ;
824
        #400 $stop ;
825
        ok_o = 0 ;
826
    end
827
    else
828
        return_byte_o = read_status`READ_DATA ;
829
 
830 12 mihad
    in_use = 0 ;
831 2 mihad
end
832
endtask // read_status_reg
833
 
834
task kbd_write ;
835
    input [31:0] address_i ;
836
    input [31:0] data_i ;
837
    output ok_o ;
838
 
839
    reg `WRITE_STIM_TYPE   write_data ;
840
    reg `WRITE_RETURN_TYPE write_status ;
841
    reg `WB_TRANSFER_FLAGS flags ;
842
    reg [7:0] kbd_status ;
843
begin:main
844
    ok_o = 1 ;
845
    flags`WB_TRANSFER_SIZE     = 1 ;
846
    flags`WB_TRANSFER_AUTO_RTY = 0 ;
847
    flags`WB_TRANSFER_CAB      = 0 ;
848
    flags`INIT_WAITS           = 0 ;
849
    flags`SUBSEQ_WAITS         = 0 ;
850
 
851
    write_data`WRITE_ADDRESS = address_i ;
852 12 mihad
    write_data`WRITE_DATA    = data_i ;
853 6 mihad
    write_data`WRITE_SEL     = 4'h8 ;
854 2 mihad
 
855
    read_status_reg(kbd_status, ok_o) ;
856
 
857
    while( ok_o && ( kbd_status & `KBD_IBF ))
858
    begin
859
        read_status_reg(kbd_status, ok_o) ;
860
    end
861
 
862
    if ( ok_o !== 1 )
863 12 mihad
        #1 disable main ;
864 2 mihad
 
865
    i_wb_master.wb_single_write( write_data, flags, write_status ) ;
866
 
867
    if ( write_status`CYC_ACK !== 1 )
868
    begin
869
        $display("Error! Keyboard controller didn't acknowledge single write access") ;
870
        #400 $stop ;
871
        ok_o = 0 ;
872
    end
873 12 mihad
end
874 2 mihad
endtask // kbd_write
875
 
876
task test_scan_code_receiving ;
877
    reg ok_keyboard ;
878
    reg ok_controler ;
879
    reg ok ;
880
    reg [7:0] data ;
881
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] keyboard_sequence ;
882
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] controler_sequence ;
883
begin:main
884
    // prepare character sequence to send from keyboard to controler
885
    // L SHIFT make
886
    keyboard_sequence[7:0]   = 8'h12 ;
887
    // A make
888
    keyboard_sequence[15:8]  = 8'h1C ;
889
    // A break
890
    keyboard_sequence[23:16] = 8'hF0 ;
891
    keyboard_sequence[31:24] = 8'h1C ;
892
    // L SHIFT break
893
    keyboard_sequence[39:32] = 8'hF0 ;
894
    keyboard_sequence[47:40] = 8'h12 ;
895
 
896
    // prepare character sequence as it is received in scan code set 1 through the controler
897
    // L SHIFT make
898
    controler_sequence[7:0]   = 8'h2A ;
899
    // A make
900
    controler_sequence[15:8]  = 8'h1E ;
901
    // A break
902
    controler_sequence[23:16] = 8'h9E ;
903
    // L SHIFT break
904
    controler_sequence[31:24] = 8'hAA ;
905
 
906
    fork
907
    begin
908
        send_sequence( keyboard_sequence, 6, ok_keyboard ) ;
909
        if ( ok_keyboard !== 1 )
910 12 mihad
            #1 disable main ;
911 2 mihad
    end
912
    begin
913
        receive_sequence( controler_sequence, 4, ok_controler ) ;
914
 
915
        if ( ok_controler !== 1 )
916 12 mihad
            #1 disable main ;
917 2 mihad
    end
918
    join
919
 
920
    // test same thing with translation disabled!
921
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, ok);
922
    if ( ok !== 1 )
923 12 mihad
        #1 disable main ;
924
 
925
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON, ok);
926 2 mihad
    if ( ok !== 1 )
927 12 mihad
        #1 disable main ;
928 2 mihad
 
929
    // since translation is disabled, controler sequence is the same as keyboard sequence
930
    controler_sequence = keyboard_sequence ;
931
 
932
    fork
933
    begin
934
 
935
        send_sequence( keyboard_sequence, 6, ok_keyboard ) ;
936
        if ( ok_keyboard !== 1 )
937 12 mihad
            #1 disable main ;
938
 
939 2 mihad
    end
940
    begin
941
        receive_sequence( controler_sequence, 6, ok_controler ) ;
942
        if ( ok_controler !== 1 )
943 12 mihad
            #1 disable main ;
944 2 mihad
    end
945
    join
946
 
947
    // turn translation on again
948
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, ok);
949
    if ( ok !== 1 )
950 12 mihad
        #1 disable main ;
951
 
952
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON|`KBD_KCC, ok);
953 2 mihad
    if ( ok !== 1 )
954 12 mihad
        #1 disable main ;
955 2 mihad
 
956
    // test extended character receiving - rctrl + s combination
957
    // prepare sequence to send from keyboard to controler
958
    // R CTRL make
959
    keyboard_sequence[7:0]   = 8'hE0 ;
960
    keyboard_sequence[15:8]  = 8'h14 ;
961
    // S make
962
    keyboard_sequence[23:16] = 8'h1B ;
963
    // S break
964
    keyboard_sequence[31:24] = 8'hF0 ;
965
    keyboard_sequence[39:32] = 8'h1B ;
966
    // R CTRL break
967
    keyboard_sequence[47:40] = 8'hE0 ;
968
    keyboard_sequence[55:48] = 8'hF0 ;
969
    keyboard_sequence[63:56] = 8'h14 ;
970
 
971
    // prepare sequence that should be received from the controler
972
    // R CTRL make
973
    controler_sequence[7:0]   = 8'hE0 ;
974
    controler_sequence[15:8]  = 8'h1D ;
975
    // S make
976
    controler_sequence[23:16] = 8'h1F ;
977
    // S break
978
    controler_sequence[31:24] = 8'h9F ;
979
    // R CTRL break
980
    controler_sequence[39:32] = 8'hE0 ;
981
    controler_sequence[47:40] = 8'h9D ;
982
 
983
    fork
984
    begin
985
        send_sequence( keyboard_sequence, 8, ok_keyboard ) ;
986
        if ( ok_keyboard !== 1 )
987 12 mihad
            #1 disable main ;
988 2 mihad
    end
989
    begin
990 12 mihad
 
991 2 mihad
        receive_sequence( controler_sequence, 6, ok_controler ) ;
992 12 mihad
 
993 2 mihad
        if ( ok_controler !== 1 )
994 12 mihad
            #1 disable main ;
995 2 mihad
    end
996
    join
997
 
998
     // test same thing with translation disabled!
999
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, ok);
1000
    if ( ok !== 1 )
1001 12 mihad
        #1 disable main ;
1002
 
1003
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON, ok);
1004 2 mihad
    if ( ok !== 1 )
1005 12 mihad
        #1 disable main ;
1006
 
1007 2 mihad
    // since translation is disabled, controler sequence is the same as keyboard sequence
1008 12 mihad
    controler_sequence = keyboard_sequence ;
1009 2 mihad
 
1010
    fork
1011
    begin
1012
        send_sequence( keyboard_sequence, 8, ok_keyboard ) ;
1013
        if ( ok_keyboard !== 1 )
1014 12 mihad
            #1 disable main ;
1015 2 mihad
    end
1016
    begin
1017 12 mihad
 
1018 2 mihad
        receive_sequence( controler_sequence, 8, ok_controler ) ;
1019 12 mihad
 
1020 2 mihad
        if ( ok_controler !== 1 )
1021 12 mihad
            #1 disable main ;
1022 2 mihad
    end
1023
    join
1024
 
1025
    watchdog_reset = !watchdog_reset ;
1026
end
1027
endtask // test_scan_code_receiving
1028
 
1029
task test_normal_scancodes ;
1030
    reg ok ;
1031
    reg ok_keyboard ;
1032
    reg ok_controler ;
1033
    integer i ;
1034
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] keyboard_sequence ;
1035 12 mihad
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] controler_sequence ;
1036 2 mihad
begin:main
1037
    // turn translation on
1038
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, ok);
1039
    if ( ok !== 1 )
1040 12 mihad
        #1 disable main ;
1041
 
1042
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON|`KBD_KCC, ok);
1043 2 mihad
    if ( ok !== 1 )
1044 12 mihad
        #1 disable main ;
1045 2 mihad
 
1046
    for ( i = 0 ; i < `PS2_NUM_OF_NORMAL_SCANCODES ; i = i + 1 )
1047
    begin
1048
        keyboard_sequence[7:0]   = normal_scancode_set2_mem[i] ;
1049
        keyboard_sequence[15:8]  = 8'hF0 ;
1050
        keyboard_sequence[23:16] = normal_scancode_set2_mem[i] ;
1051
 
1052
        controler_sequence[7:0]  = normal_scancode_set1_mem[i] ;
1053
        controler_sequence[15:8] = normal_scancode_set1_mem[i] | 8'h80 ;
1054
        fork
1055
        begin
1056
            send_sequence( keyboard_sequence, 3, ok_keyboard ) ;
1057
            if ( ok_keyboard !== 1 )
1058 12 mihad
                #1 disable main ;
1059 2 mihad
        end
1060
        begin
1061
            receive_sequence( controler_sequence, 2, ok_controler ) ;
1062
            if ( ok_controler !== 1 )
1063 12 mihad
                #1 disable main ;
1064 2 mihad
        end
1065
        join
1066
    end
1067
 
1068
    watchdog_reset = !watchdog_reset ;
1069 12 mihad
 
1070 2 mihad
end
1071
endtask // test_normal_scancodes
1072
 
1073
task test_extended_scancodes ;
1074
    reg ok ;
1075
    reg ok_keyboard ;
1076
    reg ok_controler ;
1077
    integer i ;
1078
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] keyboard_sequence ;
1079
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] controler_sequence ;
1080
begin:main
1081
    // turn translation on
1082
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, ok);
1083
    if ( ok !== 1 )
1084 12 mihad
        #1 disable main ;
1085
 
1086
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON|`KBD_KCC, ok);
1087 2 mihad
    if ( ok !== 1 )
1088 12 mihad
        #1 disable main ;
1089
 
1090 2 mihad
    for ( i = 0 ; i < `PS2_NUM_OF_EXTENDED_SCANCODES ; i = i + 1 )
1091
    begin
1092
        keyboard_sequence[7:0]   = 8'hE0 ;
1093
        keyboard_sequence[15:8]  = extended_scancode_set2_mem[i] ;
1094
        keyboard_sequence[23:16] = 8'hE0 ;
1095
        keyboard_sequence[31:24] = 8'hF0 ;
1096
        keyboard_sequence[39:32] = extended_scancode_set2_mem[i] ;
1097 12 mihad
 
1098 2 mihad
        controler_sequence[7:0]   = 8'hE0 ;
1099
        controler_sequence[15:8]  = extended_scancode_set1_mem[i] ;
1100
        controler_sequence[23:16] = 8'hE0 ;
1101
        controler_sequence[31:24] = extended_scancode_set1_mem[i] | 8'h80 ;
1102
        fork
1103
        begin
1104
            send_sequence( keyboard_sequence, 5, ok_keyboard ) ;
1105
            if ( ok_keyboard !== 1 )
1106 12 mihad
                #1 disable main ;
1107 2 mihad
        end
1108
        begin
1109
            receive_sequence( controler_sequence, 4, ok_controler ) ;
1110
            if ( ok_controler !== 1 )
1111 12 mihad
                #1 disable main ;
1112 2 mihad
        end
1113
        join
1114
    end
1115 12 mihad
 
1116 2 mihad
    watchdog_reset = !watchdog_reset ;
1117 12 mihad
 
1118 2 mihad
end
1119
endtask // test_extended_scancodes
1120
 
1121
task return_scan_code_on_irq ;
1122
    output [7:0] scan_code_o ;
1123
    output       ok_o ;
1124
    reg    [7:0] temp_data ;
1125
begin:main
1126
    wait ( wb_int === 1 ) ;
1127
    read_status_reg( temp_data, ok_o ) ;
1128 12 mihad
 
1129 2 mihad
    if ( ok_o !== 1'b1 )
1130 12 mihad
        #1 disable main ;
1131
 
1132 2 mihad
    if ( !( temp_data & `KBD_OBF ) )
1133
    begin
1134
        $display("Error! Interrupt received from keyboard controler when OBF status not set!") ;
1135
        #400 $stop ;
1136
    end
1137 12 mihad
 
1138
    if ( temp_data & `AUX_OBUF_FULL )
1139
    begin
1140
        $display("Error! Interrupt received from keyboard controler when AUX_OBUF_FULL status was set!") ;
1141
        #400 $stop ;
1142
    end
1143
 
1144 2 mihad
    read_data_reg( temp_data, ok_o ) ;
1145 12 mihad
 
1146 2 mihad
    if ( ok_o !== 1'b1 )
1147 12 mihad
        #1 disable main ;
1148 2 mihad
 
1149
    scan_code_o = temp_data ;
1150
end
1151
endtask // return_scan_code_on_irq
1152
 
1153
task send_sequence ;
1154
    input [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] sequence_i ;
1155
    input [31:0] num_of_chars_i ;
1156
    output ok_o ;
1157
    reg [7:0] current_char ;
1158
    integer i ;
1159
    reg ok ;
1160
    reg error ;
1161
begin:main
1162
 
1163
    error = 0 ;
1164
    ok_o  = 1 ;
1165
    ok    = 0 ;
1166
 
1167 12 mihad
    for( i = 0 ; i < num_of_chars_i ; i = i + 1 )
1168 2 mihad
    begin
1169
        current_char = sequence_i[7:0] ;
1170 12 mihad
 
1171 2 mihad
        sequence_i = sequence_i >> 8 ;
1172
        ok = 0 ;
1173
        error = 0 ;
1174
        while ( (ok !== 1) && (error === 0) )
1175
        begin
1176
            i_ps2_keyboard_model.kbd_send_char
1177
            (
1178
                current_char,
1179
                ok,
1180
                error
1181 12 mihad
            ) ;
1182 2 mihad
        end
1183
 
1184
        if ( error )
1185
        begin
1186
            $display("Time %t", $time) ;
1187
            $display("Keyboard model signaled an error!") ;
1188
            ok_o = 0 ;
1189 12 mihad
            #1 disable main ;
1190 2 mihad
        end
1191
    end
1192
end
1193
endtask // send_sequence
1194
 
1195
task receive_sequence ;
1196
    input [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] sequence_i ;
1197
    input [31:0] num_of_chars_i ;
1198
    output ok_o ;
1199
    reg [7:0] current_char ;
1200
    reg [7:0] data ;
1201
    integer i ;
1202
begin:main
1203 12 mihad
 
1204 2 mihad
    ok_o  = 1 ;
1205 12 mihad
 
1206 2 mihad
    for( i = 0 ; i < num_of_chars_i ; i = i + 1 )
1207
    begin
1208
        current_char = sequence_i[7:0] ;
1209 12 mihad
 
1210 2 mihad
        sequence_i = sequence_i >> 8 ;
1211
 
1212
        return_scan_code_on_irq( data, ok_o ) ;
1213
 
1214
        if ( ok_o !== 1 )
1215 12 mihad
            #1 disable main ;
1216 2 mihad
 
1217
        if ( data !== current_char )
1218
        begin
1219
            $display("Time %t", $time) ;
1220
            $display("Error! Character received was wrong!") ;
1221
            $display("Expected character: %h, received %h ", current_char, data ) ;
1222
        end
1223
    end
1224
end
1225
endtask // receive_seqence
1226
 
1227
task test_keyboard_inhibit ;
1228
    reg ok_controler ;
1229
    reg ok_keyboard ;
1230
    reg error ;
1231
    reg [7:0] data ;
1232
begin:main
1233
    // first test, if keyboard stays inhibited after character is received, but not read from the controler
1234
    i_ps2_keyboard_model.kbd_send_char
1235
    (
1236
        8'hE0,
1237
        ok_keyboard,
1238
        error
1239
    ) ;
1240
 
1241
    if ( error )
1242
    begin
1243
        $display("Error! Keyboard signaled an error while sending character!") ;
1244 12 mihad
        #1 disable main ;
1245 2 mihad
    end
1246
 
1247
    if ( !ok_keyboard )
1248
    begin
1249
        $display("Something is wrong! Keyboard wasn't able to send a character!") ;
1250 12 mihad
        #1 disable main ;
1251 2 mihad
    end
1252
 
1253
    // wait 5 us to see, if keyboard is inhibited
1254
    #5000 ;
1255
 
1256
    // now check, if clock line is low!
1257
    if ( kbd_clk_cable !== 0 )
1258
    begin
1259
        $display("Error! Keyboard wasn't inhibited when output buffer was filled!") ;
1260 12 mihad
        #1 disable main ;
1261 2 mihad
    end
1262
 
1263
    // now read the character from input buffer and check if clock was released
1264
    return_scan_code_on_irq( data, ok_controler ) ;
1265
    if ( ok_controler !== 1'b1 )
1266 12 mihad
        #1 disable main ;
1267 2 mihad
 
1268
    if ( data !== 8'hE0 )
1269
    begin
1270
        $display("Time %t", $time) ;
1271
        $display("Error! Character read from controler not as expected!") ;
1272
    end
1273
 
1274
    fork
1275
    begin
1276
        repeat(10)
1277
            @(posedge wb_clock) ;
1278
 
1279
        if ( kbd_clk_cable !== 1 )
1280
        begin
1281
            $display("Error! Keyboard wasn't released from inhibited state when output buffer was read!") ;
1282 12 mihad
            #1 disable main ;
1283 2 mihad
        end
1284
    end
1285
    begin
1286
        i_ps2_keyboard_model.kbd_send_char
1287
        (
1288
            8'h1C,
1289
            ok_keyboard,
1290
            error
1291
        ) ;
1292
        if ( !ok_keyboard )
1293
        begin
1294
            $display("Something is wrong! Keyboard wasn't able to send a character!") ;
1295 12 mihad
            #1 disable main ;
1296 2 mihad
        end
1297
    end
1298
    begin
1299
        return_scan_code_on_irq( data, ok_controler ) ;
1300
        if ( ok_controler !== 1'b1 )
1301 12 mihad
            #1 disable main ;
1302
 
1303 2 mihad
        if ( data !== 8'h1E )
1304
        begin
1305
            $display("Time %t", $time) ;
1306
            $display("Error! Character read from controler not as expected!") ;
1307
        end
1308
    end
1309
    join
1310
 
1311
    // disable keyboard controler
1312
    kbd_write( `KBD_CNTL_REG, `KBD_WRITE_MODE, ok_controler ) ;
1313
    if ( ok_controler !== 1 )
1314 12 mihad
        #1 disable main ;
1315 2 mihad
 
1316 12 mihad
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON|`KBD_KCC | `KBD_DISABLE_COMMAND, ok_controler);
1317 2 mihad
 
1318
    if ( ok_controler !== 1 )
1319 12 mihad
        #1 disable main ;
1320 2 mihad
 
1321
    repeat( 5 )
1322
        @(posedge wb_clock) ;
1323
 
1324 12 mihad
    // now check, if clock line is high!
1325
    if ( kbd_clk_cable !== 1 )
1326 2 mihad
    begin
1327 12 mihad
        $display("Error! Keyboard is not supposed to be inhibited when keyboard controler is disabled!") ;
1328
        #1 disable main ;
1329 2 mihad
    end
1330
 
1331
    // send character and enable keyboard controler at the same time
1332
    fork
1333
    begin
1334
        i_ps2_keyboard_model.kbd_send_char
1335
        (
1336
            8'hE0,
1337
            ok_keyboard,
1338
            error
1339
        ) ;
1340 12 mihad
 
1341 2 mihad
        if ( !ok_keyboard )
1342
        begin
1343
            $display("Something is wrong! Keyboard wasn't able to send a character!") ;
1344 12 mihad
            #1 disable main ;
1345
        end
1346 2 mihad
    end
1347
    begin
1348
        // enable keyboard controler
1349
        kbd_write( `KBD_CNTL_REG, `KBD_WRITE_MODE, ok_controler ) ;
1350
        if ( ok_controler !== 1 )
1351 12 mihad
            #1 disable main ;
1352
 
1353
        kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON|`KBD_KCC, ok_controler);
1354 2 mihad
        if ( ok_controler !== 1 )
1355 12 mihad
            #1 disable main ;
1356 2 mihad
    end
1357
    begin
1358
        return_scan_code_on_irq( data, ok_controler ) ;
1359
        if ( ok_controler !== 1'b1 )
1360 12 mihad
            #1 disable main ;
1361
 
1362 2 mihad
        if ( data !== 8'hE0 )
1363
        begin
1364
            $display("Time %t", $time) ;
1365
            $display("Error! Character read from controler not as expected!") ;
1366
        end
1367
    end
1368
    join
1369 5 mihad
 
1370
    // do D2 command, that copies parameter in input buffer to output buffer
1371 7 mihad
    kbd_write( `KBD_CNTL_REG, 32'hD2_00_00_00, ok_controler ) ;
1372 5 mihad
    if ( ok_controler !== 1 )
1373 12 mihad
        #1 disable main ;
1374 5 mihad
 
1375
    kbd_write(`KBD_DATA_REG, 32'h5555_5555, ok_controler) ;
1376
 
1377
    if ( ok_controler !== 1 )
1378 12 mihad
        #1 disable main ;
1379 5 mihad
 
1380
    return_scan_code_on_irq( data, ok_controler ) ;
1381
    if ( ok_controler !== 1 )
1382 12 mihad
        #1 disable main ;
1383 5 mihad
 
1384 12 mihad
    if ( data !== 8'h55 )
1385 5 mihad
    begin
1386
        $display("Error! D2 command doesn't work properly") ;
1387
    end
1388
 
1389 2 mihad
end
1390
endtask // test_keyboard_inhibit
1391
 
1392
task test_print_screen_and_pause_scancodes ;
1393
    reg ok ;
1394
    reg ok_keyboard ;
1395
    reg ok_controler ;
1396
    integer i ;
1397
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] keyboard_sequence ;
1398
    reg [(MAX_SEQUENCE_LENGTH*8 - 1) : 0] controler_sequence ;
1399
begin:main
1400
    // turn translation on
1401
    kbd_write(`KBD_CNTL_REG, `KBD_WRITE_MODE, ok);
1402
    if ( ok !== 1 )
1403 12 mihad
        #1 disable main ;
1404
 
1405
    kbd_write(`KBD_DATA_REG, `KBD_EKI|`KBD_SYS|`AUX_INTERRUPT_ON|`KBD_KCC, ok);
1406 2 mihad
    if ( ok !== 1 )
1407 12 mihad
        #1 disable main ;
1408 2 mihad
 
1409
    // prepare character sequence to send from keyboard to controler - pause
1410
    keyboard_sequence[7:0]   = 8'hE1 ;
1411
    keyboard_sequence[15:8]  = 8'h14 ;
1412
    keyboard_sequence[23:16] = 8'h77 ;
1413
    keyboard_sequence[31:24] = 8'hE1 ;
1414
    keyboard_sequence[39:32] = 8'hF0 ;
1415
    keyboard_sequence[47:40] = 8'h14 ;
1416
    keyboard_sequence[55:48] = 8'hF0 ;
1417
    keyboard_sequence[63:56] = 8'h77 ;
1418 12 mihad
 
1419 2 mihad
    // prepare character sequence as it is received in scan code set 1 through the controler
1420
    controler_sequence[7:0]   = 8'hE1 ;
1421
    controler_sequence[15:8]  = 8'h1D ;
1422
    controler_sequence[23:16] = 8'h45 ;
1423
    controler_sequence[31:24] = 8'hE1 ;
1424
    controler_sequence[39:32] = 8'h9D ;
1425
    controler_sequence[47:40] = 8'hC5 ;
1426
 
1427
    fork
1428
    begin
1429
        send_sequence( keyboard_sequence, 8, ok_keyboard ) ;
1430
        if ( ok_keyboard !== 1 )
1431 12 mihad
            #1 disable main ;
1432 2 mihad
    end
1433
    begin
1434
        receive_sequence( controler_sequence, 6, ok_controler ) ;
1435
        if ( ok_controler !== 1 )
1436 12 mihad
            #1 disable main ;
1437 2 mihad
    end
1438
    join
1439
 
1440
    // prepare character sequence to send from keyboard to controler - make print screen
1441
    keyboard_sequence[7:0]   = 8'hE0 ;
1442
    keyboard_sequence[15:8]  = 8'h12 ;
1443
    keyboard_sequence[23:16] = 8'hE0 ;
1444
    keyboard_sequence[31:24] = 8'h7C ;
1445 12 mihad
 
1446 2 mihad
    // prepare character sequence as it is received in scan code set 1 through the controler
1447
    controler_sequence[7:0]   = 8'hE0 ;
1448
    controler_sequence[15:8]  = 8'h2A ;
1449
    controler_sequence[23:16] = 8'hE0 ;
1450
    controler_sequence[31:24] = 8'h37 ;
1451
 
1452
    fork
1453
    begin
1454
        send_sequence( keyboard_sequence, 4, ok_keyboard ) ;
1455
        if ( ok_keyboard !== 1 )
1456 12 mihad
            #1 disable main ;
1457 2 mihad
    end
1458
    begin
1459
        receive_sequence( controler_sequence, 4, ok_controler ) ;
1460
        if ( ok_controler !== 1 )
1461 12 mihad
            #1 disable main ;
1462 2 mihad
    end
1463
    join
1464
 
1465
    // prepare character sequence to send from keyboard to controler - break print screen
1466
    keyboard_sequence[7:0]   = 8'hE0 ;
1467
    keyboard_sequence[15:8]  = 8'hF0 ;
1468
    keyboard_sequence[23:16] = 8'h7C ;
1469
    keyboard_sequence[31:24] = 8'hE0 ;
1470
    keyboard_sequence[39:32] = 8'hF0 ;
1471
    keyboard_sequence[47:40] = 8'h12 ;
1472 12 mihad
 
1473 2 mihad
    // prepare character sequence as it is received in scan code set 1 through the controler
1474
    controler_sequence[7:0]   = 8'hE0 ;
1475
    controler_sequence[15:8]  = 8'hB7 ;
1476
    controler_sequence[23:16] = 8'hE0 ;
1477
    controler_sequence[31:24] = 8'hAA ;
1478
 
1479
    fork
1480
    begin
1481
        send_sequence( keyboard_sequence, 6, ok_keyboard ) ;
1482
        if ( ok_keyboard !== 1 )
1483 12 mihad
            #1 disable main ;
1484 2 mihad
    end
1485
    begin
1486
        receive_sequence( controler_sequence, 4, ok_controler ) ;
1487
        if ( ok_controler !== 1 )
1488 12 mihad
            #1 disable main ;
1489 2 mihad
    end
1490
    join
1491
end
1492
endtask // test_print_screen_and_pause_scancodes
1493
 
1494 12 mihad
`ifdef PS2_AUX
1495
task receive_mouse_movement;
1496
    reg [7:0] mouse_data_received ;
1497
    reg ok_mouse ;
1498
    reg ok_wb ;
1499
    reg error ;
1500
    integer num_of_mouse_data_sent ;
1501
begin:main
1502
    error    = 0 ;
1503
    num_of_mouse_data_sent     = 0 ;
1504
    while ( !stop_mouse_tests )
1505
    begin
1506
        fork
1507
        begin
1508
            ok_mouse = 0 ;
1509
            while ( !ok_mouse && !error )
1510
            begin
1511
                i_ps2_mouse_model.kbd_send_char
1512
                (
1513
                    num_of_mouse_data_sent[7:0],
1514
                    ok_mouse,
1515
                    error
1516
                ) ;
1517
            end
1518
            if ( error )
1519
            begin
1520
                $display("Mouse model signaled an error while transmiting data! Time %t", $time) ;
1521
                #1 disable main ;
1522
            end
1523
            else
1524
                num_of_mouse_data_sent = num_of_mouse_data_sent + 1 ;
1525
 
1526
        end
1527
        begin
1528
            return_mouse_data_on_irq( mouse_data_received, ok_wb ) ;
1529
            if ( !ok_wb )
1530
                #1 disable main ;
1531
 
1532
            if ( mouse_data_received !== num_of_mouse_data_sent[7:0] )
1533
            begin
1534
                $display("Time %t", $time) ;
1535
                $display("Data received from mouse has unexpected value! Expected %h, actual %h", num_of_mouse_data_sent[7:0], mouse_data_received) ;
1536
            end
1537
        end
1538
        join
1539
    end
1540
 
1541
    $display("Number of chars received from mouse %d", num_of_mouse_data_sent) ;
1542
end
1543
endtask //receive_mouse_movement
1544
 
1545
task return_mouse_data_on_irq ;
1546
    output [7:0] mouse_data_o ;
1547
    output       ok_o ;
1548
    reg    [7:0] temp_data ;
1549
begin:main
1550
    wait ( wb_intb === 1 ) ;
1551
 
1552
    wait ( ps2_test_bench.read_status_reg.in_use !== 1'b1 );
1553
 
1554
    read_status_reg( temp_data, ok_o ) ;
1555
 
1556
    if ( ok_o !== 1'b1 )
1557
        #1 disable main ;
1558
 
1559
    if ( !( temp_data & `AUX_OBUF_FULL ) || !(temp_data & `KBD_OBF))
1560
    begin
1561
        $display("Error! Interrupt b received from controler when AUX_OBF status or KBD_OBF statuses not set!") ;
1562
        #400 $stop ;
1563
    end
1564
 
1565
    wait ( ps2_test_bench.read_data_reg.in_use !== 1'b1 );
1566
 
1567
    read_data_reg( temp_data, ok_o ) ;
1568
 
1569
    if ( ok_o !== 1'b1 )
1570
        #1 disable main ;
1571
 
1572
    mouse_data_o = temp_data ;
1573
end
1574
endtask // return_scan_code_on_irq
1575
`endif
1576
 
1577 2 mihad
endmodule // ps2_test_bench

powered by: WebSVN 2.1.0

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