sv基础:timescale、timeunit、timeprecision

来源:处芯积律 嵌入式开发 110 次阅读
摘要:1. 前言 Verilog/System verilog 仿真中的时间单位/时间精度设置是保证仿真设置正确的重要手段,但是很多场景下却常常被忽视。设置不合理会导致诸多问题,例如延时不准确,时钟周期不对,打印信息不准确,验证用例耗费的时间特别长,多模块配合无法发现隐藏的问题。 因此,本文件将描述timescale、timeunit、timeprecision等概念,并描述如何正确地使用timesca

1. 前言

Verilog/System verilog 仿真中的时间单位/时间精度设置是保证仿真设置正确的重要手段,但是很多场景下却常常被忽视。设置不合理会导致诸多问题,例如延时不准确,时钟周期不对,打印信息不准确,验证用例耗费的时间特别长,多模块配合无法发现隐藏的问题。

因此,本文件将描述timescale、timeunit、timeprecision等概念,并描述如何正确地使用timescale。

时间单位和时间精度的有效数值可以是1,10和100,时间单位可以是s, ms, us, ns, ps, 和fs。

1.1 timeunit

timeunit/timeprecision即仿真时间单位/时间精度,是仿真时间这个维度上两个重要的概念。

timeunit,即时间和延时的单位

timeunit设置成1ns,则 #1表示1ns

timeunit设置成10ns,则 #1表示10ns

正常情况下,timeunit的设置的对绝对延时(#100ns)没有影响

大部分的仿真器默认的timeunit是1ns。

1.2 timeprecision

timeprecision,即时间精度,表示在仿真之前如何进行四舍五入

当timeprecision=1ps时, #0.4ps 会被当做0ps处理而#0.5ps会被认为#1ps

1.3 timescale 

1timescale 能够同时定义时间单位和时间精度, timescale=1ns/1ps 表示 timeunit=1ns,timeprecision=1ps。

1时间单位和时间精度的有效数值可以是1,10和100,时间单位可以是s, ms, us, ns, ps, 和fs。

YAML                  `timescale time_unit / time_precision

1.4 $printtimescale

System verilog提供函数$printtimescale用于打印当前作用域生效的timeunit和timeprecision。我们可以通过$printtimescale判断不同作用域中采用的timeunit和timeprecision是否符合预期。

YAML                  module aa;                  timeunit 10ns;                  timeprecision 1ps;                  initial begin                  $printtimescale;                  end                  endmodule

打印格式为:

YAML                  TimeScale of aa is 10 ns / 1 ps 

2. 先说结论

module/program/interface/package内部使用的timeunit和timeprecision具有最高优先级

module/program/interface/package采用的是离它们最近的timescale;

这里的近指的是编译的顺序

如果多个timescale定义分布在不同文件中,采用最后编译文件中的timescale定义

如果一个文件中存在多个timescale定义,则采用离自身最近一行的timescale定义,即从module/program/interface/package所在行往上数,最近的一行timescale定义

命令行中的timescale定义代表全局的第一个timescale定义

如果module/program/interface/package自身所在的文件没有timescale,且在此之前编译的文件均没有定义timescale,此时会采用编译选项中的timescale

按编译顺序,某个timescale定义能对后续所有的文件生效,直到被新的timescale定义覆盖。

timescale定义按编译顺序生效,无论文件是放置在.f文件中还是vcs命令单独编译,只要编译的顺序不变则timescale定义生效的范围不变。

YAML                  timescale 10ns/10ps                  编译test1.v//test1.v中没有timescale相关定义,此时采用的是10ns/10ps                  timescale 1ns/1ps                  编译test2.v//test2.v中没有timescale相关定义,此时采用的是1ns/1ps

override_timescale 会覆盖所有时间单位和时间精度定义,强烈不推荐

3. 如何使用timescale

在实际代码定义中,因此存在调用lib库等原因,文件的timescale定义会不一致。在大部分自研代码中timescale 1ns/1ps 就够用了,但是在lib中timescale 会定义成其他值。为了保证不同文件都能采用正确的定义,此时我们会在filelist文件中多次调用timescale用于确保文件使用正确的定义。

YAML                  //pcie_sim.f                  timescale 1ns/1ps-fpcie_rtl.f//此filelist中的文件为自研代码,没有额外定义timescale 采用1ns/1ps                  -fpcie_lib.f//此filelist中的文件为IP代码,如果定义了timescale,则使用自身定义的timescale                  timescale 1ns/1ps  //保证下面的代码采用1ns/1ps,覆盖掉pcie_lib.f中文件定义的时间单位和时间精度                  -fcommon.f// 此filelist中的文件为自研代码,没有额外定义timescale 采用1ns/1ps                  
相关推荐
评论区

登录后即可参与讨论

立即登录