-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathuart_TB.v
175 lines (139 loc) · 2.91 KB
/
uart_TB.v
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
///////////////////////////////////////////////////////////////////////////////
// $Id: uart_TB.v 916 2018-02-25 Ahmad Hegazy $
//
// Module: uart_TB.v
// Project: UART
// Description: uart test bench .. tests the uart inputs/outputs and functionality.
// Author: Ahmad Hegazy <ahegazipro@gmail.com>
//
// Change history:
//
///////////////////////////////////////////////////////////////////////////////
`timescale 10ns/1ns
module uart_TB;
/*INPUTS*/
reg clk ,reset ,d_num ,s_num;
reg [7:0] data_in;
reg [1:0] bd_rate ,par;
/* OUTPUTS */
wire [7:0] dout;
wire [2:0] err;
/* calculate waiting time*/
parameter WAIT_9600 = (1000_000_000/9600)*11; //wait 11 cycles
parameter WAIT_4800 = (1000_000_000/4800)*11; //wait 11 cycle
parameter WAIT_2400 = (1000_000_000/2400)*11; //wait 11 cycle
parameter WAIT_1200 = (1000_000_000/1200)*11; //wait 11 cycle
parameter WAIT_15MINS = 15 * 60 * 100_000_000; // 15 minutes to ns - 10 timeunits ..
//UART instance
uart UART0 ( .clk(clk) ,
.reset(reset) ,
.bd_rate(bd_rate) ,
.par(par) ,
.d_num(d_num) ,
.s_num(s_num) ,
.data_in(data_in)
);
assign dout = UART0.dout;
assign err = UART0.err;
/*Initializing inputs*/
initial
begin
//initialize here
clk = 0;
reset = 0;
bd_rate = 0;
par = 0;
d_num = 0;
s_num = 0;
end
/*Monitor values*/
initial
begin
$display ("\t\ttime,\tdata_in,\tbaud,\ts_num,\td_num,\terr,\tdout");
$monitor ("%d,\t%b,\t%b,\t%b,\t%b,\t%b,\t%b",$time,data_in,bd_rate,s_num,d_num,err,dout);
end
//Generate clock
always
#1 clk = ~clk;
event rst_done;
/*Generating input values */
task rst();
begin
@(negedge clk);
reset = 1;
#5
@(negedge clk);
begin
reset = 0;
->rst_done;
end
end
endtask
//generating input pos
integer j,k,x,i;//reg [1:0]
initial
begin
j=0;k=0;x=0;i=0;
end
task gen_dum();
begin
for (i=0;i<4;i=i+1) //for baud
begin
bd_rate = i;
for (x=0;x<4;x=x+1) //for baud
begin
par = x;
for (j=0;j<2;j=j+1) //for s_num
begin
s_num = j;
for (k=0;k<2;k=k+1) //for d_num
begin
d_num = k;
data_in <= $urandom;
#WAIT_15MINS;
/* //WE can use these values and force the enable signal ..
case (bd_rate)
0: #WAIT_1200;
1: #WAIT_2400;
2: #WAIT_4800;
3: #WAIT_9600;
endcase
/***/
end
end
end
end
end
endtask
initial
begin
#1 rst();
end
initial
begin
@(rst_done)
begin
gen_dum;
#100;
$display("TEST succeeded");
$stop;
end
end
always @ (dout)
begin
//checking reset ERROR
if(reset == 1 & dout != 0)
begin
$display("ERR reset: %b != dout: %b ",reset,dout);
#1
$stop;
end
//checking dout == din
if ((((d_num == 0) & (data_in[6:0] != dout[6:0])) | ((d_num == 1) & (data_in != dout))) & (reset != 1))
begin
$display("ERR din: %b != dout: %b ",data_in,dout);
#1
$stop;
end
end
endmodule