IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Testbench中如何产生精确的时钟

    TacuLee发表于 2015-08-17 15:16:57
    love 0

    编写TestBench的目的就是将激励施加一个设计(Design),观察它的响应,并将这个响应和期望的结果进行比较。下面将说明如何生成精确的时钟信号。下面是用Verilog 编写的两个程序用来生成100Mhz DutyCycle为50%的Clock。

    `timescale 1ns / 100ps
    reg clk;
    always
     begin
     #5;
     clk = 1'b0;
     #5;
     clk = 1'b1;
    end

    `timescale 1ns / 100ps
    reg clk;
    initial
     begin
     clk = 1'b0;
    end
    always
     begin
      # 5 clk = ~clk;
    end

    例1和例2 都生成正确的Clock,例1的方法使用1和0 显示赋值会更可靠,另外可以更好地控制Clock的初始相位,同样可以用来设计出不同DutyCycle的Clock。例2使用clk = ~clk的语句时,将依赖Clock信号的初始值,而不是默认的1‘bx,如何没有给clk赋初值,试想将1’bx取反 得到的是什么?将不能产生Clock。

    1、整形除法可以加快时钟的产生 同时可能造成截断错误

    当使用Verilog产生正确的Clock 或者波形的时候,必须选择适当的时延单位和时延精度,这样才能将波形的边沿设置在准确的位置,当使用类似Cycle/2的表达式时,为了计算延时,必须确定整数运算不会截断变量的小数部分。如例3 我想产生的Clock的period 为15ns,但我得到的14ns的信号,因为整数除法将小数部分截断了。

    `timescale 1ns / 1ns
    module TestBench;
    .......
    reg clk;
    parameter Cycle = 15;
    always
     begin
     #(Cycle/2) ; // Interger division
     clk = 1'b0;
     #(Cycle/2) ; // Interger division
     clk = 1'b1;
    end
    endmodule

    2 、Verilog的时延精度(timescale)会影响信号的边沿

    如果延时精度相对天当前的延时单位太低 ,延时(delay)的值和预期值相比会变大或变小,当这种情况发生时钟信号上时,它会改变时钟沿的相对位置。例如例4中的Module会生产生一个的period为16ns的时钟信号,因为是由实数除法得到的值再经过舍入得到的整形值。

    `timescale 1ns / 1ns
    module TestBench;
    .......
    reg clk;
    parameter Cycle = 15;
    always
     begin
     #(Cycle/2.0) ; // Real division
     clk = 1'b0;
     #(Cycle/2.0) ; // Real division
     clk = 1'b1;
    end
    endmodule

    综上所述 想产生一个精确的波形,必须根据需要 选择恰当的时延单位 时间精度 ,同时明白整形除法和实数除法 区别。例5提供了能够保证实现7.5ns的半周期长度的时延精度,因此可以产生周期为15ns的Clock。

    例5:

    `timescale 1ns / 100ps
    module TestBench;
    .......
    reg clk;
    arameter Cycle = 15;
    always
     begin
     #(Cycle/2.0) ; // Real division
     clk = 1'b0;
     #(Cycle/2.0) ; // Real division
     clk = 1'b1;
    end
    endmodule

    未经允许不得转载:TacuLee » Testbench中如何产生精确的时钟



沪ICP备19023445号-2号
友情链接