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 15

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