Verilog中延时和时序检查

  • 1. 延时模型
    • 1.1 分布延迟
    • 1.2 集总延迟
    • 1.3 路径延迟
  • 2. specify 语法
    • 2.1 指定路径延时
      • 基本路径延时
      • 边沿敏感路径延时
      • 状态依赖路径延时
    • 2.2 时序检查
      • $setup, $hold, $setuphold
      • $recovery, $removal, $recrem
      • $width, $period
      • notifier


1. 延时模型


真实的逻辑元器件和它们之间的互连线上都会有延时的存在。虽然 Verilog 设计主要考虑的是逻辑功能的正确性,但是 Verilog 语法是支持定义延时的。

Verilog 中延时模型有三种:分布延迟、集总延迟(lumped) 和路径延迟。


1.1 分布延迟

分布延迟指的是给电路中每个独立的元件进行延迟定义,不同的路径有不同的延时,如下图所示。

在这里插入图片描述

对应的 verilog 描述为:

// 例化逻辑门单元的时候指定延时
module and4(output       out,input        a, b, c, d);wire         an1, an2 ;and #1       (an1, a, b);and #2       (an2, c, d);and #1.5     (out, an1, an2);
endmodule// assign 语句中指定延时
module and4(output       out,input        a, b, c, d);wire         an1, an2 ;assign #1    an1 = a & b ;assign #2    an2 = c & d ;assign #1.5  out = an1 & an2 ;
endmodule

1.2 集总延迟

集总延迟是将全部路径累计的延时集中到最后一个门单元上。

到最后一个门单元上的延迟会因路径的不同而不同,此时取最大延时作为最后一个门单元的延时。

将上述分布延迟图转化为集总延迟图,如下所示。

在这里插入图片描述

对应的 verilog 描述如下:

module and4(output       out,input        a, b, c, d);wire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and #3.5     (out, an1, an2); //set the max delay at the last gate
endmodule

1.3 路径延迟

路径延迟是对每个输入引脚到每个输出引脚的所有路径指定延迟时间。

在这里插入图片描述

路径延迟模型需要使用 specify 关键字来定义,上图对应的 verilog 描述如下所示:

module and4(output       out,input        a, b, c, d);specify(a => out) = 2.5 ;(b => out) = 2.5 ;(c => out) = 3.5 ;(d => out) = 3.5 ;endspecifywire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and          (out, an1, an2);
endmodule

2. specify 语法


Verilog 中的路径延迟使用 specify 块语句来描述,从 specify 为开始,到 endspecify 结束。

specify 是 module 中独立的一部分,不能出现在其他语句块(initial, always 等)中。

specify 块语句的主要功能是:指定所有路径中引脚到引脚的延迟、在电路中设置时序检查。


2.1 指定路径延时


基本路径延时


specify 块语句有两种基本的语法来定义延时:

方法一: 并行连接,每条路径都有一个源引脚和目的引脚,将这些路径的延迟依次用 specify 语句描述出来。

基本语法为:

(<source_io> => <destination_io>) = <delay_value>;

一个带有路径延时的 4 输入与门的 verilog 描述如下:

module and4(output       out,input        a, b, c, d);specify(a => out) = 2.5 ;(b => out) = 2.5 ;(c => out) = 3.5 ;(d => out) = 3.5 ;endspecifywire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and          (out, an1, an2);
endmodule

在使用 specify 定义路径延时的时候,也可以定义参数,如下所示:

specifyspecparam ab_2_out = 2.5 ;specparam cd_2_out = 3.5 ;(a => out) = ab_2_out ;(b => out) = ab_2_out ;(c => out) = cd_2_out ;(d => out) = cd_2_out ;
endspecify

需要注意的是,specparam 只能在 specify 内部声明及使用,而 parameter 只能在 specify 语句块的外部声明及使用。

在并行连接中,源引脚和目的引脚是一一对应的。并行连接也支持多位宽信号间的路径延迟描述,但是位宽必须保持一致。

module paral_conn(input [3:0]         d,output [3:0]        q);specify(d => q) = 3 ;endspecifyassign q = d & 0101 ;
endmodule

上例的路径延时定义等价于:

specify(d[0] => q[0]) = 3 ;(d[1] => q[1]) = 3 ;(d[2] => q[2]) = 3 ;(d[3] => q[3]) = 3 ;
endspecify

方法二: 全连接,源引脚中的每一位与目标引脚的每一位相连接。源引脚和目的引脚的连接是组合遍历的,且不要求位宽对应。

基本语法为:

(<multiple_source_io> *> <multiple_destination_io>) = <delay_value> ;

如下所示,4 输入的与逻辑模块的路径延时可以为:

module and4(output       out,input        a, b, c, d);specify(a,b *> out) = 2.5 ;(c,d *> out) = 3.5 ;endspecifywire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and          (out, an1, an2);
endmodule

边沿敏感路径延时


边沿敏感路径延时用于对时序电路的输入到输出延迟进行建模,需要使用边缘标识符指明触发条件。如果没有指明的话,任何变化都会触发源引脚到目的引脚的延迟值的变化。

示例1:

(posedge clk => (out +: in)) = (1,2);

在 clk 的上升沿,对于从 clk 到 out 的路径,其上升延时是 1,下降延时是 2。+: 的意思是 in 到 out 的数据路径是同向传输,即 out = in。

示例2:

(negedge clk => (out -: in)) = (1,2);

在 clk 的下降沿,对于从 clk 到 out 的路径,其上升延时是 1,下降延时是 2。-: 的意思是 in 到 out 的数据路径是反向传输,即 out = ~in。

示例3:

(negedge clk => (out : in)) = (1,2);

clk 的任何变化,从clk到out的模块路径,其上升延时是1,下降延时是2,从in到out的数据路径的传输是不可预知的,同向或者反向或者不变。


状态依赖路径延时


Verilog 也允许模型中根据信号值的不同,有条件的给路径延迟进行不同的赋值。

一个简单的示例如下所示:

specifyif (a)    (a => out) = 2.5 ;if (~a)   (a => out) = 1.5 ;if (b & c)        (b => out) = 2.5 ;if (!(b & c))     (b => out) = 1.5 ;if ({c, d} == 2'b01)(c,d *> out) = 3.5 ;ifnone    (c,d *> out) = 3 ;
endspecify

需要注意的是:

  1. if语句的操作数可以是标量,也可以是向量,条件表达式也可以包含任意操作符;
  2. 所有输入状态都应该说明,否则没有说明的路径使用分布延时,如果也没有声明分布延时的话,那么使用零延时(zero delay)。如果路径延时和分布延时同时声明的话,则选择最大的延时作为路径延时;
  3. 可以使用ifnone语句,在其它所有条件都不满足的情况下,说明一个缺省的状态依赖路径延时。

2.2 时序检查


使用 specify 指定路径延迟之后,可以让仿真的时序更加接近实际数字电路的时序。

除此之外,specify 还可以定义一些系统任务,用来进行时序检查。

Verilog 中常用的用于时序检查的系统任务包括:$setup, $hold, $recovery, $removal, $widt, $period,这些系统任务只能在 specify 块中调用。


$setup, $hold, $setuphold


$setup 用来进行建立时间检查,$hold 用来进行保持时间检查,基本语法格式如下:

$setup(data_event, reference_event, limit, notifier);

data_event:被检查的信号,判断它是否违反约束

reference_event:用于检查的参考信号,一般为时钟信号的跳变沿

limit:最小建立时间

当 reference_event time - limit < data_event time < reference_event time 的时候,仿真的时候会打印出 Timing Violation 的报告。

$hold (reference_event, data_event, limit, notifier);

当 reference_event time < data_event time < reference_event time + limit 的时候,仿真的时候会报告 Hold Timing Violation。

这里需要注意的是,$setup$hold 中输入端口的位置是不一样的。setup 检查中,数据要先到,hold 检查中,数据要晚走,所以可以按照事件的事件顺序来记忆。

此外,Verilog 还提供了同时检查setup 和 hold 的系统任务:

$setuphold (reference_event, data_event, setup_limit, hold_limit, notifier)

该系统函数等价于:

$setup(data_event, reference_event, setup_limit, notifier);
$hold (reference_event, data_event, hold_limit, notifier);

当 reference_event time - setup_limit < data_event time < reference_event time + hold_limit 的时候,仿真的时候会报时序违例。


$recovery, $removal, $recrem


对于异步复位的触发器来说,异步复位信号也需要满足 recovery time(恢复时间)和 removal time(去除时间),才能有效的复位和释放复位,防止出现亚稳态。

$recovery, $removal, $recrem 的基于语法如下:

$recovery (reference_event, data_event, limit, notifier);

reference_event:用于检查的参考信号,一般为清零或复位信号跳变沿;

data_event:被检查的信号,一般为时钟信号跳变沿。

limit:设置的最小 removal time。

当data_event time - limit(clk) < reference_event time(async rst) < data_event time(clk) 时,就会报告recovery time violations。

$removal (reference_event, data_event, limit, notifier);

当 data_event time < reference_event time < data_event time + limit时,就会报告removal time violations。

$recrem (reference_event, data_event, recovery_limit, removal_limit, notifier)

$width, $period


有些数字设计,例如 flash 存储器,还需要对脉冲宽度或周期进行检查,为此 Verilog 分别提供了系统任务 $width$period。用法如下:

$width (ref_event, time_limit, notifier);$period(ref_event, time_limit, notifier);

ref_event:边沿触发事件
time_limit:脉冲的最小宽度

这里data_event是隐含的,它等于reference_event的相反边沿。

$width 用于检查边沿触发事件 ref_event 到下一个反向跳变沿之间的时间,常用于脉冲宽度的检查。如果两次相反跳边沿之间的时间小于 time_limit,则会报告 violation。

$period 用于检查边沿触发事件 ref_event 到下一个同向跳变沿之间的时间,常用于时钟周期的检查。如果两次同向跳边沿之间的时间小于 time_limit,则报告中会打印 violation。

在这里插入图片描述


notifier


任意一条 timing check 语句检测到timing violation发生时,对应的 timing check 语句就会把 notifier 的值做一次 toggle。

notifier 的初始默认值是 x,第1次 timing violation 时,notifier 的值会从x变为0或1。后续每发生一次 timing violation,notifier 的值也会被做一次toggle。如果旧值为0,则新值为1。如果旧值为1,则新值为0。

notifier 的 toggle,会导致寄存器的Q端变为 x。

如下图所示,notifier 是 dff 的一个输入端口,当前发生任意跳变的时候,dff 的输出都将变为 x 态。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96478.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96478.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96478.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DigitalOcean Gradient AI平台现已支持OpenAI gpt-oss

OpenAI 的首批开源 GPT 模型&#xff08;200 亿和 1200 亿参数&#xff09;现已登陆 Gradient AI 平台。此次发布让开发者在构建 AI 应用时拥有更高的灵活度和更多选择&#xff0c;无论是快速原型还是大规模生产级智能体&#xff0c;都能轻松上手。新特性开源 GPT 模型&#xf…

藏在 K8s 幕后的记忆中枢(etcd)

目录1&#xff09;etcd 基本架构2&#xff09;etcd 的读写流程总览a&#xff09;一个读流程b&#xff09;一个写流程3&#xff09;k8s存储数据过程源码解读4&#xff09;watch 机制Informer 机制etcd watch机制etcd的watchableStore源码解读5&#xff09; k8s大规模集群时会存在…

腾讯云EdgeOne安全防护:快速上手,全面抵御Web攻击

为什么需要专业的安全防护&#xff1f; 在当今数字化时代&#xff0c;网站面临的安全威胁日益增多。据统计&#xff0c;2023年全球Web应用程序攻击超7千亿次&#xff0c;持续快速增长。 其中最常见的包括&#xff1a; DDoS攻击&#xff1a;通过海量请求使服务器瘫痪Web应用攻…

SpringBoot中的条件注解

文章目录前言什么是条件注解核心原理常用条件注解详解1. ConditionalOnClass和ConditionalOnMissingClass2. ConditionalOnBean和ConditionalOnMissingBean3. ConditionalOnProperty应用场景&#xff1a;多数据源配置在SpringBoot自动配置中的核心作用自动配置的工作原理经典自…

LightGBM时序预测详解:从原理到 PSO 参数优化

前言 在时间序列预测领域&#xff0c;集成学习方法一直占据重要地位。此前我们介绍了基于传统集成思想的时序预测方法&#xff08;查看前文&#xff09;&#xff0c;而梯度提升树&#xff08;GBDT&#xff09;作为集成学习的佼佼者&#xff0c;在时序预测中表现尤为突出。本文…

django生成迁移文件,执行生成到数据库

当报错时 重新拉取git&#xff0c;重新生成迁移文件&#xff0c;重新执行 1、生成迁移文件 python manage.py makemigrations 子应用2、执行建表、建字段、修改字段 python manage.py migrate 子应用3、当手动已经在数据库创建字段时&#xff0c; 用 --fake 标记迁移为 “已应用…

2025软件供应链安全技术路线未来趋势预测

软件供应链安全已从一个技术圈的议题演变为全球企业的治理焦点。近几年&#xff0c;APT渗透、恶意包植入、开发者误操作等不同类型的供应链安全事件频发&#xff0c;使得“安全的代码来源”和“可信的交付链路”成为企业数字化转型的生命线。2025年的软件供应链安全&#xff0c…

用户登录Token缓存Redis实践:提升SpringBoot应用性能

前言在现代Web应用中&#xff0c;用户认证和授权是至关重要的功能。传统的基于数据库的Token存储方式虽然简单易用&#xff0c;但在高并发场景下容易成为性能瓶颈。本文将介绍如何将SpringBoot项目中的用户Token从数据库存储迁移到Redis缓存&#xff0c;显著提升系统性能。一、…

深度解析Structured Outputs:让AI输出严格遵循JSON Schema的结构化响应

深度解析Structured Outputs&#xff1a;让AI输出严格遵循JSON Schema的结构化响应 引言 在现代应用开发中&#xff0c;JSON 是最流行的数据交换格式之一。为了提升 API 接口的健壮性和数据一致性&#xff0c;结构化输出&#xff08;Structured Outputs&#xff09;成为了大模…

关于 微服务中服务注册与发现 的详细说明,涵盖主流框架/解决方案的对比、核心功能、配置示例及总结表格

以下是关于 微服务中服务注册与发现 的详细说明&#xff0c;涵盖主流框架/解决方案的对比、核心功能、配置示例及总结表格&#xff1a;1. 服务注册与发现的核心概念 服务注册与发现是微服务架构的基础能力&#xff0c;主要解决以下问题&#xff1a; 服务注册&#xff1a;服务实…

08高级语言逻辑结构到汇编语言之逻辑结构转换 continue break 完结汇编按逻辑结构

目录 &#x1f4da; 1. continue 语句的原理与实现 &#x1f6e0; 1.1 continue 语句的基本概念 ⚙️ 1.2 底层原理 &#x1f4d6; 1.3 案例分析&#xff1a;跳过偶数&#xff0c;累加奇数 &#x1f680; 2. break 语句的原理与实现 &#x1f6e0; 2.1 break 语句的基本概…

AI出题人给出的Java后端面经(二十二)(日更)

链接双端链表 前一篇&#xff1a;AI出题人给出的Java后端面经&#xff08;二十一&#xff09;&#xff08;日更&#xff09; 后一篇&#xff1a;null 目录 &#x1f535; 一、Java基础&#xff08;集合/流式/OOP&#xff09; 答案&#xff1a; 题目1&#xff1a;集合遍历性…

AI赋能体育训练突破:AI动作捕捉矫正精准、战术分析系统提效率,运动员破瓶颈新路径

传统体育训练长期受限于 “动作矫正依赖教练主观判断”“战术分析滞后于赛场变化”“运动员体能分配凭经验摸索” 的难题&#xff0c;而 AI 技术的深度介入&#xff0c;正让体育训练从 “经验驱动” 转向 “数据驱动”&#xff0c;既能实时捕捉动作偏差&#xff0c;又能动态优化…

【python实用小脚本-194】Python PNR一键查票:输入号码秒出座位状态——再也不用刷12306

Python PNR一键查票&#xff1a;输入号码秒出座位状态——再也不用刷12306 PNR查询, 实时座位, 离线脚本, 零广告, 瑞士军刀 故事开场&#xff1a;一把瑞士军刀救了赶火车的你 周五傍晚&#xff0c;你拎着行李冲向站台&#xff0c;手机信号一格&#xff0c;12306 死活刷不出座位…

【python】python进阶——推导式

目录 一、推导式介绍 二、推导式的用法 2.1 列表推导式 2.2 字典推导式 2.3 集合推导式 2.4 生成器表达式 三、推导式的嵌套和复杂用法 3.1 嵌套推导式 3.2 多重条件推导式 四、推导式对比传统循环 4.1 性能比较 4.2 可读性比较 五、常见应用场景 5.1 数据清…

数字安全隐形基石:随机数、熵源与DRBG核心解析与技术关联

前言&#xff1a;数字安全的 “隐形基石” 在数字化浪潮席卷全球的今天&#xff0c;从金融交易的密钥生成到区块链的共识机制&#xff0c;从量子通信的加密协议到智能汽车的身份认证&#xff0c;随机数如同空气般渗透在信息系统的每一个安全节点。然而&#xff0c;看似简单的 …

TDengine IDMP 最佳实践

最佳实践 IDMP 提供了一强大的数据建模能力&#xff0c;让数据标准化、情景化&#xff0c;从而可以更好地利用 AI 技术&#xff0c;从数据中挖掘出业务价值&#xff0c;但数据建模本身是一个很难用 AI 完成的事情。 为最大程度减少建模的成本&#xff0c;TDengine 推荐在数据…

8.20网络编程——sqlite3数据库

文章目录一、思维导图二、学生管理系统1、myhead.h2、代码三、牛客网刷题一、思维导图 二、学生管理系统 1、myhead.h #ifndef __MYHEAD_H__ #define __MYHEAD_H__#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>#d…

电脑不能访问服务器磁盘,连不上服务器。解决办法:在窗口中输入 regedit 确定即可打开注册表,。。。。0改为1,确认;

打开注册表&#xff1a; 按键盘上的 WinR 键&#xff0c;打开运行窗口&#xff0c;在窗口中输入 regedit 确定即可打开注册表。&#xff08;或者直接在左下角搜索框中搜索“注册表”&#xff09; 依次打开以下目录 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service…

EP4CE40F23I7N Altera FPGA Cyclone IV E

EP4CE40F23I7N 阿尔特拉 Altera Cyclone IV E 系列的一颗中等密度、低功耗 FPGA&#xff0c;通信接口与工业控制等应用。该器件采用成熟的工艺制程&#xff0c;器件规模约为 39k 左右的逻辑单元&#xff08;Logic Elements&#xff09;&#xff0c;由若干逻辑阵列块&#xff08…