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

    文章

    69

    浏览量

    13382
  • 引脚
    +关注

    关注

    16

    文章

    1045

    浏览量

    48970
  • 时序
    +关注

    关注

    5

    文章

    357

    浏览量

    36961
  • 路径
    +关注

    关注

    0

    文章

    49

    浏览量

    12454
  • 逻辑模块
    +关注

    关注

    0

    文章

    3

    浏览量

    1453
收藏 人收藏

    评论

    相关推荐

    嵌入式C语言中的goto语句详解

    goto语句被称为C语言中的跳转语句。用于无条件跳转到其他标签。它将控制权转移到程序的其他部分。
    发表于 07-19 16:08 1626次阅读
    嵌入式C语言中的goto<b class='flag-5'>语句</b><b class='flag-5'>详解</b>

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

    在C语言中,有三种条件判断结构:if语句、if-else语句和switch语句
    发表于 08-18 16:36 1017次阅读
    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>

    Verilog中的always内的语句执行的速度?

    Verilog中的always内的语句执行的速度是什么样的,如果always是时钟上升沿触发的,会不会语句还未执行完,而下一个时钟上
    发表于 10-29 22:30

    begin ...... end 与 fork ...... join 语句的 区别 ------ 转载

    按照界定不同分为两种:(1)begin……end,用来组合需要顺序执行的语句,被称为串行。例如:parameter d = 50; reg[7:0] r; begin //由一系列延迟产生的波形
    发表于 06-02 21:31

    【FPGA学习】VHDL并行语句有哪些 VHDL并行语句怎么写

    VHDL 不仅仅提供了一系列的顺序语句,同样也提供了很多并行语句。在 VHDL 中,并行语句主要包括以下几种:• 进程(PROCESS)语句;•
    发表于 09-13 10:14

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

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

    【梦翼师兄今日分享】 generate语句的讲解

    本帖最后由 mengyi1989 于 2019-12-7 13:08 编辑 写在前面的话在设计中,很多情况下我们需要编写很多结构相同但参数不同的赋值语句或逻辑语句,当参数量很大的情况下,原始
    发表于 12-04 10:33

    51单片机c语言常用语句详解

    51单片机c语言常用语句详解,关于51单片机C编程 return语句的使用案例:函数写法1: u8 is_timeout(tick start_time, tick interval
    发表于 07-20 06:34

    如何解决if条件判断为真但不执行if语句的问题

    关于if条件判断为真但不执行if语句的问题,我一直也还不是很清楚是什么原因造成的。在网上查看了一些网友的评论但回答也不是非常的准确,或者说每个人遇到的情况都略有不同。我是在调试开发板的时候遇到两类
    发表于 12-15 08:24

    开关语句和循环语句

    switch/case开关语句是一种多分支选择语句,是用来实现多方向条件分支的语句。虽然从理论上讲采用条件语句也可以实现多方向条件分支,但是当分支较多时会使条件
    发表于 07-15 14:26 18次下载

    详解SCL语句如何赋值

    当一个值被指定,变量的当前值被通过表达式指定的新的值代替。此表达式也能够包含函数标识符,其被语句激活,然后返回相应的值(返回值)。
    的头像 发表于 04-16 09:43 1w次阅读
    <b class='flag-5'>详解</b>SCL<b class='flag-5'>语句</b>如何赋值

    带初始化的if和switch语句详解

    在上面的代码中,初始化语句是int s = check()。s的生命周期是整个if语句,这里也包含else语句
    的头像 发表于 10-14 10:50 1016次阅读

    详解Python条件语句

    在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。
    的头像 发表于 04-19 15:39 577次阅读

    Python中什么是语句

    条件判断 语句块 什么是语句块呢? 语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组
    的头像 发表于 09-12 16:41 631次阅读

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模和设计。Assign语句用于连续赋值,而Always
    的头像 发表于 02-22 16:24 491次阅读