当前位置: 首页 > article >正文

12、Verilog 时序检查

关键词 setup hold recovery removal width period指定路径延迟目的是让仿真的时序更加接近实际数字电路的时序。利用时序约束对数字设计进行时序仿真检查设计是否存在违反violation时序约束的地方并加以修改也是数字设计中不可或缺的过程。Verilog 提供了一些系统任务用于时序检查。这些系统任务只能在 specify 块中调用。下面就介绍 6 种常用的用于时序检查的系统任务$setup, $hold, $recovery, $removal, $width 与 $period。$setup, $hold系统任务 $setup 用来检查设计中元件的建立时间约束条件$hold 用来检查保持时间约束条件。其用法格式如下$setup(data_event, ref_event, setup_limit);data_event: 被检查的信号判断它是否违反约束ref_event: 用于检查的参考信号一般为时钟信号的跳变沿setup_limit: 设置的最小建立时间如果T( ref_event - data_event) setup_limit 则会打印存在violation的报告。$hold(ref_event, data_event, hold_limit);data_event: 被检查的信号判断它是否违反约束ref_event: 用于检查的参考信号一般为时钟信号的跳变沿hold_limit: 设置的最小保持时间如果T( data_event - ref_event ) hold_limit 则会打印存在violation的报告。注意:$setup 和 $hold 输入端口的位置是不同的。Verilog 提供了同时检查建立时间和保持时间的系统任务$setuphold (ref_event, data_event, setup_limit, hold_limit);下面完成一个数乘以 15 的操作来说明 $setup 和 $hold 的用法。Verilog 中一个变量乘以常数一般用移位相加的方法来完成例如对变量 num 乘以 15 的操作可以表示为num x 15 (num 3) (num 2) (num 1) num此操作需要 3 个加法器。下面对加法器进行建模并指定路径延迟。全加器功能描述可参考《Verilog 教程》的 3.1 节内容。实例//单 bit 全加器指定路径延迟module full_adder1(input Ai, Bi, Ci,output So, Co);assign So Ai ^ Bi ^ Ci ;assign Co (Ai Bi) | (Ci (Ai | Bi));specify(Ai, Bi, Ci * So) 1.1 ;(Ai, Bi * Co) 1.3 ;(Ci Co) 1.2 ;endspecifyendmodule//8bit 位宽加法器例化module full_adder8(input [7:0] a , //adder1input [7:0] b , //adder2input c , //input carry bitoutput [7:0] so , //adding resultoutput co //output carry bit);wire [7:0] co_temp ;full_adder1 u_adder0(.Ai (a[0]),.Bi (b[0]),.Ci (c1b1 ? 1b1 : 1b0),.So (so[0]),.Co (co_temp[0]));genvar i ;generatefor(i1; i7; ii1) begin: adder_genfull_adder1 u_adder(.Ai (a[i]),.Bi (b[i]),.Ci (co_temp[i-1]),.So (so[i]),.Co (co_temp[i]));endendgenerateassign co co_temp[7] ;endmodule8bit 位宽的触发器描述如下。触发器中指定路径延迟并加入建立时间和保持时间的时序检查。建立时间设置为 2ns保持时间设置为 3ns。实例module D8(input [7:0] d ,input clk ,output reg [7:0] q);always (posedge clk)q d ;specify$setup(d, posedge clk, 2);$hold(posedge clk, d, 3);(d,clk * q) 0.3 ;endspecifyendmodule在 testbench 里完成乘以 15 的操作并在一个周期内输出给下一级寄存器。实例timescale 1ns/1nsmodule test ;reg [3:0] a ;reg [3:0] b ;wire [3:0] so ;wire co ;parameter CYCLE_10NS 10ns;reg clk ;initial beginclk 0 ;# 111 ;forever begin#(CYCLE_10NS/2) clk ~clk ;endend//需要乘以 15 的数reg [7:0] num 0 ;always (posedge clk) beginnum[3:0] num[3:0] 1 ;end// num * 8 num * 4wire [7:0] adder1 ;full_adder8 u1_adder8(.a (num2),.b (num3),.c (1b0),.so (adder1),.co ());//num * 2 numwire [7:0] adder2 ;full_adder8 u2_adder8(.a (num1),.b (num),.c (1b0),.so (adder2),.co ());//num x 15wire [7:0] adder3 ;full_adder8 u3_adder8(.a (adder1),.b (adder2),.c (1b0),.so (adder3),.co ());//store the resultwire [7:0] res_mul15 ;D8 data_store(.d (adder3),.clk (clk),.q (res_mul15));initial beginforever begin#100;if ($time 1000) $finish ;endendendmodule // test仿真报告中则出现了带有 setup/hold violation 的打印信息部分截图如下。截取出现 violation 时间的波形图如下所示。分析如下(1) 建立时间和保持时间均出现了 violation虽然仿真中变量 num 乘以 15 以后延迟一个时钟周期的输出结果是正确的但实际电路是很危险的。(2) 波形中信号的建立时间 166-164.4 1.6 ns小于设置的 2ns所以会报告 violation。(3) 波形中信号的保持时间 168.2-166 2.2 ns小于设置的 3ns所以会报告 violation。(4) 图中红色部分是信号 d 变化的中间过程因为信号各 bit 延迟不同所以中间可能会出现多个不同的结果。时序优化保持时间的时序优化在 RTL 层级描述上一般不好控制这属于后端设计工程师的工作范畴这里不做讨论。本次主要简单探讨建立时间不满足约束条件时的优化问题。由上一节《3.3 建立时间和保持时间》中可知建立时间约束表达式为Tcq Tcomb Tsu Tclk Tskew 1Tcq: 寄存器 clock 端到 Q 端的延迟Tcomb data path 中的组合逻辑延迟Tsu: 建立时间Tclk: 时钟周期Tskew: 时钟偏移。优化此不等式可从以下几个方面考虑(1) 选取时序较好的工艺原件其 Tcq 和 Tsu 值越小越好(2) 优化组合逻辑使组合逻辑延迟 Tcomb 越小越好(3) 降低工作时钟频率增大工作时钟周期 Tclk(4) 增加时钟偏移 Tskew但时钟偏移过大又会造成其他问题例如保持时间可能不满足功能逻辑错误等。从 RTL 层次进行时序优化时只能考虑方法23。例如将上述仿真中的工作时钟周期由 10ns 改为 20ns则不会出现 setup violation。或者调整逻辑一个周期内完成 3 次加法运算改为分散到两个周期内完成中间增加一级寄存器进行缓冲来减少时序上的压力。同时变量 num 的变化周期也应该变为原来的 2 倍时长。testbench 修改如下实例timescale 1ns/1nsdefine LOGIC_BUFmodule test ;parameter CYCLE_10NS 10ns;reg clk ;initial beginclk 0 ;# 111 ;forever begin#(CYCLE_10NS/2) clk ~clk ;endendreg slow_flag 0 ;always (posedge clk) beginifdef LOGIC_BUFslow_flag ~slow_flag ;elseslow_flag 1b1 ;endifendreg [7:0] num 0 ;always (posedge clk) beginif(slow_flag)num[3:0] num[3:0] 1 ;endwire [7:0] adder1 ;full_adder8 u1_adder8(.a (num2),.b (num3),.c (1b0),.so (adder1),.co ());wire [7:0] adder2 ;full_adder8 u2_adder8(.a (num1),.b (num),.c (1b0),.so (adder2),.co ());// for better time//adding bufferwire [7:0] adder1_r, adder2_r ;D8 adder1_buf(.d (adder1),.clk (clk),.q (adder1_r));D8 adder2_buf(.d (adder2),.clk (clk),.q (adder2_r));ifdef LOGIC_BUFwire [7:0] adder1_t adder1_r ;wire [7:0] adder2_t adder2_r ;elsewire [7:0] adder1_t adder1 ;wire [7:0] adder2_t adder2 ;endifwire [7:0] adder3 ;full_adder8 u3_adder8(.a (adder1_t),.b (adder2_t),.c (1b0),.so (adder3),.co ());wire [7:0] res_mul15 ;D8 data_store(.d (adder3),.clk (clk),.q (res_mul15));initial beginforever begin#100;if ($time 1000) $finish ;endendendmodule // test此时仿真报告中不再有 violation仿真截图如下。由图可知信号提前到达并保持不变的时间可达 8.6 ns完全满足建立时间的时序要求。此种方法的根本原理是将信号多次变化的时序分散在多个周期内来满足时序约束的要求。此外流水线设计并行设计等都可以优化时序。$recovery, $removal建立时间和保持时间的概念都是出现在同步电路的设计中。对于异步复位的触发器来说异步复位信号也需要满足 recovery time恢复时间和 removal time去除时间才能有效的复位和释放复位防止出现亚稳态。释放复位时复位信号在时钟有效沿来临之前就需要提前一段时间恢复到非复位状态这段时间为 recovery time。类似于同步时钟下触发器的 setup time。复位时复位信号在时钟有效沿来临之后还需要在一段时间内保持不变这段时间为 removal time。类似于同步时钟下触发器的 hold time。recovery 与 removal time 示意图如下所示。系统任务 $recovery 与 $removal 分别用于 recovery 和 removal time 的检查用法如下$recovery (ref_event, data_event, recovery_limit) ;ref_event: 用于检查的参考信号一般为清零或复位信号跳变沿data_event: 被检查的信号一般为时钟信号跳变沿。recovery_limit设置的最小 recovery time。当 ref_event (reset) data_event (clock) 且 T(data_event - ref_event) recovery_limit 时即复位信号在时钟信号到来之前如果不满足 recovery time则报告中会打印 violation。$removal (ref_event, data_event, removal_limit) ;ref_event: 用于检查的参考信号一般为清零或复位信号跳变沿data_event: 被检查的信号一般为时钟信号跳变沿。removal_limit设置的最小 removal time。当 ref_event (reset) data_event (clock) 且 T(ref_event - data_event) removal_limit 时即复位信号在时钟信号到来之后如果不满足 removal time则报告中会打印 violation。Verilog 提供了同时检查 revomal 和 recovery 的系统任务$recrem (ref_event, data_event, recovery_limit, removal_limit);$width, $period有些数字设计例如 flash 存储器还需要对脉冲宽度或周期进行检查为此 Verilog 分别提供了系统任务 $width 和 $period。用法如下$width(ref_event, time_limit) ;ref_event: 边沿触发事件time_limit: 脉冲的最小宽度$width 用于检查边沿触发事件 ref_event 到下一个反向跳变沿之间的时间常用于脉冲宽度的检查。如果两次相反跳边沿之间的时间小于 time_limit则会报告 violation。$period(ref_event, time_limit) ;$period 用于检查边沿触发事件 ref_event 到下一个同向跳变沿之间的时间常用于时钟周期的检查。如果两次同向跳边沿之间的时间小于 time_limit则报告中会打印 violation。检查信号 CLK 宽度和周期的 specify 块描述如下实例specify$width(posedge CLK, 10);$period(posedge CLK, 20);endspecify

相关文章:

12、Verilog 时序检查

关键词: setup hold recovery removal width period 指定路径延迟,目的是让仿真的时序更加接近实际数字电路的时序。利用时序约束对数字设计进行时序仿真,检查设计是否存在违反(violation)时序约束的地方,…...

eBay API调用避坑大全:从Postman调试到生产环境部署的5个关键点

eBay API调用避坑大全:从Postman调试到生产环境部署的5个关键点 第一次调用eBay API时,我花了整整三天时间才让第一个请求成功返回数据。这不是因为文档不够详细,而是那些隐藏在角落里的"魔鬼细节"——比如一个空格、一个编码错误、…...

书匠策AI:解锁毕业论文写作新姿势,让学术探索变得轻松又有趣!

在学术的广阔天地里,毕业论文如同一座巍峨的山峰,让无数即将毕业的学生既心生敬畏又满怀期待。面对这座山峰,有人踌躇满志,也有人望而却步。但别担心,今天我要给大家介绍一位学术界的“超级英雄”——书匠策AI&#xf…...

安卓工控嵌入式主板接线与设置全攻略:17 年工控人亲测避坑指南

大家好,我是广东一家工控厂商的阿强,从事工业计算机主板研发生产已经 17 个年头了。随着工业物联网和智能制造的快速发展,安卓工控嵌入式主板已经成为自助终端、商业显示、智能安防、医疗设备等领域的首选核心部件。相比 X86 架构的工业主板&…...

深入ZStack OSAL:手把手解析任务调度与事件处理机制(以ZStack 2.5.1a为例)

深入ZStack OSAL:手把手解析任务调度与事件处理机制(以ZStack 2.5.1a为例) 在ZigBee协议栈开发中,操作系统抽象层(OSAL)扮演着核心角色,它通过模拟多任务环境,让开发者能够在资源受限的嵌入式系统中实现复杂…...

NR/5G - 从波束赋形到系统消息:SSB/SIB1/SI/Paging调度全链路解析

1. 5G波束赋形:让信号学会"精准导航" 想象一下演唱会现场,歌手如果对着全场观众均匀喊话,后排听众可能听不清内容。但如果歌手能转向不同区域逐一演唱,每个方向的听众都能获得最佳听觉体验——这就是波束赋形&#xff0…...

【C++ 入门精讲4】内存管理、auto、decltype等C++11新特性(附代码)

前言本篇笔记整理本人手写代码及对应知识点,涵盖C内存动态管理(new/delete、operator new等)、C11新特性(auto、decltype、增强for循环、nullptr、using)、字符串操作等内容,所有内容均来自代码注释&#x…...

2025届毕业生推荐的AI学术工具实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在生成式人工智能应用里头,过度过分依赖结构化指令常常会致使导致输出呈现模式化…...

倒计时72小时!2026奇点大会AI迁移白皮书核心章节泄露:4类不可逆语法腐化场景与编译器级防护方案

第一章:2026奇点智能技术大会:AI代码迁移 2026奇点智能技术大会(https://ml-summit.org) 迁移挑战与范式跃迁 传统人工主导的代码重构在异构平台(如从TensorFlow 1.x迁移到JAX或PyTorch 2.x)中面临语义鸿沟、控制流重写与算子映…...

Steam Achievement Manager完整教程:快速掌握成就管理终极指南

Steam Achievement Manager完整教程:快速掌握成就管理终极指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager&…...

ComfyUI ControlNet Aux完整指南:30+预处理器一键配置与高效AI绘画控制方案

ComfyUI ControlNet Aux完整指南:30预处理器一键配置与高效AI绘画控制方案 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 还在为AI绘画中的细…...

Qt Creator 美化插件踩坑记:解决 clang-format 中文注释报错与路径配置的那些“坑”

Qt Creator 美化插件实战:clang-format 中文注释与路径配置的深度排雷指南 当你在Qt Creator中第一次尝试用clang-format美化代码时,满心期待按下快捷键后,终端却突然抛出"error: Got empty plain scalar"的红色警告——这种从云端…...

源代码论文分享|做“系统设计与实现”类题目时,真的很需要这种成套资料!

很多人做课程设计、毕业设计时,最难的不是“不会写”,而是不知道一篇完整的“系统设计与实现”到底该长什么样:论文怎么展开,代码怎么组织,功能怎么落地,截图和结构图放到哪里才顺。 我自己当年做这类题目的…...

**发散创新:基于Python与Flask的智慧城市交通流量实时监测系统设计与实现*

发散创新:基于Python与Flask的智慧城市交通流量实时监测系统设计与实现 在智慧城市建设中,交通管理智能化是提升城市运行效率的核心环节之一。本文将围绕一个典型应用场景——城市主干道车流密度动态感知与预警机制,使用 Python Flask Redi…...

别再死记硬背了!我用这3个真实项目案例,帮你吃透Vue3和React高频面试题

从真实项目出发:用3个案例彻底掌握Vue3和React高频面试题 在技术面试中,最让候选人头疼的往往不是"怎么做",而是"为什么这么做"。当面试官问"Vue3的Composition API解决了什么问题"时,背诵官方文档…...

LabVIEW网络通讯实现FX3U无程序网络通讯,支持MC协议,稳定安全、简便易用的开发代写程...

LabVIEW网络网口TCP通讯三菱PLC FX3U ENET-ADP,MC协议网络通讯FX3U网络通讯。 官方MC协议,报文读取,安全稳定。 程序代开发,代写程序。 通讯配置,辅助测试。 FX3U无程序网络通讯实现。 常用功能一网打尽。 1.命令帧读写…...

安卓玩机工具推荐------资深安卓玩家修改分区表工具 操作步骤解析

在手机维修与定制系统刷入的领域中,系统分区的操作一直是个技术活,尤其是随着手机存储技术的飞速发展,GPT(GUID Partition Table)分区表因其对大容量存储设备的良好支持,逐渐成为手机系统分区的主流方案。然…...

【UnityEditor】运行时动态监控场景模型面数与顶点数

1. 为什么需要实时监控模型面数与顶点数 在Unity项目开发中,3D模型的性能开销主要来自两个方面:顶点数和面数。顶点数决定了GPU需要处理的几何数据量,而面数则直接影响渲染调用次数。我遇到过不少项目,明明场景看起来很简单&#…...

Buuctf N1BOOK [第二章 web进阶]文件上传:从源码泄露到条件竞争漏洞的实战利用

1. 源码泄露与文件上传逻辑分析 打开题目页面,首先注意到页面底部直接暴露了PHP源代码。这种源码泄露在CTF比赛中很常见,通常意味着出题人故意留给我们分析漏洞的线索。仔细阅读代码会发现几个关键点: 文件上传功能使用标准的PHP $_FILES处理…...

PyTorch迁移学习翻车实录:修改SqueezeNet分类头时遇到的‘RuntimeError’及完整修复方案

PyTorch迁移学习实战:SqueezeNet分类头修改陷阱与深度解决方案 迁移学习是深度学习领域的重要技术,但即使是经验丰富的开发者,在修改预训练模型分类头时也可能遭遇意想不到的陷阱。最近在使用SqueezeNet进行图像分类任务时,我遇到…...

别再让用户干等了!Spring Boot + SSE 手把手实现大模型流式对话(附完整前后端代码)

Spring Boot SSE 实战:构建大模型流式对话系统的完整指南 想象一下这样的场景:用户在你的知识库系统中输入问题,等待答案时盯着空白的屏幕,手指无意识地敲击桌面。五秒、十秒过去了,页面依然一片空白。这种等待体验在…...

语音模块避坑指南:从命令词表到固件升级的9个关键步骤

语音模块开发实战:从命令词配置到固件优化的全流程精要 在智能硬件开发领域,语音交互模块的集成往往成为项目成败的关键分水岭。不同于简单的API调用,完整的语音解决方案涉及声学模型训练、命令词表设计、播报音管理、固件打包等十余个技术环…...

你的Mask数据集规范吗?Labelme标注避坑指南与质量检查脚本分享

Labelme标注实战:从数据规范到模型效果提升的全流程指南 在计算机视觉项目中,标注数据的质量往往决定了模型性能的上限。许多团队投入大量资源进行数据采集和标注,却因为忽视标注规范而导致模型训练效果不佳。本文将深入探讨如何通过Labelme工…...

C++入门指南:从基础语法到核心特性全解析

1. C的第一个程序 C兼容C的绝大部分语法,因此C程序也可以在cpp文件中运行😊 这是一个非常便利的功能,毕竟在某些情况下printf和scanf是比cin和cout好用的 (eg:保留小数点,提高输入输出流效率… 对于.cpp…...

AI API 调不通怎么办?延迟高、被限流、鉴权报错的 3 种解决方案实测

调用 GPT-5、Claude Opus 4.6 这些主流大模型 API 时,遇到连接超时、延迟飙到几秒甚至十几秒、频繁 429 限流、或者各家鉴权协议不统一导致对接成本高的问题,核心解决思路有三个:优化网络链路和请求策略、做多模型 fallback 容灾、直接用 API…...

从MATLAB到Tecplot:手把手教你搞定复杂非结构网格(含FEPolygon/FEPolyhedron)的数据转换

从MATLAB到Tecplot:复杂非结构网格数据转换的工程实践指南 在工程仿真和科学计算领域,数据可视化是理解复杂现象的关键环节。MATLAB作为强大的数值计算工具,常被用于生成各类仿真数据,而Tecplot则是专业工程师首选的科学可视化软件…...

避坑指南:Cadence网表导入PCB时的7个关键检查点(以PMU6050封装为例)

避坑指南:Cadence网表导入PCB时的7个关键检查点(以PMU6050封装为例) 在电子设计自动化(EDA)领域,从原理图到PCB的网表导入环节往往是工程师的"痛点高发区"。特别是当项目复杂度上升或团队协作时&…...

应对MathWorks合规审查的专项准备工作

弄啥整MathWorks合规审查的专项准备工作想抢许可可被拒,这是啥原因?你是不光是时常遇见此情况:工程师准备开工,结果一打开MATLAB就提示“无可用许可”?明明去年还买了不少,现在用不了,一查是签了…...

从原型到量产:基于RK3326PX30的嵌入式Android/Linux双系统开发实战指南

1. 认识你的开发伙伴:RK3326&PX30原型机 第一次拿到Q1这样的开发板时,我差点被它小巧的体型骗了。这块巴掌大的板子搭载的RK3326/PX30芯片组,可是能同时驱动两个1080P屏幕的狠角色。记得去年做智能零售终端项目时,就是靠它实现…...

从外卖配送轨迹到共享单车路径:详解uniapp中高德地图Polyline的三种实战用法

从外卖配送轨迹到共享单车路径:详解uniapp中高德地图Polyline的三种实战用法 在移动互联网时代,地图轨迹可视化已成为众多应用的核心功能。无论是外卖小哥的实时配送路线,还是共享单车的骑行轨迹回放,亦或是物流运输的多段路径展…...