目录
有两种hdl结构用来在结构模型(如 asic cell)中描述延时。
— 分布式延时,指定事件通过module内的gates和nets所需的时间。
— module 路径延时,描述事件从源端口(input port或inout port)传到目的端口(output port或inout port)所需的时间。
specify 块描述 module中的路径,以及这些路径上的delay,并可以做一些时序检查。
specify块语法如下,
specify_block ::=
specify { specify_item } endspecify
specify_item ::=
specparam_declaration
| pulsestyle_declaration
| showcancelled_declaration
| path_declaration
| system_timing_check
举例,
specify
specparam tRise_clk_q = 150, tFall_clk_q = 200; // 声明变量
specparam tSetup = 70;
(clk => q) = (tRise_clk_q, tFall_clk_q); // 描述路径,并把延时指定给对应路径
$setup(d, posedge clk, tSetup); // 时序检查
endspecify
路径声明
path_declaration包含三种类型的路径— 简单路径、沿敏感路径、状态依赖路径。
简单路径
简单路径包含下面两种形式,polarity是可选的,
— Source [polarity]*> destination // 全连接,source和destination都可以是信号的list。
— Source [polarity]=> destination // 一对一连接
举例,
(A => Q) = 10;
(B => Q) = (12);
(C, D *> Q) = 18;
下图描述了一对一连接和全连接的区别,
此处添加图片
示例如下,
module mux8 (in1, in2, s, q) ;
output [7:0] q;
input [7:0] in1, in2;
input s;
// Functional description omitted ...
specify
(in1 => q) = (3, 4) ;
(in2 => q) = (2, 3) ;
(s *> q) = 1;
endspecify
endmodule
(a, b, c *> q1, q2) = 10;
等同于
(a *> q1) = 10 ;
(b *> q1) = 10 ;
(c *> q1) = 10 ;
(a *> q2) = 10 ;
(b *> q2) = 10 ;
(c *> q2) = 10 ;
polarity表示信号从in传到out时是否会反向,示例如下,
// Unknown polarity, 这个时候不确定是否反向,source的上升/下降沿传到destination,可能是上升沿、下降沿或没有变化。
(In1 => q) = In_to_q ;
(s *> q) = s_to_q ;
// Positive polarity, source的上升沿传到dest,可能是上升沿或没有变化,source的下降沿传到dest,可能是下降沿或没有变化
(In1 +=> q) = In_to_q ;
(s +*> q) = s_to_q ;
// Negative polarity, source的上升沿传到dest,可能是下降沿或没有变化,source的下降沿传到dest,可能是上升沿或没有变化
(In1 -=> q) = In_to_q ;
(s -*> q) = s_to_q ;
沿敏感路径
在source端加上沿标识符 posedge 或 negedge就是沿敏感路径,只有指定沿跳变场景出现时,对应的delay才生效。
沿敏感路径也包括一对一连接和全连接。
举例,
( posedge clock => ( out +: in ) ) = (10, 8); // : in 表示从in输出到out,这个不影响路径延时,可省略;+|-表示从in传到out信号有没有反向,-反向。在clock的上升沿发生后,out上升沿变化的delay为10,下降沿变化的delay为8。
( negedge clock[0] => ( out -: in ) ) = (10, 8); // 在clock的第0 bit发生下降沿变化时,out有对应的delay
( clock => ( out : in ) ) = (10, 8); // clock任意变化,out都有对应的delay。
状态依赖路径
当某个表达式为真时,才给一段路径赋延时,这样的路径叫状态依赖路径。
状态依赖路径形式如下,
if(expression) 简单路径 // expression 结果为1、x、z都是true,