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

相关文章

这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

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是