对计数器电路编写testbench

发布时间 2023-03-22 21:16:43作者: 闲人张

对一个计数器电路编写测试平台进行功能验证。
电路功能:
(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