四位计数器testbench的设计
简单介绍一下四位计数器所要满足的条件:
1.4bit循环计数;
1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,1,.......
2.能同步清零;
高电平有效
3.有加载功能;
高电平加载
4.优先级:清零信号 > 加载信号;
给出计数器的设计代码:
1 module count4(clk, reset, clr, ld, init, out);
2
3 input clk, reset;
4 input clr;
5 input ld;
6 input [3:0] init;
7 output [3:0] out;
8 reg [3:0] out;
9
10 always @(posedge clk or posedge reset)
11 begin if(reset)
12 out <= 0;
13 else if(clr)
14 out <= 0;
15 else if(ld)
16 out <= init;
17 else
18 out <= out+1;
19 end
20 endmodule
计数器的testbench设计:
对clr信号进行验证:
1. 一个周期;
2.二个周期(多个周期);
3.毛刺
1 `timescale 1ns/1ns
2
3 module tb_a;
4
5 parameter CYCLE=10;
6
7 reg clk;
8 reg reset;
9 reg clr;
10 reg ld;
11 reg[3:0] init;
12 wire[3:0] out;
13
14 //RTL instance
15 count4 count4(
16 .clk(clk),
17 .reset(reset),
18 .ld(ld),
19 .init(init),
20 .clr(clr),
21 .out(out)
22 );
23
24 //generate input-clk
25 initial begin
26 clk=0;
27 forever begin
28 #(CYCLE/2);
29 clk=1;
30 #(CYCLE/2);
31 clk=0;
32 end
33 end
34
35 initial begin
36 reset=1;
37 #(5*CYCLE);
38 reset=0;
39 end
40
41 initial begin
42 clr=0;
43 ld=0;
44 init=0;
45 #(6*CYCLE);
46
47
48
49 @(negedge clk);
50
51 clr=1;
52 ld=0;
53 init=0;
54 #(CYCLE);
55
56 @(negedge clk);
57 clr=0;
58 ld=0;
59 init=0;
60 #(5*CYCLE);
61
62 @(negedge clk);
63 clr=1;
64 ld=0;
65 init=0;
66 #(2*CYCLE);
67
68 @(negedge clk);
69 clr=0;
70 ld=0;
71 init=0;
72 #(5*CYCLE);
73
74 @(negedge clk)
75 clr=1;
76 ld=0;
77 init=0;
78 #(CYCLE/8);
79
80
81 clr=0;
82 ld=0;
83 init=0;
84 #(20*CYCLE);
85
86 $finish;
87
88
89 end
90
91 endmodule
波形图:

对ld加载信号进行验证:
1. 一个周期;
2.二个周期(多个周期);
3.毛刺
注意:写在一个initial块里面;
测试ld信号时,clr信号为0.
testbench:
1 `timescale 1ns/1ns
2
3 module tb_a;
4
5 parameter CYCLE=10;
6
7 reg clk;
8 reg reset;
9 reg clr;
10 reg ld;
11 reg[3:0] init;
12 wire[3:0] out;
13
14 //RTL instance
15 count4 count4(
16 .clk(clk),
17 .reset(reset),
18 .ld(ld),
19 .init(init),
20 .clr(clr),
21 .out(out)
22 );
23
24 //generate input-clk
25 initial begin
26 clk=0;
27 forever begin
28 #(CYCLE/2);
29 clk=1;
30 #(CYCLE/2);
31 clk=0;
32 end
33 end
34
35 initial begin
36 reset=1;
37 #(5*CYCLE);
38 reset=0;
39 end
40
41 initial begin
42 clr=0;
43 ld=0;
44 init=0;
45 #(6*CYCLE);
46
47
48
49 @(negedge clk);
50
51 clr=1;
52 ld=0;
53 init=0;
54 #(CYCLE);
55
56 @(negedge clk);
57 clr=0;
58 ld=0;
59 init=0;
60 #(5*CYCLE);
61
62 @(negedge clk);
63 clr=1;
64 ld=0;
65 init=0;
66 #(2*CYCLE);
67
68 @(negedge clk);
69 clr=0;
70 ld=0;
71 init=0;
72 #(5*CYCLE);
73
74 @(negedge clk)
75 clr=1;
76 ld=0;
77 init=0;
78 #(CYCLE/8);
79
80
81 clr=0;
82 ld=0;
83 init=0;
84 #(10*CYCLE);
85 //clr_testbench
86 @(negedge clk);
87 clr=0;
88 ld=1;
89 init=5;
90 #(CYCLE);
91
92 clr=0;
93 ld=0;
94 init=0;
95 #(2*CYCLE);
96
97 @(negedge clk);
98 clr=0;
99 ld=1;
100 init=5;
101 #(2*CYCLE);
102
103 clr=0;
104 ld=0;
105 init=0;
106 #(2*CYCLE);
107
108 @(negedge clk);
109 clr=0;
110 ld=1;
111 init=5;
112 #(CYCLE/8);
113
114 clr=0;
115 ld=0;
116 init=0;
117 #(10*CYCLE);
118
119 $finish;
120
121
122 end
123
124 endmodule
波形图:

对计数器功能进行验证:
1. 极值测试(最大值,最小值);
2.优先级测试;
testbench:
1 `timescale 1ns/1ns
2
3 module tb_a;
4
5 parameter CYCLE=10;
6
7 reg clk;
8 reg reset;
9 reg clr;
10 reg ld;
11 reg[3:0] init;
12 wire[3:0] out;
13
14 //RTL instance
15 count4 count4(
16 .clk(clk),
17 .reset(reset),
18 .ld(ld),
19 .init(init),
20 .clr(clr),
21 .out(out)
22 );
23
24 //generate input-clk
25 initial begin
26 clk=0;
27 forever begin
28 #(CYCLE/2);
29 clk=1;
30 #(CYCLE/2);
31 clk=0;
32 end
33 end
34
35 initial begin
36 reset=1;
37 #(5*CYCLE);
38 reset=0;
39 end
40
41 initial begin
42 clr=0;
43 ld=0;
44 init=0;
45 #(6*CYCLE);
46
47
48
49 @(negedge clk);
50
51 clr=1;
52 ld=0;
53 init=0;
54 #(CYCLE);
55
56 @(negedge clk);
57 clr=0;
58 ld=0;
59 init=0;
60 #(5*CYCLE);
61
62 @(negedge clk);
63 clr=1;
64 ld=0;
65 init=0;
66 #(2*CYCLE);
67
68 @(negedge clk);
69 clr=0;
70 ld=0;
71 init=0;
72 #(5*CYCLE);
73
74 @(negedge clk)
75 clr=1;
76 ld=0;
77 init=0;
78 #(CYCLE/8);
79
80
81 clr=0;
82 ld=0;
83 init=0;
84 #(10*CYCLE);
85 //clr_testbench
86 @(negedge clk);
87 clr=0;
88 ld=1;
89 init=5;
90 #(CYCLE);
91
92 clr=0;
93 ld=0;
94 init=0;
95 #(2*CYCLE);
96
97 @(negedge clk);
98 clr=0;
99 ld=1;
100 init=5;
101 #(2*CYCLE);
102
103 clr=0;
104 ld=0;
105 init=0;
106 #(2*CYCLE);
107
108 @(negedge clk);
109 clr=0;
110 ld=1;
111 init=5;
112 #(CYCLE/8);
113
114 clr=0;
115 ld=0;
116 init=0;
117 #(10*CYCLE);
118 //function testbench
119 @(negedge clk);
120 clr=0;
121 ld=1;
122 init=0;
123 #(CYCLE);
124
125 clr=0;
126 ld=0;
127 init=0;
128 #(2*CYCLE);
129
130 @(negedge clk);
131 clr=0;
132 ld=1;
133 init=15;
134 #(CYCLE);
135
136 clr=0;
137 ld=0;
138 init=0;
139 #(2*CYCLE);
140
141 @(negedge clk);
142 clr=1;
143 ld=1;
144 init=5;
145 #(CYCLE);
146
147 clr=0;
148 ld=0;
149 init=0;
150 #(2*CYCLE);
151
152
153
154
155
156
157
158
159
160
161
162
163 $finish;
164
165
166 end
167
168 endmodule
波形图:


编写中一个小错误:
是#(CYCLE),不是(#CYCLE).

浙公网安备 33010602011771号