verilog specify语法

这篇具有很好参考价值的文章主要介绍了verilog specify语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

specify block用来描述从源点(source:input/inout port)到终点(destination:output/inout port)的路径延时(path delay),由specify开始,到endspecify结束,并且只能在模块内部声明,具有精确性(accuracy)和模块性(modularity)的特点。specify block可以用来执行以下三个任务:
一、描述横穿整个模块的各种路径及其延时。(module path delay)
二、脉冲过滤限制。(pulse filtering limit)
三、时序检查。(timing check)
specify block有一个专用的关键字specparam用来进行参数声明,用法和parameter一样,不同点是两者的作用域不同:specparam只能在specify block内部声明及使用,而parameter只能在specify block外部声明及使用

第一个任务:模块路径延时(module path delay)
一条模块路径可以是一条简单的路径(simple path),或者是一条边沿敏感的路径(edge sensitive path),或者是一条状态依赖的路径(state dependent path)

(1)simple path,可以由以下两种格式中的任意一种来声明:
1)、并行连接(patallel connection):source => destination
2)、全连接(full connection):      source *> destination
例:    (a, b => q, qn) = 1; 等价于:
            (a => q) = 1; (b => qn) = 1;
而(a, b *> q, qn) = 1; 等价于:
            (a => q) = 1; (b => q) = 1; (a => qn) = 1; (b => qn) = 1;

(2)edge sensitive path,是那些源点(source)使用边沿触发的路径,并使用边沿标示符指明触发条件(posedge/negedge),如果没有指明的话,那么就是任何变化都会触发终点(destination)的变化
例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:(clk => (out : in)) = (1,2);
        clk的任何变化,从clk到out的模块路径,其上升延时是1,下降延时是2,从in到out的数据路径的传输是不可预知的,同向或者反向或者不变。
Note:模块路径的极性(module path polarity):未知极性(unknown polarity,无),正极性(positive polarity,+),负极性(negative polarity,-)。

(3)state dependent path,是那些源点(source)以来指定条件状态的路径,使用if语句(不带else)在条件=1 or X or Z的情况下,认为条件成立。如果有一条路经,存在多个条件同时成立的情况,那么使用延时最小值的那条限制
例1: specify
        if(a)     (b => out) = (1,2);
        if(~a)    (b => out) = (2,3);
        if(b)     (a => out) = (1,2);
        if(~b)    (a => out) = (2,3);
      endspecify
例2: specify
        if(rst)   (posedge clk => (q +: data)) = (1,2);
        if(~rst)  (posedge clk => (q +: data)) = (2,3);
      endspecify
需要注意的是,所有输入状态都应该说明,否则没有说明的路径使用分布延时(distributed delay),如果也没有声明分布延时(distributed delay)的话,那么使用零延时(zero delay)。如果路径延时和分布延时同时声明的话,则选择最大的延时作为路径延时。另外,也可以使用ifnone语句,在其它所有条件都不满足的情况下,说明一个缺省的状态依赖路径延时
例3: specify
        (posedge clk => (q +: data)) = (1,2);
        ifnone (clk => q) = (2,3);
      endspecify

第二个任务,脉冲过滤限制(pulse filtering limit)
由于每条传播路径都具有一定的电容性和电阻性,电荷无法在一瞬间积累或消散,所以信号变化的物理特性是具有惯性的。为了更准确地描述这种能力,使用惯性延时(inertial delay),它可以抑制持续信号比传播延时短的输入信号的变化
 

        两个脉宽限制值:e-limit(error limit)和r-limit(rejection limit),并且要求e-limit >= r-limit,否则报错当pulse width >= e-limit时,输出相应的逻辑值;当e-limit > pulse width >= r-limit时,输出X值;当r-limit > pulse width时,输出不发生变化。默认情况下,e-limit = r-limit = module transition delay,也可以使用以下3种控制方式中的任意一种改变路径脉冲限制值:
1、使用verilog提供的PATHPULSE$参数,有些仿真器还要求同时使能相应的选项:比如VCS,添加+pathpulse选项。
          PATHPULSE$ = (<reject-limit>, <error-limit>);
          PATHPULSE$<path_source>$<path_destination> = (<reject-limit>, <error-limit>);
例:   specify
            (en => q) = 12;
            (data => q) = 10;
            (clr, pre *> q) = 4;
            specparam
            PATHPULSE$ = 3, PATHPULSE$en$q = (2,9), PATHPULSE$clr$q = 1;
        endspecify
            en => q的路径:reject-limit = 2, error-limit =9;
            clr => q和pre => q的路径:reject-limit = error-limit = 1;
            data => q的路径:reject-limit = error-limit = 3;
2、使用仿真器专用的编译指导。
3、使用SDF文件反标,并且SDF文件中的延时信息具有最高的优先级。SDF文件格式将在后面介绍。

脉冲过滤限制的默认格式存在两个缺点:
    1、X状态的持续时间比较短
    2、在上升延时和下降延时不相等的情况下,如果脉冲过窄,那么可能出现跟随边沿(trailing edge)先于或等于导引边沿(leading edge)的现象,这时就会淹没X状态

第三个任务,时序检查(timing check)
        描述设计要求的时序性能,所有的时序检查有一个参考事件(reference event)和一个数据事件(data event),它们通过一个布尔表达式相联接,还包括一个可选的notifier寄存器选项,这个寄存器用来打印错误信息或者传播X状态。
这里把时序检查分成两组来说明:
第一组,检查时序窗口的稳定性,包括:setup、hold、recovery和removal。
setup:$setup (data_event, reference_event, limit, notifier);
当reference_event time - limit < data_event time < reference_event time时,就会报告setup time violations。
hold:  $hold   (reference_event, data_event, limit, notifier);
当reference_event time < data_event time < reference_event time + limit时,就会报告hold time violations。
setup/hold:$setuphold (reference_event, data_event, setup_limit, hold_limit, notifier);
   $setuphold是$setup和$hold两者的联合。例如:
   $setuphold (posedge clk, negedge d, 2, 1, notifier); 等于
   $setup (negedge d, posedge clk, 2, notifier); 和 $hold (posedge clk, negedge d, 1, notifier);
数据事件常常是数据信号,而参考事件常常是时钟信号。
 

recovery:$recovery (reference_event, data_event, limit, notifier);
当data_event time - limit < reference_event time < data_event time时,就会报告recovery time violations。
removal: $removal (reference_event, data_event, limit, notifier);
当data_event time < reference_event time < data_event time + limit时,就会报告removal time violations。
recovery/removal:$recrem (reference_event, data_event, recovery_limit, removal_limit, notifier);
   $recrem是$recovery和$removal两者的联合。
   $recrem (posedge clr, posedge clk, 2, 3, notifier); 等于
   $recovery (posedge clr, posedge clk, 2, notifier); 和 $removal (posedge clr, posedge clk, 3, notifier);
数据事件常常是时钟信号,而参考事件常常是控制信号。
 

$setuphold和$recrem可以接受负值,同时需要激活仿真器的负值时序检查选项(比如VCS:+neg_tchk),同时还有一个限制:
   setup_limit + hold_limit > 仿真精度(simulation unit of precision),
   recovery_limit + removal_limit > 仿真精度(simulation unit of precision),
否则仿真器会把负值当成0处理。


第二组,检查时钟和控制信号在指定事件之间的时间间隔,包括:skew、width、period和nochange。
skew:$skew (reference_event, data_event, limit, notifier);  限制最大偏斜
    $skew (posedge clk1, posedge clk2, 1, notifier);
当data_event time - reference_event > limit,则会报告skew time violations。
$skew是基于事件(event-based)的,如果监测到一个reference_event,那么就开始评估脉宽,只要监测到一个data_event,就会生成相应的报告,直到监测到下一个reference_event,才重新开始新的监测。如果在监测到一个data_event之前,又监测到一个reference_event,那么就放弃本次评估,重新开始新的评估。
width:$width (controlled_reference_event, limit, threshold, notifier);  限制最小脉宽
           $width (posedge in, 2, notifier);
这里data_event是隐含的,它等于reference_event的相反边沿,当width < limit时,就会报告width time violations。
period:$period (controlled_reference_event, limit, notifier);  限制最小周期
           $period (negedge clk, 10, notifier);
这里data_event是隐含的,它等于reference_event的相同边沿,当period < limit时,就会报告period time violations。
nochange:$nochange (reference_event, data_event, start_edge_offset, end_edge_offset, notifier);
当leading reference event time - start_edge_offset < data_event < trailing reference event time + end_edge_offset时,就会报告nochange time violations。例如:
          $nochange (posedge clk, data, 0 , 0);
当在clk高电平期间,data发生任何变化,就会报告nochange time violations。

有时候,路径上的时序检查是在一定条件成立的前提下进行的,这就需要引入条件操作符:&&&。需要注意的是,当存在两个及以上的条件时,要求这些条件首先在specify块外部经过适当的组合逻辑产生一个新的控制信号,然后再引入到specify块内部使用。
例如:
    and u1 (clr_and_set, clr, set);
    specify
       $setup (negedge data, posedge clk &&& clr_and_set, 3, notifier);
    endspecify文章来源地址https://www.toymoban.com/news/detail-481151.html

到了这里,关于verilog specify语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Verilog的74HC138的三种描述方法

    一、实验目的: 分别用行为描述、数据流描述和结构描述三种方法描述74HC138,并分别进行仿真分析,同时对比综合出的RTL电路,总结每种综合电路的特点。 二、实验内容 1、行为描述: (1) 描述代码 (2)综合出的RTL电路 (3) 仿真分析 2、数据流描述: (1)描述代码 (

    2024年02月08日
    浏览(57)
  • Verilog写状态机的三种描述方式之三段式

    状态机的设计思路: 一是从状态机变量入手,分析各个状态的输入、状态转移和输出; 二是先确定电路的输出关系,再回溯规划每个状态的条件、输入等; 状态机的三要素是状态、输入和输出 , 根据状态机状态是否和输入条件相关,可以分为Moore型状态机(与输入无关)和

    2024年02月14日
    浏览(44)
  • 【Verilog】二、Verilog基础语法

    文章目录 前言 一、简单的Verilog知识 1.1、Verilog端口定义 1.2、Verilog的标识符 1.3、Verilog的逻辑值 1.4、Verilog的数字进制 1.5、Verilog的数据类型 1.5.1、reg型         1.5.2、wire型 1.5.3、参数类型 1.6、Verilog的运算符 1.6.1、算术运算符 1.6.2、关系运算符 1.6.3、逻辑运算符 1.6.4、条件

    2023年04月09日
    浏览(36)
  • Verilog中的force语句用来强制更改信号的值,特别适用于仿真和调试。本文将深入探讨force语句在FPGA开发中的应用和注意事项。

    Verilog中的force语句用来强制更改信号的值,特别适用于仿真和调试。本文将深入探讨force语句在FPGA开发中的应用和注意事项。 首先,我们需要了解force语句的语法。其基本格式为force [time] signal = value。其中,time是可选参数,表示在何时开始强制更改信号的值;signal是要更改的

    2024年02月12日
    浏览(95)
  • 【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化)

    众所周知,Verilog是作为一种HDL(Hardware Description Language,硬件描述语言)出现的,它的主要功能是在不同的抽象层级上描述电路,从而实现电路设计。那么到底该如何描述电路?Verilog提供了3种不同的方式: 结构化描述方式(结构模型,Structural Modeling) 数据流描述方式(数

    2024年01月18日
    浏览(55)
  • 【【典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一】】

    RAM是随机存储器,存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据,一般用来存储一些短时间内使用的程序和数据。 其内部结构如下图所示: 例:用Verilog HDL 设计深度为8,位宽为8的单端口RAM。 单口RAM,只有一套地址总线,读和写操作是分开的

    2024年02月12日
    浏览(52)
  • 【Verilog语法013】verilog多维数组(多维矩阵)的写法

    有两种表示方法:一种是verilog语法的多维数组,另一种是system verilog语法的多维数组。 reg [A1:A0] a [B1:B0] [C1:C0] [D1:D0] ; 引用顺序是:a[B][C][D][A], 定义的a 的左边只有位宽,一对方括号[],a的右边可以扩展维数,多对方括号[],变化速度:BCDA packed维度: packed数组是一种将1个向量

    2024年02月08日
    浏览(41)
  • notepad++的Verilog语法检查(调用modelsim的语法)

    一、在modelsim中新建一个工程,然后写一个Verilog代码,然后编译,目的是为了得到此工程文件夹下的work文件。打开此工程的文件夹,找到work文件夹,复制到notepad++的安装路径下。   (图1.是我自己在D盘创建的一个文件夹project_mux,用来存放步骤一modelsim生成的文件,图2.可以

    2024年02月12日
    浏览(49)
  • verilog语法中+:和-:用法

    verilog语法中+:和-:主要用来进行 位选择 。       位选择 从向量net、向量 reg、整数变量或时间变量中提取特定位。可以使用表达式寻址该位。如果位选择超出地址边界或位选择为 x 或 z,则引用返回的值应为 x。声明为实时或实时的变量的位选择或部分选择应被视为非法。

    2024年02月16日
    浏览(29)
  • 【Verilog语法简介】

    Verilog语言是一种用于建模电子系统的硬件描述语言,这种硬件描述语言最多的用于进行数字电路系统的寄存器传输级建模和验证工作,同时一些例如生物电路等数模混合电路的建模和验证电路。Verilog语言的语法规则与C语言有很多相似之

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包