timescale使用


1.timescale的介绍
    timescale包含时间单位和时间精度两部分。设定格式为`timescale timeunit / timeprecision
    timeunit和timeprecision由值1、10、和100以及单位s、ms、us、ns、ps和fs组成。
2.timescale对相对时间的影响
    如果设定`timescale 1ns/1ps,#100是相对时间,等价于#100ns,而#100.1111会被认为是#100.111ns,因为它的精度高于timescaled的时间精度,而被四舍五入。
3.timescale的作用范围
    在编译过程中,`timescale指令影响这一编译器指令后面所有模块中的时延值,直至遇到另一个`timescale指令或`resetall指令。
    SystemVerilog可以声明一个时间单位和精度,这与Verilog-2001中的`timescale编译器指令具有等价的功能。这些声明消除了使用编译器指令时对文件顺序的依赖性问题。时间单位和精度可以分别使用timeunit和timeprecision关键字来声明,但这个时间文本值必须是10的幂。
    对于任何模块、程序、包或接口,或者在任意编译单元作用域内,最多只能有一个时间单位和一个时间精度。这就会定义一个时间作用域。如果指定了timeunit和timeprecision的话,那么它们应该在任何当前时间作用域内其它条目之前声明。timeunit和timeprecision声明可以作为后续条目重复,但必须与当前时间作用域内之前的声明匹配。
    如下例子中:module A的时间单位/精度是100ps/ 1ps,module B的时间单位/精度是1ns/ 10ps,module C的时间单位/精度是1ps/ 1ps,module D的时间单位/精度是1s/1s
    `timescale 1ns / 10ps
    module A (...);
  timeunit 100ps;
  timeprecision 1ps;
    endmodule
    module B (...);
    endmodule
    `timescale 1ps/1ps
    module C (...);
    `timescale 1s/1s
    endmodule
    module D (...);
    endmodule

    再看一个例子
    `timescale 1ns/1ps
    module add(input clk,input a,input b,output bit[1:0] sum);
        always@(posedge clk)begin
            #3;
            sum = a+b;
            $display("1:time:%t",$realtime);//3300;3.300
            $display("2:time:%f",$realtime);//3.300000;3.300000            
        end
    endmodule
    `timescale 100ps/10ps
    module test();
        wire[1:0] get_sum;
        reg       input_a = 1;
        reg       input_b = 1;
        bit       clk;
        initial begin
            //$timeformat(-9,3,"",5);/*mark1*/
            #1;
            $display("3:time:%t",$realtime);//100;0.100
            $display("4:time:%f",$realtime);//1.000000;1.000000    
            #2 clk = ~clk;        
        end        
        add ADD(.clk(clk),.a(input_a),.b(input_b),.sum(get_sum));
    endmodule
4.使用$timeformat和%t统一时间单位/精度
    timeformat_task ::= $timeformat[(units_number,precision_number,suffix_string,minimum_field_width)];
    上述例子中mark1处注释掉后,打印结果为分号前结果,打开注释后,打印结果为分号后结果。
    如果$timeformat没有被调用过,这时%t打印的时间单位是所有`timescale中的最小time precision

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM