对一个计数器电路编写测试平台进行功能验证。
电路功能:
(1)BCD码计数,从8’h00~8’h59范围的60进制循环计数。
(2)同步复位功能(reset是复位信号)。
(3)加载初始值功能(load是加载控制信号,data是加载数据)。
(4)计数动作允许功能(cin是计数使能信号)。
(5)动作优先级:复位>加载初始值>计数允许。
rtl代码如下:
查看代码
module count60(qout, cout, data, load, cin, reset, clk);
output [7:0] qout;
output cout;
input [7:0] data;
input load, cin, reset, clk;
reg [7:0] qout;
always @(posedge clk)
begin
if(reset) //同步复位
qout = 7'b0;
else if(load) //同步置数
qout = data;
else if(cin) //cin=1,开始加一计数,否则qout不改变
begin
if(qout[3:0] == 4'h9) //低位为9
begin
qout[3:0] = 4'b0; //是,则清零
if(qout[7:4] == 4'h5)
qout[7:4] = 4'b0;
else
qout[7:4] = qout[7:4] + 1'b1; //高位加1
end
else
qout[3:0] = qout[3:0] + 1'b1;
end
end
assign cout = ((qout == 8'h59) & cin)? 1'b1 : 1'b0; //进位输出
endmodule
testbench:
查看代码
`timescale 1ns/1ns
module tb_count60();
reg clk;
reg reset;
reg load;
reg cin;
reg reset;
reg [7:0] data;
wire [7:0] qout;
wire [7:0] cout;
parameter CYCLE=10;
count60 count60(
.clk(clk),
.reset(reset),
.load(load),
.cin(cin),
.data(data),
.qout(qout),
.cout(cout)
);
initial begin //clk
clk = 0;
forever begin
#(CYCLE/2);
clk = 1;
#(CYCLE/2);
clk = 0;
end
end
integer a;
integer b;
initial begin //have use 1~3;not use 100~200; reset!!!!!!!!!!!!
reset = 0;
a={{$random}%3+1};
b={{$random}%101+100};
forever begin
reset = 1;
#(a*CYCLE);
reset=0;
#(b*CYCLE);
end
end
integer c;
integer d;
initial begin //have use 1~3;not use 40~80; load!!!!!!!!!!!!
load = 0;
c={{$random}%3+1};
d={{$random}%41+40};
forever begin
load = 1;
#(c*CYCLE);
load=0;
#(d*CYCLE);
end
end
integer e;
integer f;
initial begin //have use 30~90;not use 1~10; cin!!!!!!!!!!!!
cin = 0;
e={{$random}%31+60};
f={{$random}%10+1};
forever begin
cin = 1;
#(e*CYCLE);
cin=0;
#(f*CYCLE);
end
end
initial begin //have use 30~90;not use ; data!!!!!!!!!!!!
data=0;
forever begin
data[3:0]={$random}%10;
data[7:0]={$random}%6;
#(10*CYCLE);
end
end
initial begin
#(6000*CYCLE);
$display($time,"sim end!!!");
$finish;
end
endmodule