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

Subversion Repositories ps2_host_controller

[/] [ps2_host_controller/] [trunk/] [hdl/] [ps2_host_testbench.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 tesla
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  ps2_host_testbench.v                                        ////
4
////                                                              ////
5
////  Description                                                 ////
6
////  Testbench to verify core correctness                        ////
7
////                                                              ////
8
////  Author:                                                     ////
9
////      - Piotr Foltyn, piotr.foltyn@gmail.com                  ////
10
////                                                              ////
11
//////////////////////////////////////////////////////////////////////
12
////                                                              ////
13
//// Copyright (C) 2011 Author                                    ////
14
////                                                              ////
15
//// This source file may be used and distributed without         ////
16
//// restriction provided that this copyright statement is not    ////
17
//// removed from the file and that any derivative work contains  ////
18
//// the original copyright notice and the associated disclaimer. ////
19
////                                                              ////
20
//// This source file is free software; you can redistribute it   ////
21
//// and/or modify it under the terms of the GNU Lesser General   ////
22
//// Public License as published by the Free Software Foundation; ////
23
//// either version 2.1 of the License, or (at your option) any   ////
24
//// later version.                                               ////
25
////                                                              ////
26
//// This source is distributed in the hope that it will be       ////
27
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
28
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
29
//// PURPOSE.  See the GNU Lesser General Public License for more ////
30
//// details.                                                     ////
31
////                                                              ////
32
//// You should have received a copy of the GNU Lesser General    ////
33
//// Public License along with this source; if not, download it   ////
34
//// from http://www.opencores.org/lgpl.shtml                     ////
35
////                                                              ////
36
//////////////////////////////////////////////////////////////////////
37
 
38
// synopsys translate_off
39
`include "timescale.v"
40
// synopsys translate_on
41
`include "ps2_host.v"
42
 
43
`define SYS_PERIOD 1
44
`define PS2_PERIOD (`SYS_PERIOD*4)
45
 
46
module ps2_host_testbench;
47
 
48
reg sys_clk;
49
reg sys_rst;
50
 
51
reg ps2_clk_r;
52
reg ps2_data_r;
53
tri1 ps2_clk  = (ps2_clk_r)  ? 1'bz : 1'b0;
54
tri1 ps2_data = (ps2_data_r) ? 1'bz : 1'b0;
55
 
56
reg [7:0] tx_data;
57
reg send_req;
58
wire busy;
59
 
60
wire [7:0] rx_data;
61
wire ready;
62
wire error;
63
 
64
// System clock
65
always #`SYS_PERIOD sys_clk = ~sys_clk;
66
 
67
// System reset
68
initial begin
69
  sys_clk = 0;
70
  ps2_clk_r = 1;
71
  ps2_data_r = 1;
72
  send_req = 0;
73
 
74
  sys_rst = 1;
75
  sys_rst = #(`SYS_PERIOD*2) 0;
76
end
77
 
78
// Receiver test
79
task receiver_test;
80
  input start_bit;
81
  input [7:0] bits;
82
  input parity_bit;
83
  input stop_bit;
84
  input expect_error;
85
  reg [10:0] frame;
86
  integer bit_cnt;
87
begin
88
  frame = {start_bit,bits[0],bits[1],bits[2],bits[3],
89
                     bits[4],bits[5],bits[6],bits[7],parity_bit,stop_bit};
90
  for (bit_cnt = 0; bit_cnt < 11; bit_cnt = bit_cnt + 1) begin
91
    ps2_data_r = frame[10 - bit_cnt];
92
    ps2_clk_r = #`PS2_PERIOD 0;
93
    ps2_clk_r = #`PS2_PERIOD 1;
94
  end
95
  if ((bits != rx_data) | (error != expect_error)) begin
96
    $display("Failed: Frame:0x%x Rx:0x%x Err:%b", frame, rx_data, error);
97
  end
98
  ps2_data_r = 1;
99
end endtask
100
 
101
// Transmitter test
102
task transmitter_test;
103
  input [7:0] bits;
104
  integer bit_cnt;
105
  reg [10:0] frame;
106
begin
107
  frame = 0;
108
  tx_data = bits;
109
  wait (~busy)
110
  send_req = #(`SYS_PERIOD*2) 1;
111
  send_req = #(`SYS_PERIOD*2) 0;
112
  wait (~ps2_data);
113
  for (bit_cnt = 0; bit_cnt < 11; bit_cnt = bit_cnt + 1) begin
114
    ps2_clk_r = #`PS2_PERIOD 0;
115
    frame = {frame[9:0], ps2_data};
116
    ps2_clk_r = #`PS2_PERIOD 1;
117
  end
118
  if (({bits[0],bits[1],bits[2],bits[3],bits[4],bits[5],bits[6],bits[7]} != frame[9:2]) |
119
      frame[10] | (~^frame[9:2] != frame[1]) | ~frame[0]) begin
120
    $display("Failed: Frame:0x%x Tx:0x%x", frame, bits);
121
  end
122
end endtask
123
 
124
// Test runner
125
integer byte;
126
always @(negedge sys_rst) begin
127
  for (byte = 1; byte < 256; byte = byte + 1) begin
128
    // Transmitter test
129
    transmitter_test(byte);
130
 
131
    // Correct case - data ok and error low
132
    receiver_test(0, byte, ~^byte, 1, 0);
133
    // Invalid start bit case - data ok and error high
134
    receiver_test(1, byte, ~^byte, 1, 1);
135
    // Invalid parity bit case - data ok and error high
136
    receiver_test(0, byte, ^byte, 1, 1);
137
    // Invalid stop bit case - data ok and error high
138
    receiver_test(0, byte, ~^byte, 0, 1);
139
  end
140
  #`PS2_PERIOD $finish();
141
end
142
 
143
// Dump data for GTKWave
144
initial begin
145
  $dumpfile("ps2_host_testbench.lxt");
146
  $dumpvars(0, ps2_host_testbench);
147
end
148
 
149
// Device Under Test
150
ps2_host ps2_host(
151
  .sys_clk(sys_clk),
152
  .sys_rst(sys_rst),
153
  .ps2_clk(ps2_clk),
154
  .ps2_data(ps2_data),
155
 
156
  .tx_data(tx_data),
157
  .send_req(send_req),
158
  .busy(busy),
159
 
160
  .rx_data(rx_data),
161
  .ready(ready),
162
  .error(error)
163
);
164
 
165
endmodule

powered by: WebSVN 2.1.0

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