specify
检查时序的方式之一是时序仿真,在仿真过程中计算与该模块相关的延迟值;之二是静态时序验证。
(1)延迟类型
分布延迟:在每个独立的元件基础上定义一种建模方式是将延迟值赋给独立的门,
另一种是在单独的assign语句中指定延迟值。
集总延迟:定义在每个独立模块基础上,表面看来像是模块输出门的当延迟。它比分布延迟更容易建模。
引脚到引脚(即路径)的延迟:分别把延迟赋给模块中从每个输入到每个输出之间的所有路径。
因此可以针对每条输入/输出路径分别指定延迟。对大规模电路而言,它比分布延迟更容易建模,
设计者只需了解模块的输入输出引脚,无需了解模块内部。
(2)路径延迟
specify块:
模块路径延迟:在模块的源引脚和目标引脚之间的延迟;在关键字specify和endspecify之间给路径延迟赋值。
块中包含:给穿过模块的所有路径指定引脚到引脚的时序延迟,在电路中设置时序检查,定义specparam常量。
例:
module M(out,a,b,c,d);
output out;
input a,b,c,d;
wire e,f;
specify
(a=>out)=9;
(b=>out)=9;
(c=>out)=11;
(d=>out)=11;
endspecify
and a1(e,a,b);
and a2(f,c,d);
and a3(out,e,f);
endmodule
specify块是块中一个独立部分,不在任何其他模块(如initial或always)内出现,内部语句含义必须非常明确。specify块内部:
并行连接:每条路径语句都有一个源域和一个目标域,每一位都对应相连,如果是向量必须是相同的位数,如例中(source=>destination)=<delay_value>;
全连接:位对位连接,如果源和目标是向量,则不必位数相同,即类似于交叉相连;用法为:
(souce*>destination)=delay_value;例:
wire [31:0] e;
wire [15:0] f;
specify
(a,b *> out)=9;
(c,d *> out)=11;
(e *> f)=9; //相当于32×16=352条并行连接语句的功能;
endspecify
边沿敏感连接:用于输入到输出延迟的时序建模,仅当源信号上出现特定边沿时才有用。例:
(posedge clock=>(out +: in))=(10:8); //时钟到输出信号用去上升延迟10,数据路径从in到out下降延迟8;
specparam声明语句:用在specify块中声明特殊参数,为了方便给延迟赋值;例:
specify
specparam d_to_q =9;
specparam clk_to_q =11;
(d=>q)=d_to_q;
(clk=>q)=clk_to_q;
endspecify
条件路径延迟:if句表示,又称状态依赖路径延迟,如:
if (a) (a=>out) =9;
if (~(a&c)) (b=>out) =10;
if ({c,d}==2'b01) (c,d *> out)=13;//拼接操作
上升、下降和关断(turn-off)延迟:可给任意路径定义1个、2个、3个、6个或12个延迟参数,其他个数都是错误的;且必须严格按顺序定义;参数有:
t_rise,t_fall,t_turnoff,t_delay,t_01,t_10,t_0z,t_z1,t_1z,t_z0,t_0x,
t_x1,t_1x,t_x0,t_xz,t_zx;例:
specparam t_delay=11;
(clk=>q)=t_delay;
specparam t_rise=9,t_fall=13,t_turnoff=11;//上升过程0\z->1,
(clk=>q)=(t_rise,t_fall,t_turnoff); //下降过程1\z->0,关断过程0\1->z
specparam t_01=9,t_10=13,t_0z=11,t_z1=9,t_1z=11,t_z0=13,t_0x=4,
specparam t_x1=13,t_1x=5,t_x0=9,t_xz=11,t_zx=7;
(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); //必须严格按照顺序指定延迟参数
最小值、最大值和典型延迟值:每个延迟可指定3种形式的值min:typ:max,如:
specparam t_rise=8:9:10=11,t_fall=12:13:14,t_turnoff=10:11:12;
(clk=>q)=(t_rise,t_fall,turnoff);
处理x状态转换:若没有显示的指定x转换的延迟,则保守的方法规定:
:从x到已知状态转换应当消耗可能的最大时间;
:从已知状态到x态转换应当消耗可能的最小时间;
(3)时序检查系统任务进行时序检查。$setup,$hold,$width;都只能在specify块里。
·$setup和$hold,用来检查设计中时序元件的建立和保持约束。
建立时间,是数据必须在有效时钟边沿之前到达的最小时间;
保持时间,是数据在有效时钟边沿之后保持不变的最小时间。用法:
$setup (被检查的信号,用于检查的参考信号,需要的最小建立时间);
如果(T检-T被检查)<建立时间,则报告违反约束。如:
specify
$setup (data,posedge clk,3);
endspecify
$hold (reference,data,limit);
若(Tdata-Tref)<limit,则报告违反约束。如:
specify
$hold (posedge clr,data,5);
endspecify
·$width,检查脉冲宽度是否满足最小宽度要求;用法:
$width(信号的边沿跳变,脉冲最小宽度);
不显示指定data,它是ref信号的下一个反响跳变沿;若(Tdata-Tref)<limit,则报告违反约束。如:
specify
$width(posedge clk,6);
endspecify
相关阅读
通过仿真和综合认识T触发器(Verilog HDL语言描述T触发
这个系列的博文已经写过了两篇,分别是通过仿真和综合认识D触发器(Verilog HDL语言描述D触发器)和通过仿真和综合认识JK触发器(Verilog
对Verilog 初学者比较有用的整理(转自它处)********************************************************************************
目录 背景 测试一 Verilog HDL语言描述 测试代码 仿真波形图 测试二 Verilog HDL语言描述 测试代码 仿真图 ISE综合 RTL Schemati
你没有过这样的经历:当你制作的FPGA板卡与整机调试时,为了验证技术指标,可能需要对代码进行微调,这就需要你出不同的版本。那么按一个
在电路设计中经常会用到将电阻和电容正极连接,电阻另一端接上电源,电容负极接地。电阻和电容连接点为功能点,常用于延时驱动晶体管或