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 24

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