testbench(1)

本文最后更新于:Wednesday, September 30th 2020, 8:01 pm

Testbench(1)

1、testbench的结构

testbench

  1. testbench没有输入输出接口

  2. 测试模块只负责对待测试系统接口提供激励信号;并监控输出

  3. testbench代码不需要可综合,即不被实现成电路

  4. 产生适当的激励并达到覆盖率要求


2、测试激励的描述方式

  1. 信号的初始化

    1
    2
    3
    4
    5
    第一种: initial 初始化
    initial a = 0;

    第二种: 定义信号时初始化
    reg[3:0] cnt = 4'b1010;
  2. 延迟控制

    1. 延迟语句

      • 外部时间控制

        1
        2
        3
        4
        5
        6
        7
        8
        initial #5 a = b;(等待5tick后计算右端的值并赋值给左边👈)

        等价于:
        initial
        begin
        #5;
        a=b;
        end
      • 内部时间控制

        1
        2
        3
        4
        5
        6
        7
        8
        9
        initial a = #5 b;(先计算右端的值,等待5tick后再把值赋给左边👈)

        等价于
        initial
        begin
        temp = b;
        #5;
        a = temp;
        end

        验证程序如下:

        mark

        mark

        可以清楚地看到:

        ​ 第一种延时语句,在0-5tick之间只要b变化了,那么第五tick

        时刻a被赋予的值就是b第五时刻的值。

        ​ 而第二种延时语句:b的值在0时刻已经定好了,不管

        b在这期间怎么变化,a最终得到的是b在0时刻的值。

    2. 事件语句

      @(<事件表达式>);

      @(<事件表达式>)行为语句;

      1
      2
      3
      4
      5
      initial
      begin
      # 10
      @(posedge en) in = ~in; //en的👆上升沿到来时,in取反
      end

      事件语句@必须等指定事件到来才执行

    3. 等待语句

      wait(<条件表达式>) 行为语句

      1
      2
      3
      4
      5
      6
      always
      #5 cnt=cnt+1'b1;
      initial
      wait(cnt == 4'b1111)
      $display($time,,,"cnt = %b", cnt);
      end

      等待语句只有条件为真时才执行。

      mark

      可以看到第0时刻cnt = 0

      第5时刻cnt = 1

      以此类推;直到第75时刻 cnt = 15

      再过10tick 就终止仿真了。总过时常85tick


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!