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一个新值。为了降低多个输入同时翻转的概率,对时序电路的输入一般采用素数作为时间间隔。
仿真波形如下所示。