登录站点

用户名

密码

specify verilog延时

已有 219 次阅读  2012-03-08 10:53   标签延时 
specify  verilog延时

检查时序的方式之一是时序仿真,在仿真过程中计算与该模块相关的延迟值;之二是静态时序验证。

(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

注:

Specify 块用于描述从模块的输入到输出的通路延时以及设置和保持时间的定时限制。指定的块允许对
设计的定时和设计的行为或结构分别进行描述。
语法
specify
    SpecifyItems...
endspecify


SpecifyItem = {either}
  Specparam
  PathDeclaration
 TaskEnable                          {只是定时检查}
PathDeclaration = {either}
 SimplePath = PathDelay;
 EdgeSensitivePath = PathDelay;
 StateDependentPath = PathDelay;
SimplePath = {either}
 ( Input,... [ Polarity] *> Output,...)             {满}
 ( Input [ Polarity] => Output)                     {并行}

EdgeSensitivePath = {either}
 ([ Edge] Input,... *> Output,... [ Polarity]: Expression)
 ([ Edge] Input => Output [ Polarity]: Expression)
StateDependentPath = {either}
 if ( Expression) SimplePath = PathDelay;
 if ( Expression) EdgeSensitivePath = PathDelay;
 ifnone SimplePath = PathDelay;
Input = {either}
 InputName
 InputName[ ConstantExpression ]
 InputName[ ConstantExpression: ConstantExpression ]
Output = {either}
 OutputName
 OutputName[ ConstantExpression ]
 OutputName[ ConstantExpression: ConstantExpression ]
Edge = {either} posedge negedge
Polarity = {either} + -
PathDelay = {either}
 ListOfPathDelays
 ( ListOfPathDelays)


ListOfPathDelays = {either}
 t
 t,t                         {上升、下降}
 t,t,t                       {上升、下降、关断}
 t,t,t,t,t,t                 {01,10,0Z,Z1,1Z,Z0}
 t,t,t,t,t,t,t,t,t,t,t,t     {01,10,0Z,Z1,1Z,Z0,0X,X1,1X,X0,XZ,ZX}
t = MinTypMaxExpression


在何处使用 
module-<HERE>-endmodule

规则 
• 路径从模块的输入开始,在模块的输出结束,而且模块内只有一个驱动。
• 满*> 或并行=> 连接在路径声明中描述。满连接表示所有从输入到输出的可能路径。并行连接表示一个指定输入的位到对应的指定输出的位。
• 在模块路径中可选的极性表示路径是反向的(正极)或不是反向的(负极);它不影响仿真但其他工具例如定时校验器可以使用。
• 跳变沿敏感的路径的数据表达式同样不会影响仿真。
• 基于状态的路径延时(SDPD)表达式可以只引用端口、常数和局部定义的寄存器或线网。一个有限的运算符集合在SDPD 表达式中有效:按位(~ & | ^ ^~ ~^ )、逻辑和相等(== != && || !)、归约(& | ^ ~& ~| ^~ ~^ )、并置、复制和条件({} {{}} ?: )。如果条件表达式为真,路径延时只影响路径。(SDPD 表达式中1 X 和Z 都被认为是真)。

• 如果没有if 的条件是真,ifnone 定义了默认的SDPD。 在相同的路径同时有ifnone SDPD 和简单的路径延时是非法的。
• 无条件路径的优先权比SDPD 路径高。
• 在不同的条件或不同的边沿(或两个跳变沿)的情况下相同路径的跳变沿敏感的SDPD 路径声明必须唯一。输出必须用相同的方法(整个端口、位选择或部分选择)在声明中引用。
• 如果模块包含指定的延时和分布式的延时(在门和UDP 实例和线网上),每条路径使用它们中的最大值.

合并
合并工具忽略或禁止指定的块。

注意 
• 并不是所有设备都支持列出的12 种路径延时。
• 路径目的地的规则比很多设备当前支持的规则灵活。


提示 
• 用指定的块描述库的单元的延时。请注意当建模库时如何计算延时。基于PLI 的延时计算器需要访问设计中所有单元指定块的信息。
• 用指定的块描述与定时检验或合并工具(支持指定的块)相连接的“黑盒”元件的定时。

举例
module M (F, G, Q, Qb, W, A, B, D, V, Clk, Rst, X, Z);
  input A, B, D, Clk, Rst, X;
  input [7:0] V;
  output F, G, Q, Qb, Z;
  output [7:0] W;
  reg C;

// 功能描述 ...
specify
  specparam TLH$Clk$Q = 3,
                  THL$Clk$Q = 4,
                  TLH$Clk$Qb = 4,
                  THL$Clk$Qb = 5,
                  Tsetup$Clk$D = 2.0,
                  Thold$Clk$D = 1.0;
// 简单路径,满连接
 (A, B *> F) = (1.2:2.3:3.1, 1.4:2.0:3.2);
// 简单路径,并行连接,正极
 (V + => W) = 3,4,5;
// 跳变沿敏感的路径,带极性
 (posedge Clk *> Q +: D) = (TLH$Clk$Q,THL$Clk$Q);
 (posedge Clk *> Qb -: D) = (TLH$Clk$Qb,THL$Clk$Qb);
// 基于状态的路径

if (C) (X *> Z) = 5;
if (!C && V == 8'hff) (X *> Z) = 4;
ifnone (X *> Z) = 6;                 // 默认SDPD X 到Z
// 定时检查
$setuphold(posedge Clk, D,
      Tsetup$Clk$D, Thold$Clk$D, Err);
endspecify
endmodule


历史上的今天:

test 2011-04-07
操作符 2011-04-07
简单的code 2011-04-07

收藏到:Del.icio.us

上一篇: Memory Interface Grouping Assignment 下一篇: 硬盘价格快跌了。。。

分享 举报