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

3. 设置数据限制

    测试平台也可以不通过设置仿真时间限制来控制仿真时间,而是通过对 MUT 输入数据的数量进行设置来达到控制仿真时间的目的。同样,也可以停止仿真,避免其无限制地运行。

下面 Verilog 代码描述了 moore_detector 模块的第四中测试平台。这里采用 $random 对输入 x 生成随机数据。 initial 块里的 repeat 语句让时钟共执行 13 次变化,每 5ns 变化一次;而 x 共得到 10 个新数据,每隔 7ns 变化一次。这里采用随机信号代替固定的测试数据。这种策略生成数据比较简单,但是分析输出时比较困难,因为它的输入是不可预测的。对于大规模电路来说,随机数据比可控的数据更有用。

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

       // repeat 语句限制输入数据的测试平台

       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;

 

              initial repeat(13) #5 clock=~clock;

              initial repeat(10) #7 x=$random;

 

       endmodule

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

4. 采用同步数据

    前面介绍的几个测试平台的例子中,时钟和数据均采用独立时序。当同时施加几组数据时,数据与系统时钟的同步将出现困难。

改变时钟频率会造成待测模块所有输入数据时序的改变。

下面描述的 moore_detector 模块的测试平台解决了这一问题。它采用事件控制语句来同步由测试平台生成的 x 与时钟。在一个 initial 语句里用 repeate 语句生成 clock 信号。另一个 initial 语句用于生成随机的数据 x 。其中,用一个 forever 循环来重复执行这项操作。这个循环语句等到 clock 上升沿到来 3ns 后执行,为 x 生成新的随机数。这个时钟上升沿后稳定的数据在下一时钟上升沿时施加到 moore_detector 模块。这种激励技术保证数据和时钟不会同时变化。

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

       // 与时钟同步的数据

       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;

              initial repeat(13) #5 clock=~clock;

              initial forever @(posedge clock) #3 x=$random;

 

       endmodule

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

    这里采用 3ns 的延迟,使该测试平台既可以用于行为仿真,又可以用于综合后仿真。在综合后仿真时,采用带有真实时延的元件模型,测试平台的延迟使该测试数据比其余测试数据先结束。

5. 输出结果的同步显示

在前面所述测试平台的基础上,下面介绍一种可以用于同步观测待测模块的输出或内部信号的方法。当采用层次化命名时,这种测试平台能够显示待测模块的内部变量和内部信号。在这里我们用到了任务函数 $display $monitor

以下面描述的 moore_detector 模块测试平台为例来介绍这一方法。该平台用于观测 moore_detector 状态值 current 和输出值 z ,其中用到任务函数 $monitor 来显示寄存器 current 的值,另外在一个 always 块中,用任务函数 $diaplay 来显示输出结果 z 。每当 current 状态值和输出值 z 变化时,就会显示变化后的值。

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

       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;

              initial repeat(19) #5 clock=~clock;

              initial forever @(posedge clock) #3 x=$random;

              initial $monitor("New state is %d and occurs at %t",MUT.current,$time);

              always @(z) $display("Output changes at %t to %b",$time,z);

 

       endmodule

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

该测试平台的最后一个过程赋值语句是对 z 值敏感的 always 语句。该语句里嵌套了一个 $display 任务,用于在 z 值变化时显示变化后的值及其变化时间。下面所示是运行测试平台生成的结果。

# New state is x and occurs at                    0

# Output changes at                    5 to 0

# New state is 0 and occurs at                    5

# New state is 1 and occurs at                   25

# New state is 2 and occurs at                   85

# Output changes at                   95 to 1

# New state is 3 and occurs at                   95


你可能感兴趣的:(硬件设计/CPLD/FPGA,测试,平台,random,output,任务)