前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IC验证之“Timescale”使用小谈(二)

IC验证之“Timescale”使用小谈(二)

作者头像
IC验证
发布2020-06-30 14:20:05
1.7K0
发布2020-06-30 14:20:05
举报
文章被收录于专栏:杰瑞IC验证

来源| 杰瑞IC验证(ID:Jerry_IC)

|原创作者| 老黄鸭

上期我们聊了timescale的简单用法,这一期我们一起再进阶一下~

1

timescale怎么打印?

有时候,我们需要知道我们的module,interface或者class中用到的timescale对应的单位和精度,这个时候我们怎么办呢?

有什么办法可以获取到这个信息吗?

有的小伙伴可能会想到说,我们可以加打印啊,比如在我们的环境中加入打印:

然后通过打印信息和波形来推断出时间单位和精度,看似可行,但是仔细推敲起来这种方法还是漏洞百出的,因为此时打印出来的时间对应的精度为global timeprecision,而不是local timeprecision !!(这个点后文中会说明)

那么到底怎么打印才比较好呢?

其实,很简单,SystemVerilog就给我们提供了一个内置函数:$printtimescale,此函数将会给我们打印出所在module、interface、program、package和class对应的timeunit和timeprecision,例如:

我们看看仿真的结果:

这个就是$printtimescale这个函数的输出格式。

上面的例子中,$printtimescale函数没有输入的参数?它支持输入参数吗?

其实是支持的,它的参数可以明确指定为module的例化名!!

我们这就来一起看看:

如上代码打出来的是什么结果呢?聪明的你肯定已经有了答案。

对,就是:

黄鸭哥给大家总结一下:

1、`timescale是个编译参数,编译时候起作用

2、在没有定义`timescale的module中,其timescale使用跟它最近的一个且编译顺序上排在前的module中的timescale。

3、如果编译顺序前的module也没有timescale,则使用编译命令输入的default timescale。default timescale就是指我们编译时输入的timescale的编译器命令选项

4、推荐使用SystemVerilog的系统函数$printtimescale来打印timescale信息。这个函数函数可以带参

2

再看timeprecision

前面我们提到一个名词,global timeprecision,这个是什么呢?我们先看一段代码:

大家根据上图想想我们对应的两个display和一个printtimescale都会输出什么样的值呢?

是1ns/1fs?还是1ps/1ps??

是不是有些迷茫和彷徨?

开始怀疑自己对于一个这么简单的时间精度难道都把握不准?

别怕,黄鸭哥慢慢给你剖析!

大家先看看上面的打印结果,自己先思考下原因:

上面这段代码就涉及到黄鸭哥刚才提到的global timeprecision,顾名思义,就是全局时间精度,它是在我们整个仿真里的一个统一的时间精度。

注意了!!!

这是个仿真时起作用的参数,它由我们所有定义的timeprecision里的最小的一个来决定!

跟global相对的就是local timeprecision,它是我们所在module或者文件的timeprecision,生命周期只到此module或者文件,此为编译参数,与仿真无关。

1、首先printtimescale对应的打印信息就是我们对应的`timescale 1ps/1ps,module tb_top的timeunit为1ps,local timeprecision为1ps 。

2、从上图可以看出我们的最小的参与仿真的timeprecision为module test头上对应的1fs,所以global timeprecision也就是1fs,global timepricision为仿真参数。从vcs的打印上我们也能看出对应的global timeprecison,Time:1000100000000fs,对应的仿真时间精度就是fs。

3、结合1和2,tb_top中的第22行display对应的5000就可以很好理解了,#5.0001 == #5ps(此处理解可参考黄鸭哥的timescale的第一期,相当于timeunit和local timeprecision的比例关系,简单的说local timeprecision管的是编译,global timerecision管的是运行,例如#5.0001是在编译时就决定了,tb_top中的第22行$display是在仿真时才决定),5ps == 5000fs,仿真运行到此处时就应该输出cur time is 5000。对于module DQ的第25行的输出也是和3一样的道理,黄鸭哥就不一一细说了。

看到这里小伙伴们不安的小情绪又稳定了下来吧,其实timescale也就那么一回事,它说白了很简单,但是有些细节可能平时工程中我们容易忽略,黄鸭哥希望你们看了这篇文章能更深入理解timescale。

——The End——

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杰瑞IC验证 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档