0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

specify块语句详解

CHANBAEK 来源:数字IC与好好生活的两居室 作者:除夕之夜啊 2023-03-30 11:42 次阅读

路径延迟用关键字 specify 和 endspecify 描述,关键字之间组成 specify 块语句。

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

specify 块语句主要有以下功能:

指定所有路径中引脚到引脚的延迟;

定义 specparam 常量;

在电路中设置时序检查。

并行连接

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

并行连接用法格式如下:

(=>) =;

一个带有路径延迟的 4 输入的与逻辑模块模型描述如下:

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 ;
   endspecify


   wire         an1, an2 ;
   and          (an1, a, b);
   and          (an2, c, d);
   and          (out, an1, an2);
endmodule

可以用关键字 specparam 在 specify 块中定义延迟数值常量,然后赋值给路径延迟。

specparam 定义的常量只能在 specify 块内部使用。

specify
      specparam 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

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

module paral_conn(
    input [3:0]         d,
    output [3:0]        q);




   specify
      (d => q) = 3 ;
   endspecify




   assign q = d & 0101 ;
endmodule

其中,specify 块语句也可以展开描述,两种表达方式是等效的。

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

全连接

在全连接中,源引脚中的每一位与目标引脚的每一位相连接。

源引脚和目的引脚的连接是组合遍历的,且不要求位宽对应。

全连接用法格式如下:

(*>) =;

例如 4 输入的与逻辑模块可以描述如下:

module and4(
   output       out,
   input        a, b, c, d);


   specify
      (a,b *> out) = 2.5 ;
      (c,d *> out) = 3.5 ;
   endspecify


   wire         an1, an2 ;
   and          (an1, a, b);
   and          (an2, c, d);
   and          (out, an1, an2);
endmodule

边沿敏感路径

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

用法举例如下:

//在 clk 上升沿,从 clk 到 out 的路径上升延迟为 1,下降延迟为 2
    //从 inout 的数据路径是同向的,即 out = in
    (posedge clk => (out +: in)) = (1,2);

    //在 clk 下降沿,从 clk 到 out 的路径上升延迟为 1,下降延迟为 2
    //从 inout 的数据路径是反向的,即 out = ~in
    (negedge clk => (out -: in)) = (1,2);

    //clk 任意变化时,从 clk 到 out 的路径上升延迟为 1,下降延迟为 2
    //从 inout 的数据路径是不可以预知的,同向、反向或不变
    (negedge clk => (out : in)) = (1,2);

条件路径

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

条件中的操作数可以是标量,也可以是向量,条件表达式也可以包含任意操作符。

需要注意的是,应当只使用 if 语句将条件路径中所有的输入状态都完整的声明。 没有声明的路径会使用分布延迟,分布延迟也没有声明的话,将使用零延迟。 如果路径延迟和分布延迟同时声明,将选择最大的延迟作为路径延迟。

但是 specify 中的 if 语句不能使用 else 结构,可以使用 ifnone 描述条件缺省时的路径延迟。

specify
      if (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 个,2 个,3 个,6 个, 12 个,其他数量的延迟值都是错误的。

下面举例说明门延迟模型中路径延迟的表示方法。

//1参数:上升、下降、关断延迟只使用一个延迟参数
   specify
      specparam t_delay = 1.5 ;
      (clk => q) = t_delay ;
   endspecify
   //2 个参数: 上升延迟(0->1, z->1, 0->z)= 1.5
   //         下降延迟(1->0, z->0, 1->z)= 2
   specify
      specparam t_rise = 1.5, t_fall = 2 ;
      (clk => q) = (t_rise, t_fall) ;
   endspecify

   //3 个参数: 上升延迟(0->1, z->1)= 1.5
   //         下降延迟(1->0, z->0)= 2
   //         关断延迟(1->z, 0->z)= 1.8
   specify
      specparam t_rise = 1.5, t_fall = 2, t_turnoff = 1.8 ;
      (clk => q) = (t_rise, t_fall, t_turnoff);
   endspecify


   //6 个参数:分别对应0->1, 1->0, 0->z, z->1, 1->z, z->0
   specify
      specparam t_01 = 1.5, t_10 = 2,   t_0z = 1.8 ;
      specparam t_z1 = 2,   t_1z = 2.2, t_z0 = 2.1 ;
      (clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0) ;
   endspecify
   //12 个参数:分别对应0->1, 1->0, 0->z, z->1, 1->z, z->0
   //                 0->x, x->1, 1->x, x->0, x->z, z->x
   specify
      specparam t_01 = 1.5, t_10 = 2,   t_0z = 1.8 ;
      specparam t_z1 = 2,   t_1z = 2.2, t_z0 = 2.1 ;
      specparam t_0x = 1.1, t_x1 = 1.2, t_1x = 2.1 ;
      specparam t_x0 = 2,   t_xz = 2  , t_zx = 2.1 ;


      (clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0,
                    t_0x, t_x1, t_1x, t_x0, t_xz, t_zx) ;
   endspecify

门路径延迟模型中,也可以指定最大值、最小值和典型值。

//上升、下降和关断延的延迟值:min: typical: max
   specify
      specparam t_rise    = 1:1.5:1.8;
      specparam t_fall    = 1:1.8:2 ;
      specparam t_turnoff = 1.1:1.2:1.3 ;
      (clk => q) = (t_rise, t_fall, t_turnoff);
   endspecify

X 传输延迟

如果没有指定 x 转换时间的延迟(门路径延迟中没有给出 12 个延迟参数),则规定:

从 x 转换为已知状态的延迟时间为,可能需要的最大延迟时间;

从已知状态转换为 x 的延迟时间为,可能需要的最小延迟时间。

例如,当门路径延迟中给出 6 个延迟参数时,则 x 传输延迟时间定义如下表所示:

x 转换 延迟值
0->x 最小(t_01、t_0z)
1->x 最小(t_10、t_1z)
Z->X 最小(t_z1、t_z0)
x->0 最大(t_10、t_z0)
X->1 最大(t_01、t_z1)
X->Z 最大值(t_1z, t_0z)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 延迟
    +关注

    关注

    1

    文章

    70

    浏览量

    13511
  • 引脚
    +关注

    关注

    16

    文章

    1179

    浏览量

    50255
  • 时序
    +关注

    关注

    5

    文章

    385

    浏览量

    37268
  • 路径
    +关注

    关注

    0

    文章

    50

    浏览量

    12483
  • 逻辑模块
    +关注

    关注

    0

    文章

    5

    浏览量

    1472
收藏 人收藏

    评论

    相关推荐

    C语言中if语句、if-else语句和switch语句详解

    在C语言中,有三种条件判断结构:if语句、if-else语句和switch语句
    发表于 08-18 16:36 1.2w次阅读
    C语言中if<b class='flag-5'>语句</b>、if-else<b class='flag-5'>语句</b>和switch<b class='flag-5'>语句</b><b class='flag-5'>详解</b>

    【FPGA学习】Verilog HDL的语句应该怎么写

    Verilog HDL 在执行语句时分为顺序和并行两种方式。在顺序语句中,语句按给定次序顺序执行;在并行语句
    发表于 09-25 09:22

    Java复合语句的资料说明

    同C语言或其他语言相同,Java语言的复合语句是以整个区为单位的语句,所以又称语句。复合语句
    发表于 03-22 08:00 2次下载
    Java复合<b class='flag-5'>语句</b>的资料说明

    Verilog的两种语句解析

    1. 语句有两种,一种是 begin-end 语句, 通常用来标志()执行的语句;一种是 fork-join 语句,通常用来标志()执行的
    的头像 发表于 06-18 15:16 3023次阅读

    Verilog的语句

    begin_end顺序,用于将多条语句组成顺序语句按顺序一条一条执行(除了带有内嵌延迟控制的非阻塞赋值语句),每条
    的头像 发表于 05-18 10:29 1348次阅读

    Verilog的语句fork...join 和 begin...end

    begin_end顺序,用于将多条语句组成顺序语句按顺序一条一条执行(除了带有内嵌延迟控制的非阻塞赋值语句),每条
    的头像 发表于 06-09 10:30 3136次阅读

    systemverilog的决策语句if…else语句介绍

    决策语句(Decision statements)允许程序的执行流程根据设计中信号的当前值分支到特定语句
    的头像 发表于 10-21 08:58 3061次阅读

    决策语句允许程序的执行流程

    SystemVerilog case语句与C switch语句类似,但有重要区别。SystemVerilog不能使用break语句(C使用break从switch语句的分支退出)。ca
    的头像 发表于 10-27 08:57 882次阅读

    SystemVerilog中的always语句

    “always”关键字意味着这个语句“总是”一直执行。大多数时候“always”后面跟一个边沿事件或者延迟。
    的头像 发表于 12-06 09:47 2352次阅读

    什么是SystemVerilog-决策语句-if-else语句

    决策语句(Decision statements)允许程序的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else
    的头像 发表于 02-09 14:15 1096次阅读
    什么是SystemVerilog-决策<b class='flag-5'>语句</b>-if-else<b class='flag-5'>语句</b>?

    Verilog中的If语句和case语句介绍

    我们在上一篇文章中已经看到了如何使用程序(例如 always 来编写按顺序执行的 verilog 代码。 我们还可以在程序中使用许多语句来控制在我们的verilog设计中信
    的头像 发表于 05-11 15:37 4294次阅读
    Verilog中的If<b class='flag-5'>语句</b>和case<b class='flag-5'>语句</b>介绍

    详解Verilog赋值语句语句、条件语句

    不可综合语句经常用在测试文件中,未注明的语句均是可综合的
    的头像 发表于 07-02 10:47 6916次阅读
    <b class='flag-5'>详解</b>Verilog赋值<b class='flag-5'>语句</b>、<b class='flag-5'>块</b><b class='flag-5'>语句</b>、条件<b class='flag-5'>语句</b>

    Python中什么是语句

    条件判断 语句 什么是语句呢? 语句是在条件为真(条件
    的头像 发表于 09-12 16:41 954次阅读

    Python条件和条件语句

    if语句 对于if语句,若条件判定为真,那么后面的语句就会被执行。若条件判定为假,语句就会被
    的头像 发表于 09-12 16:45 571次阅读

    单片机if是什么语句

    单片机中的if语句是一种条件语句,用于根据不同的条件执行不同的代码。在程序执行过程中,条件语句用来决定是否执行特定的代码段。在单片机编程中,if
    的头像 发表于 01-05 14:04 1622次阅读