Verilog测试平台(testbench)技术(二)

2.时序电路测试

   时序电路测试包括测试电路时钟与输入数据的同步。这里以一个名为misr的模块为例说明时序电路的测试方法。

misr模块描述的电路有一个输入时钟、一个复位信号、输入数据与输出数据。该电路有一个poly参数,用于计算让的输出值和数据压缩。每个时钟上升沿到来时,通过已有的misr寄存器数据和输入数据计算新的输出值。其Verilog描述如下。

/*************************************************************************/

       `timescale 1ns/100ps

 

       module misr #(parameter [3:0] poly=0) (input clk, rst, input [3:0] d_in, output reg [3:0] d_out );

 

     always @( posedge clk )

          if( rst )

             d_out =4'b0000;

           else

             d_out = d_in ^ ({4{d_out[0]}} & poly) ^ {1'b0,d_out[3:1]};

 

       endmodule

/*************************************************************************/

下面是misr模块的测试平台。

/*************************************************************************/

       module test_misr;

              reg clk=0,rst=0;

              reg [3:0] d_in;

              wire [3:0] d_out;

      

              misr #(4'b1100) MUT(clk,rst,d_in,d_out);

      

              initial

                  begin

                         #13 rst=1'b1;

                         #19 d_in=4'b1000;

                         #31 rst=1'b0;

                         #330 $stop;

                  end

      

              always #37 d_in=d_in+3;

              always #11 clk=~clk;

      

       endmodule

/*************************************************************************/

    测试平台中的initial语句产生rst信号的一个上升脉冲,从13ns到63ns。这样做的目的是让这个脉冲至少覆盖一个时钟上升沿,这样,同步的rst信号可以初始化misr模块的寄存器。输入数据d_in初始值为不定态,当rst为1时,被赋予初值4'b1000。

除了这个initial语句块之外,test_misr模块还包括两个always语句,用于生成clk和d_in。时钟是周期信号,每隔11ns翻转一次,另外每隔37ns就给输入d_in一个新值。为了降低多个输入同时翻转的概率,对时序电路的输入一般采用素数作为时间间隔。

仿真波形如下所示。

posted on 2012-04-23 19:43  K海风  阅读(1006)  评论(0编辑  收藏  举报

导航