-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_faux_mouse_to_symbolics.sv
157 lines (120 loc) · 3.3 KB
/
test_faux_mouse_to_symbolics.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Copyright 2022 Douglas P. Fields, Jr. All Rights Reserved.
`ifdef IS_QUARTUS // Defined in Assignments -> Settings -> ... -> Verilog HDL Input
// This doesn't work in Questa/ModelSim for some reason.
`default_nettype none // Disable implicit creation of undeclared nets
`endif
// Tick at 1ns (using #<num>) to a precision of 0.1ns (100ps)
`timescale 1 ns / 100 ps
module test_faux_mouse_to_symbolics();
// Simulator generated clock & reset
logic clock;
logic reset;
// generate clock to sequence tests
always begin
// 50 Mhz (one full cycle every 20 ticks at 1ns per tick per above)
#10 clock <= ~clock;
end
// Should we output non-error messages?
localparam [0:0] SHOW_OUTPUT = '0; // '0 or '1
// How long our half-bit lengths are (short for simulation)
localparam SHORT_PULSE = 5;
//////////////////////////////////////////////////////////////
// Our device under test - the biphase encoder
// Create our device under test (biphase encoder)
logic biphase_encoder_busy;
// What we're going to send to biphase encoder
logic mouse_data_ready;
logic [7:0] mouse_data;
// Our mouse inputs
logic mouse_up;
logic mouse_down;
logic mouse_left;
logic mouse_right;
logic button_left;
logic button_middle;
logic button_right;
logic [2:0] mouse_speed;
faux_mouse_to_symbolics #(
.SHORT_PULSE(SHORT_PULSE)
) dut (
.clock, .reset,
.mouse_up, .mouse_down,
.mouse_left, .mouse_right,
.button_left, .button_middle, .button_right,
.mouse_speed,
.busy(biphase_encoder_busy),
.data_ready(mouse_data_ready),
.data_out(mouse_data)
);
fake_biphase_encoder #(
.SHORT_PULSE(SHORT_PULSE)
) fake_biphase_encoder ( // Device Under Test
.clk(clock),
.rst(reset),
// Inputs
.data_ready(mouse_data_ready),
.data_in(mouse_data),
// Outputs
.busy(biphase_encoder_busy),
// Debugging outputs
.dbg_start_bit(), .dbg_stop_bit(), .dbg_data_bits()
);
///////////////////////////////////////////////////////////////
// Reset driver and end of test handler
// initialize test with a reset for 22 ns
initial begin
$display("Starting Simulation @ ", $time);
clock <= 1'b0;
reset <= 1'b1;
#22;
reset <= 1'b0;
// Set what commands we are sending
// Minimum command interval is 6,800 ns
// Move up for 25us
$display("Move up @", $time);
mouse_up <= '1;
mouse_down <= '0;
mouse_left <= '0;
mouse_right <= '0;
button_left <= '0;
button_right <= '0;
button_middle <= '0;
mouse_speed <= 3'd0;
#25_000;
// Nothing for 10us
$display("Done moving @", $time);
mouse_up <= '0;
#10_000;
// Double click left button
$display("Double click left button @", $time);
button_left <= '1;
#3_500;
button_left <= '0;
#10_500;
button_left <= '1;
#7_200;
button_left <= '0;
#12_000;
// Click and move at the same time
$display("Middle click & move slower @", $time);
mouse_speed <= 3'd1;
button_middle <= '1;
mouse_down <= '1;
mouse_left <= '1;
#2_000;
button_middle <= '0;
#33_000;
mouse_left <= '0;
#17_000;
mouse_down <= '0;
$display("Done moving @", $time);
#15_000;
// Stop the simulation in due course.
$display("Ending simulation @ ", $time);
$stop; // $stop = breakpoint
// DO NOT USE $finish; it will exit Questa!!!
end
endmodule
`ifdef IS_QUARTUS
`default_nettype wire // Restore default
`endif