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)。
//------------------------------------------------------------------------------
一、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;
//------------------------------------------------------------------------------
二、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,-)。
//------------------------------------------------------------------------------
三、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),它可以抑制持续信号比传播延时短的输入信号的变化。
例1:1ns宽度的窄脉宽通过一个传输延时为2ns的BUFFER
两个脉宽限制值: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、使用仿真器专用的编译指导。比如VCS,+pulse_r/20(取20%)和+pulse_e/80(取80%),需要注意的是,这个选项要求放在读入RTL网表文件之后,否则设置无效。
3、使用SDF文件反标,并且SDF文件中的延时信息具有最高的优先级。SDF文件格式将在后面介绍。
脉冲过滤限制的默认格式存在两个缺点:
1、X状态的持续时间比较短。
2、在上升延时和下降延时不相等的情况下,如果脉冲过窄,那么可能出现跟随边缘(trailing edge)先于或等于导引边缘(leading edge)的现象,这时就会淹没X状态。
可以通过修改默认格式,加以改善,具体如下:
on-event vs on-detect:
negative width pulse detection:
需要注意的是,showcancelled list_path_of_outputs,必须在模块路径之前使用,才可以约束到该模块路径。
////////////////////////////////////////////////////////////////////////////////
第三个任务,时序检查(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
////////////////////////////////////////////////////////////////////////////////
SDF文件简述:
SDF文件包含指定路径延时(specify path delay),参数值(specparam values),时序检查约束(timing check constraints),互连线延时(interconnect delay),以及一些和仿真不相关的说明信息。反标SDF文件的过程,也算是更新specify block相对应信息的过程,如果SDF文件没有包含某些信息,则参考specify block中的相应信息。
SDF时序信息在CELL内部描述,可以包含一个或多个DELAY、TIMINGCHECK和LABEL。DELAY部分包含指定路径的传播延时(specify path delay)和互连线延时(interconnect delay);TIMINGCHECK部分包含时序检查约束信息(timing check constraint);LABEL部分包含新的参数值(specparam)。
DELAY部分:
例1:SDF文件:(IOPATH in out (1.1::1.3) (1.5::1.7));
verilog specify path:(in => out) = (2, 3);
例2:SDF文件:(COND en==1'b1 (IOPATH in out (1.2) (1.6));
verilog specify path:if (en) (in => out) = (1, 2);
例3:互连线延时:(INTERCONNECT source_port load_port delay_values)
SDF文件:(INTERCONNECT u1/out u2/in (1.2::1.4) (1.4::1.6));
TIMINGCHECK部分:
例4: SDF文件: (SETUP (posedge data) (posedge clk) (3::4));
(HOLD (posedge data) (posedge clk) (1::2));
verilog timing checks: $setup (posedge data, posedge clk, 1);
$hold (posedge clk, posedge data, 2);
例5: SDF文件: (SETUP (posedge data) (COND rb==1'b1 (posedge clk)) (3::4));
(HOLD (posedge data) (COND rb==1'b1 (posedge clk)) (1::2));
verilog timing checks: $setup (posedge data, posedge clk &&& rb, 1);
$hold (posedge clk &&& rb, posedge data, 2);
LABEL部分:
例6:
SDF文件:(LABEL
(ABSOLUTE
(dh 60)
(dl 40)))
verilog文件:specparam dh = 60, dl=40;
SDF文件反标是一个有序的过程,这就意味着对于同一对source/load,后续的信息可能修改(INCREMENT)或者覆盖(ABSOLUTE)前面已经声明过的信息,这在反标($sdf_annotate)多个SDF文件时,就很可能发生的。
例7:覆盖前面的延时信息
(DELAY
(ABSOLUTE
(IOPATH A Z (1) (2))
(IOPATH A Z (2) (3))))
from:https://blog.csdn.net/u014703817/article/details/47334693
verilog specify的更多相关文章
- Verilog学习笔记简单功能实现(二)...............全加器
先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有: Xi Yi Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...
- Verilog HDL模型的不同抽象级别
所谓不同的抽象类别,实际上是指同一个物理电路,可以在不同层次上用Verilog语言来描述.如果只从行为功能的角度来描述某一电路模块,就称作行为模块.如果从电路结构的角度来描述该电路模块,就称作结构模块 ...
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- Verilog学习笔记基本语法篇(十一)········ 常用系统函数
1)系统任务:$monitor 格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- system verilog中的跳转操作
在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...
- system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)
类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...
- 一段比较有意思的代码——介绍system verilog中的新增幅值语句
system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...
- system verilog的一些总结(从其他博客复制来的)
转载自 http://blog.sina.com.cn/s/blog_e7fec2630101f5t9.html SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 136 ...
随机推荐
- 面试官:如何实现LRU?你学会了吗?
面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...
- golang web源码解析
Go的web工作原理 在Go中使用及其简单的代码即可开启一个web服务.如下: //开启web服务 func test(){ http.HandleFunc("/", sayHel ...
- VSCode——滚动鼠标控制字体大小
第一步:找到设置 文件-->首选项-->设置 第二步:打开settings.json文件 第三步:在settings.json文件中添加 "editor.mouseWheelZo ...
- Appium问题解决方案(6)- Java堆栈错误:java.lag.ClassNotFoundException:org.eclipse.swt.widets.Control
背景 运行脚本出现 SWT folder '..\lib\location of your Java installation.' does not exist. Please set ANDROID ...
- KMP算法中的几个疑问
KMP算法next数组求解实现 首先我们通过应用场景将KMP算法中用到的名词做一个说明: 在一个字符串(string1)中查询是否存在另一个字符串(string2). 在字符串匹配算法中,我们通常将字 ...
- openswan协商流程之(四):main_inI2_outR2()
主模式第四包:main_inI2_outR2 1. 序言 main_inI2_outR2()函数是ISAKMP协商过程中第四包的核心处理函数的入口,同时在此处理流程中已经获取到足够的隧道信息,可以生成 ...
- C语言实现任务调度与定时器
代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码.基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务. 1. schedule.c代码(自己添加了main函数,用来 ...
- Node.js躬行记(9)——微前端实践
后台管理系统使用的是umi框架,随着公司业务的发展,目前已经变成了一个巨石应用,越来越难维护,有必要对其进行拆分了. 计划是从市面上挑选一个成熟的微前端框架,首先选择的是 icestark,虽然文档中 ...
- Hearthbuddy跳过ConfigurationWindow窗口
Hearthbuddy版本为按照上一条博客修复后的版本. 打开Hearthbuddy后会弹出一个这样的窗口: 这个界面没有什么用,而且也没有人对此进行任何修改. 由于之前折腾版早就已经把这个界面跳过了 ...
- java短信群发项目:
编写一个项目, 1. 以下手机号码段,添加到Map集合当中 2. 从控制台输入要发送信息的短信号码,如果要发送多个,请用英文逗号隔开,输入短信内容 3. 编写一个短信发送类,号码发送前,先判断号码是否 ...