(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
原文链接:
http://www.eefocus.com/lubee/blog/12-02/239054_deda6.html