Verilog基础:编译指令`timescale

2023-12-05 20:52

本文主要是介绍Verilog基础:编译指令`timescale,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相关阅读

Verilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        `timescale编译指令用于指定指令后模块的时间单位和时间精度。时间单位是时间值的度量单位,例如延迟值和仿真时间;而仿真精度决定了最小可分辨延迟时间值。

        为了在一个(或多个)文件中使用不同的时间单位,下面一些有关时间的结构很有用:

1、`timescale编译指令用于指定其后模块的时间单位和时间精度。

2、$printtimescale系统任务用于显示一个模块的时间单位和时间精度。

3、$time和$realtime系统函数用于以当前模块的时间单位和时间精度显示仿真时间。

4、$timeformat系统任务用于指定格式字符串中转换说明%t的格式。

        `timescale编译指令指定了其后模块的时间和延迟值的度量单位和精度,直到遇到了另一个 `timescale编译指令。如果没有使用`timescale编译指令或者使用了`resetall编译指令复位,则时间单位和时间精度默认是由仿真器决定的。如果一些模块有`timescale编译指令,而一些没有,则会报错(简单来说就是,要么所有都用默认值,否则所有模块都需要使用`timescale编译指令),如下两种情况所示。

//错误,因为bbb模块使用默认值,而aaa模块指定了`timescale
`timescale 1ns/1ns
module aaa();bbb bbb_inst(a);
endmodule`resetall
module bbb(input a);initial  #5 $display("bbb");
endmodule//错误,因为bbb模块使用默认值,而aaa模块指定了`timescale(编译指令值影响本文件中定义的模块)
//文件1
`timescale 1ns/1ns
module aaa();bbb bbb_inst(a);
endmodule//文件2
module bbb(input a);initial  #5 $display("bbb");
endmodule

        `timescale编译指令的语法如下所示。

        time_unit参数指定了时间单位。而time_precision参数指定了时间精度,一个层次化设计的所有模块中最小的时间精度决定了仿真的时间精度,需要注意的是,仿真的时间精度并不一定和各模块的时间精度相同,这也就是说一个模块可能显示出比自己仿真精度还小的时间值。同时,时间精度还决定了一个延迟值在被使用前会被四舍五入的位数。上面两点在之后都会举例说明。

        时间精度不能比时间单位还大,也就是说精度最大与时间单位相同,这很好理解,如果一个时间精度都大于时间单位了,那它将成为实际意义上的时间单位。

        time_unit参数和time_precision参数由两部分组成,一个整数值和一个时间字符串,其中整数值可以是1,10,100,而字符串可以是s,ms,us,ns, ps和fs。时间字符串和时间单位的对应关系如下表所示。

时间字符串时间单位
s
ms毫秒
us微秒
ns纳秒
ps皮秒
fs飞秒

        我们首先说明一个延迟值在被使用前会因为时间精度而四舍五入,下面给出了一个例子。

`timescale 10ns/1ns
module aaa();initial #1.55 a=1;
endmodule

        由于时间单位是10ns,所以1.55代表了15.5ns,而时间精度是1ns,代表需要四舍五入至最低位是1ns,即四舍五入至16ns,因此真正的延迟时间值为16ns。

        一个模块的时间精度并不一定代表模块可辨别的最小时间值,而只是代表该模块可辨别的最小延迟时间值,真正决定一个模块可辨别的最小时间值的是仿真的时间精度,下面给出了一个例子。

`timescale 1ps/1ps
module aaa();reg a;bbb bbb_inst(a);initial #5 a=1;
endmodule`timescale 1ns/1ns
module bbb(input a);initial @(a) $display($realtime);
endmodule输出:
0.005

         仿真的时间精度为所有模块中最小的时间精度因此是1ps,在5ps时a赋值为1,因此触发了bbb模块中的$display($realtime);语句,$realtime系统函数的作用是以当前模块的时间单位为单位返回当前仿真时间的实数值,即以1ns为单位,返回5ps仿真时间,所以结果为0.005,这小于bbb模块仿真精度1ns。

        最后顺带一提,仿真时间精度也是仿真能推进的时间精度,在上例中,无法以500fs为步长推进仿真时间,无论你推进了多少次。

        以上内容可以总结为:一个模块的仿真精度,决定了其内延迟值的精度,而层次化设计中所有模块的仿真精度中最小的那个,决定了仿真器维护的仿真时间精度,可以认为是仿真时间的真正单位(没有小数部分)。一个模块的仿真单位决定了其延迟值的单位和$time和$realtime等系统函数返回值的单位。

这篇关于Verilog基础:编译指令`timescale的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/459101

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX