三、11【Verilog HDL】时序和延迟

前言

参考书籍:《Verilog HDL 数字设计与综合》第二版,本文档为第10章的学习笔记。

本章将探讨Verilog中如何控制和定义时序

学习目标

  • 了解分布延迟、集总延迟和路径延迟
  • specify关键字设置路径延迟
  • 输入输出引脚间的并行连接和全连接
  • specify块中用specparam语句定义参数
  • 条件路径延迟(状态依赖路径延迟)
  • rise、fall和turn-off延迟,理解如何设置min、max和typ值
  • 为时序检查定义系统任务,$setup, $hold, $width
  • 理解延迟反标

10.1 延迟模型的类型

1、分布延迟

         在每个独立元件的基础上进行定义,在每条语句上添加延迟#,两种建模方式:一种是将延迟赋值给独立的门;另一种是在单独的assign语句中指定延迟值。

and #10 a1(out, in1, in2); assign #10 e = a & b;

2、集总延迟

        在每个独立模块的基础上定义的,将整个电路的最大延迟作用于最后的输出门延迟上。

3、路径延迟

引脚到引脚的时序说明

10.2 路径延迟建模

10.2.1 specify块

关键字specifyendspecify之间给路径延迟赋值,块中不能包含其他块(initial、always)等。

  • 给穿过模块的所有路径指定引脚到引脚的时序延迟
  • 在电路中设置时序检查
  • 定义specparam常量
//引脚到引脚的延迟
specify
    (a => out) = 9;
    (b => out) = 9;
    (c => out) = 11;
    (c => out) = 11;
endspecify

10.2.2 specify块内部

并行连接

用法:(<source_field>  =>  <destination_field>) = <deay_value>;

<source_field>和<destination_field>的位宽必须相同

全连接

用法:(<source_field>  *>  <destination_field>) = <deay_value>;

每一个源域都要和目标域连接,因此位数可以不同。

specify
    (a,b *> out) = 9;
    (c,d *> out) = 11;
endspecify

边沿敏感路径

(posedge clock => (out +: in))= (10:8);             上升延迟10,下降延迟8

specparam声明语句

在specify块内定义参数常量

specify
    specparam d_to_q = 9;
    (d => q) = d_to_q ;
endspecify

条件路径延迟

条件表达式可以包含任意逻辑操作符、位操作符等,if语句中不能使用else结构。条件路径延迟又称状态依赖路径延迟(SDPD)。

specify
    if(a) (a => out) = 9;
    if(a & b) (b => out) = 9;
    if({c,d} == 2'b01) (c,d *> out) = 11;
endspecify

上升、下降和关断延迟

//上升延迟0->1, z->1
//下降延迟1->0, z->0
//关断延迟0->z, 1->z
specparam t-rise=9, t_fall = 13, t_turnoff = 11;
(clk => q) =(t-rise, t_fall, t_turnoff);

最小最大和典型延迟值

表达形式:“min:type:max”

specparam t-rise=8:9:10, t_fall = 12:13:14, t_turnoff = 10:11:12;
(clk => q) =(t-rise, t_fall, t_turnoff);

处理x状态转换

10.3 时序检查

指定路径延迟的目的是以比门延迟更高的精度仿真实际数字电路的时序。通过系统任务:$setup , $hold , $width。所有时序检查只能用在specify块里

10.3.1 $setup和$hold检查

用来检查设计中时序元件的建立保持约束。在时序元件(如边沿触发器)中,建立时间是数据必须在有效时钟边沿之前到达的最小时间,保持时间是数据在有效时钟边沿之后保持不变的最小时间。

$setup

//设置时间检查
//clock作为参考信号,data是被检查的信号
//如果(Tposedge_clk - Tdata) < 3,则报告违反约束
specify
    $setup(data, posedge clock, 3);
endspecify

$hold

//设置时间检查
//clock作为参考信号,data是被检查的信号
//如果(Tdata - Tposedge_clk) < 5,则报告违反约束
specify
    $hold(posedge clock, data, 5);
endspecify

10.3.2 $width检查

检查脉冲宽度是否满足最小宽度要求

//设置宽度检查
//clock的上升沿正跳变作为reference_event
//clock的下一个下降沿负跳变作为data_event
//如果(Tdata - Tclk) < 6,则报告违反约束
specify
    $width(posedge clock, 6);
endspecify

10.4 延迟反标注

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐者-桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值