二、测试平台技术
下面讨论许多有关测试激励生成与输出结果观测的代码编写技术。在这里待测模块我们使用一个如下描述的 Moore 状态机,它是一个 101Moore 序列检测器。当检测到输入序列为 101 时,当前状态值变为 d ,输出 z 的值为 1 。这是一个同步复位电路。
/*************************************************************************/
`timescale 1ns/100ps
module Moore_detector (input x, rst, clk, output z);
parameter [1:0] a=0,b=1,c=2,d=3;
reg [1:0] current;
always @( posedge clk )
begin
if( rst )
current = a;
else
case ( current )
a: current=x?b:a;
b: current=x?b:c;
c: current=x?d:a;
d: current=x?b:c;
default: current=a;
endcase
end
assign z = (current==d)?1'b1:1'b0;
endmodule
/*************************************************************************/
1. 测试数据
如下代码是 moore_detector 模块的测试平台,与前面类似,测试平台是一个没有输入输出端口的模块。这个模块有 4 个过程块用于生成待测状态机的测试数据。与例化模块 MUT 的输入端相连的变量在过程块里位于赋值语句的左侧,它们的定义为 reg 类型。
/*************************************************************************/
module test_moore_detector;
reg x,reset,clock;
wire z;
Moore_detector MUT(x,reset,clock,z);
initial
begin
clock=1'b0;
x=1'b0;
reset=1'b1;
end
initial
#24 reset=1'b0;
always #5 clock=~clock;
always #7 x=~x;
endmodule
/*************************************************************************/
通常不是在声明 reg 类型变量时对其进行初始化,而是采用 initial 块对其进行初始化。初始化变量很重要,特别是对 clock 这种需要利用它前一时刻的值来计算当前时刻的值的变量,若不对其进行初始化,它的初始值为不确定状态,并将一直保持为该状态。
2. 对仿真的控制
下面代码描述了 moore_detector 模块的另一种测试平台。上一节介绍的测试平台,如果不中断它或停止它,它会一直运行,而下面描述的测试平台解决了这个问题,它加入另一个 initial 块,使仿真在 189ms 时停止。
/*************************************************************************/
// 有 $stop 仿真控制任务的测试平台
module test_moore_detector;
reg x=0,reset=1,clock=0;
wire z;
Moore_detector MUT(x,reset,clock,z);
initial
#24 reset=1'b0;
always #5 clock=~clock;
always #7 x=~x;
initial
#189 $stop;
endmodule
/*************************************************************************/
$stop 和 $finish 是仿真控制任务。当过程块运行到此类任务时,仿真暂停或结束。暂停的仿真可以继续运行,而结束的仿真则不能。仿真波形如下图。
下面是 moore_detector 模块的第三种测试平台,它把 reset 信号无效和仿真控制任务放在同一个 initial 块里,在这种时序下,仿真在 189ns 时刻停止。
/*************************************************************************/
// 有 $finish 仿真控制任务的测试平台
module test_moore_detector;
reg x=0,reset=1,clock=0;
wire z;
Moore_detector MUT(x,reset,clock,z);
initial
begin
#24 reset=1'b0;
#165 $finish;
end
always #5 clock=~clock;
always #7 x=~x;
endmodule
/*************************************************************************/