文章目录
本附录将介绍标准延迟标注格式,并说明了如何在仿真中执行反标。
延迟格式描述了设计网表的单元延迟和互连走线延迟,无论设计是用两种主要硬件描述语言( V H D L VHDL VHDL或 V e r i l o g H D L Verilog\ HDL Verilog HDL)中的哪一种所描述的。
本章还会介绍仿真的反标(backannotation), S T A STA STA的反标其实是一个简单直接的过程,其中 D U A DUA DUA中的时序弧将由 S D F SDF SDF所指定的延迟进行标注。
B.1 什么是SDF(What is it)
S D F SDF SDF是指标准延迟格式(Standard Delay Format)。它是一个 I E E E IEEE IEEE标准—— I E E E S t d 1497 IEEE\ Std\ 1497 IEEE Std 1497,它是 A S C I I ASCII ASCII文本文件,它描述了时序信息和约束,其目的是用作各种工具之间的文本类型的时序信息交换媒介,它也可以用来描述需要它的工具的时序数据。由于它是 I E E E IEEE IEEE标准,因此由一个工具生成的时序信息可以被支持该标准的许多其它工具所使用。 S D F SDF SDF中的数据与工具和语言都无关,且包括了互连走线延迟、器件延迟以及时序检查的规范。
由于 S D F SDF SDF是 A S C I I ASCII ASCII文件,因此它易于阅读,尽管对于实际设计而言,这些文件往往很大。但是,它是作为工具之间的交换媒介。经常在进行信息交换时,一个工具可能会在生成 S D F SDF SDF文件时产生一个问题,而另一个读取 S D F SDF SDF的工具可能无法正确读取 S D F SDF SDF。读取 S D F SDF SDF的工具可能会在读取 S D F SDF SDF时产生一个错误或警告,或者它可能会错误地解释 S D F SDF SDF中的值。在这种情况下,设计人员可能必须查看 S D F SDF SDF文件,看看出了什么问题。本章介绍了 S D F SDF SDF文件的基础知识,并提供了必要和足够的信息,以帮助理解和调试任何标注问题。
图B-1显示了如何使用 S D F SDF SDF文件的典型流程。时序计算工具通常会生成时序信息存储在 S D F SDF SDF文件中。然后,通过读取 S D F SDF SDF的工具将该信息反标到设计中。请注意,完整的设计信息不会都存储到 S D F SDF SDF文件中,而只会存储延迟值。例如,实例名称和实例的引脚名称将被存储到 S D F SDF SDF文件中,因为它们对于指定实例相关或引脚相关的延迟是必需的。因此,必须为 S D F SDF SDF生成工具和 S D F SDF SDF读取工具提供相同的设计。

一个设计可以具有多个与之关联的 S D F SDF SDF文件。可以为一个设计创建一个 S D F SDF SDF文件,在分层设计中,也可以为分层中的每个块创建多个 S D F SDF SDF文件。在标注期间,每个 S D F SDF SDF都将应用于适当的分层实例中,如图B-2所示。

S D F SDF SDF文件包含了用于反标和标注的时序数据。更具体地说,它包含:
- 单元延迟(Cell delays);
- 脉冲传播(Pulse propagation);
- 时序检查(Timing checks);
- 互连走线延迟(Interconnect delays);
- 时序环境(Timing environment);
引脚到引脚的延迟(pin-to-pin delay)和分布式延迟(distributed delay)都可以针对单元延迟进行建模。引脚到引脚的延迟使用 I O P A T H IOPATH IOPATH结构(construct)表示,这些结构定义了每个单元输入到输出的路径延迟。 C O N D COND COND结构还可以用于额外指定有条件的引脚到引脚延迟。状态相关(state-dependent)的路径延迟也可以使用 C O N D COND COND结构来指定,分布式延迟的建模是使用 D E V I C E DEVICE DEVICE结构指定的。
脉冲传播结构—— P A T H P U L S E PATHPULSE PATHPULSE和 P A T H P U L S E P E R C E N T PATHPULSEPERCENT PATHPULSEPERCENT可用于指定使用引脚到引脚延迟模型时允许传播到单元输出端口的毛刺大小。
可以在SDF中指定的时序检查包括:
- 建立时间:
SETUP
,SETUPHOLD
; - 保持时间:
HOLD
,SETUPHOLD
; - 恢复时间:
RECOVERY
,RECREM
; - 撤销时间:
REMOVAL
,RECREM
; - 最大偏斜:
SKEW
,BIDIRECTSKEW
; - 最小脉冲宽度:
WIDTH
; - 最小周期:
PERIOD
; - 不变化:
NOCHANGE
;
时序检查中的信号可能存在某些条件。在时序检查中允许使用负值,不支持负值的工具可以选择将其替换为零。
S D F SDF SDF描述中支持三种类型的互连走线建模。 I N T E R C O N N E C T INTERCONNECT INTERCONNECT结构是最通用且最常用的,可用于指定点对点延迟(从源端到接收端),因此单个网络可以具有多个 I N T E R C O N N E C T INTERCONNECT INTERCONNECT结构。 P O R T PORT PORT结构可用于指定负载端口处的网络延迟,假定网络只有一个源端驱动。 N E T D E L A Y NETDELAY NETDELAY结构可用于指定整个网络的延迟,而无需考虑其源端或接收端,因此是指定网络上延迟的最不具体的方法。
时序环境提供了设计在工作时所依据的信息,这些信息包括 A R R I V A L ARRIVAL ARRIVAL, D E P A R T U R E DEPARTURE DEPARTURE, S L A C K SLACK SLACK和 W A V E F O R M WAVEFORM WAVEFORM结构。这些结构主要用于标注,例如可用于综合。
B.2 SDF格式(The Format)
S D F SDF SDF文件包含一个首部(header section),后跟一个或多个单元。每个单元代表设计中的一个区域或范围,它可以是库原语(primitive)或用户自定义的黑盒。
(DELAYFILE
<header_section>
(CELL
<cell_section>
)
(CELL
<cell_section>
)
... <other cells>
)
首部包含一般信息,除了层次结构分隔符、时间刻度(timescale)和
S
D
F
SDF
SDF版本号外,都不会影响
S
D
F
SDF
SDF文件的语义。默认情况下,层次结构分隔符DIVIDER
是点字符(.
)。通过以下方法,可以将其替换为/
字符:
(DIVIDER /)
如果首部中没有时间刻度信息,则默认值为
1
n
s
1ns
1ns。否则,可以使用以下命令明确指定时间刻度TIMESCALE
:
(TIMESCALE 10ps)
也就是说,将 S D F SDF SDF文件中指定的所有延迟值乘以 10 p s 10ps 10ps。
S
D
F
SDF
SDF版本号SDFVERSION
是必需的,
S
D
F
SDF
SDF文件的使用者会根据它来确保文件符合指定的
S
D
F
SDF
SDF版本。首部中可能存在的其它信息(属于常规信息类别)包括日期、程序名称、版本和工作条件。
(DESIGN "BCM")
(DATE "Tuesday, May 24, 2004")
(PROGRAM "Star Galaxy Automation Inc., TimingTool")
(VERSION "V2004.1")
(VOLTAGE 1.65:1.65:1.65)
(PROCESS "1.000:1.000:1.000")
(TEMPERATURE 0.00:0.00:0.00)
首部之后是一个或多个单元的描述,每个单元在设计中代表一个或多个实例(使用通配符),单元可以是库原语或分层块(hierarchical block)。
(CELL
(CELLTYPE <cell_type>)
(INSTANCE <hierarchical_instance_name>)
(DELAY
<path_delay_section>
)
(TIMINGCHECK
<timing_check_section>
)
(TIMINGENV
<timing_environment_section>
)
(LABEL
<label_section>
)
)
. . . <other cells>
单元的顺序很重要,因为数据是从上到下进行处理的。后面的单元描述可以覆盖前面的单元描述所指定的时序信息(通常,两次定义同一单元实例的时序信息并不常见)。另外,可以将时序信息标注为绝对值或增量的形式。如果时序信息使用增量的形式,它将会把新值添加到现有值中。而如果时序信息是绝对值,它将覆盖任何先前指定的时序信息。
单元实例可以是分层实例名称。用于层次结构分隔的分隔符必须符合首部中指定的分隔符。单元实例名称可以选择为*
字符,即通配符,这表示指定类型的所有单元实例。
(CELL
(CELLTYPE "NAND2")
(INSTANCE *)
// Refers to all instances of NAND2.
. . .
一个单元可以用指定四类时序规格来进行描述:
DELAY
:用来描述时延;TIMINGCHECK
:用来描述时序检查;TIMINGENV
:用来描述时序环境;LABEL
:声明用以描述时延的时序模型变量;
以下是相关例子:
// An absolute path delay specification:
(DELAY
(ABSOLUTE
(IOPATH A Y (0.147))
)
)
// A setup and hold timing check specification:
(TIMINGCHECK
(SETUPHOLD (posedge Q) (negedge CK) (0.448) (0.412))
)
// A timing constraint between two points:
(TIMINGENV
(PATHCONSTRAINT UART/ENA UART/TX/CTRL (2.1) (1.5))
)
// A label that overrides the value of a Verilog HDL
// specparam:
(LABEL
(ABSOLUTE
(t$CLK$Q (0.480:0.512:0.578) (0.356:0.399:0.401))
(tsetup$D$CLK (0.112))
)
)
DELAY
时序规范有四种类型:
ABSOLUTE
:在反标期间替换单元实例的现有延迟值;INCREMENT
:将新的延迟数据添加到单元实例的任何现有延迟值;PATHPULSE
:指定设计输入和输出之间的脉冲传播极限。此极限值用于决定是将出现在输入上的脉冲传播到输出,还是将其标记为X
,或者将其滤除;PATHPULSEPERCENT
:除了值以百分比表示外,这与PATHPULSE
完全相同;
以下是一些例子:
// Absolute port delay:
(DELAY
(ABSOLUTE
(PORT UART.DIN (0.170))
(PORT UART.RX.XMIT (0.645))
)
)
// Adds IO path delay to existing delays of cell:
(DELAY
(INCREMENT
(IOPATH (negedge SE) Q (1.1:1.22:1.35))
)
)
// Pathpulse delay:
(DELAY
(PATHPULSE RN Q (3) (7))
)
// The ports RN and Q are input and output of the
// cell. The first value, 3, is the pulse rejection
// limit, called r-limit; it defines the narrowest pulse
// that can appear on output. Any pulse narrower than
// this is rejected, that is, it will not appear on
// output. The second value, 7, if present, is the
// error limit - also called e-limit. Any pulse smaller
// than e-limit causes the output to be an X.
// The e-limit must be greater than r-limit. See
// Figure B-3. When a pulse that is less than 3 (r-limit)
// occurs, the pulse does not propagate to the output.
// When the pulse width is between the 3 (r-limit) and
// 7 (e-limit), the output is an X. When the pulse width
// is larger than 7 (e-limit), pulse propagates to output
// without any filtering.
// Pathpulsepercent delay type:
(DELAY
(PATHPULSEPERCENT CIN SUM (30) (50))
)
// The r-limit is specified as 30% of the delay time from
// CIN to SUM and the e-limit is specified as 50% of
// this delay.

可以使用ABSOLUTE
或INCREMENT
描述八种延迟定义:
IOPATH
:输入到输出路径的延迟;RETAIN
:保留时间定义,可以用于指定输出端口在其相关输入端口改变后应保留其先前值的时间;COND
:条件路径延迟,可以用于指定状态相关的输入到输出路径延迟;CONDELSE
:默认路径延迟,可以用于指定条件路径的默认值;PORT
:端口延迟,可以用于指定互连走线延迟,该延迟被建模为输入端口的延迟;INTERCONNECT
:互连走线延迟,可以用于指定从其源端到接收端的整个网络的传播延迟;NETDELAY
:网络延迟,可以用于指定从一个网络的所有源端到所有接收端的传播延迟;DEVICE
:器件延迟,主要用于描述分布式时序模型,可以用于指定通过单元到输出端口的所有路径的传播延迟;
以下是一些例子:
// IO path delay between posedge of CK and Q:
(DELAY
(ABSOLUTE
(IOPATH (posedge CK) Q (2) (3))
)
)
// 2 is the propagation rise delay and 3 is the
// propagation fall delay.
// Retain delay in an IO path:
(DELAY
(ABSOLUTE
(IOPATH A Y
(RETAIN (0.05:0.05:0.05) (0.04:0.04:0.04))
(0.101:0.101:0.101) (0.09:0.09:0.09))
)
)
// Y shall retain its previous value for 50ps (40ps for
// a low value) after a change of value on input A.
// 50ps is the retain high value, 40ps is the retain
// low value, 101ps is the propagate rise delay and
// 90ps is the propagate fall delay. See Figure B-4.

// Conditional path delay:
(DELAY
(ABSOLUTE
(COND SE == 1'b1 (IOPATH (posedge CK) Q (0.661)))
)
)
// Default conditional path delay:
(DELAY
(ABSOLUTE
(CONDELSE (IOPATH ADDR[7] COUNT[0] (0.870) (0.766)))
)
)
// Port delay on input FRM_CNT[0]:
(DELAY
(ABSOLUTE
(PORT UART/RX/FRM_CNT[0] (0.439))
)
)
// Interconnect delay:
(DELAY
(ABSOLUTE
(INTERCONNECT O1/Y O2/B (0.209:0.209:0.209))
)
)
// Net delay:
(DELAY
(ABSOLUTE
(NETDELAY A3/B (0.566))
)
)
延迟(Delay)
到目前为止,我们已经看过了许多不同形式的延迟,其实延迟规范还有其它形式。通常,可以将延迟指定为一个、两个、三个、六个或十二个令牌(token)的集合,这些令牌可用于描述以下过渡的延迟: 0 − > 1 、 1 − > 0 、 0 − > Z , Z − > 1 , 1 − > Z , Z − > 0 , 0 − > X , X − > 1 , 1 − > X , X − > 0 , X − > Z , Z − > X 0-> 1、1-> 0、0-> Z,Z-> 1,1-> Z,Z-> 0,0-> X,X-> 1,1-> X,X-> 0,X-> Z,Z-> X 0−>1、1−>0、0−>Z,Z−>1,1−>Z,Z−>0,0−>X,X−>1,1−>X,X−>0,X−>Z,Z−>X。下表展示了如何使用少于十二个延迟令牌来表示十二种过渡情况。

以下是这些延迟的示例:
(DELAY
(ABSOLUTE
// 1-value delay:
(IOPATH A Y (0.989))
// 2-value delay:
(IOPATH B Y (0.989) (0.891))
// 6-value delay:
(IOPATH CTRL Y (0.121) (0.119) (0.129)
(0.131) (0.112) (0.124))
// 12-value delay:
(COND RN == 1'b0
(IOPATH C Y (0.330) (0.312) (0.330) (0.311) (0.328)
(0.321) (0.328) (0.320) (0.320)
(0.318) (0.318) (0.316)
)
)
// In this 2-value delay, the first one is null
// implying the annotator is not to change its value.
(IOPATH RN Q () (0.129))
)
)
每个延迟令牌可以依次写为一个、两个或三个值,如以下示例所示:
(DELAY
(ABSOLUTE
// One value in a delay token:
(IOPATH A Y (0.117))
// The delay value, the pulse rejection limit
// (r-limit) and X filter limit (e-limit) are same.
// Two values in a delay (note no colon):
(IOPATH (posedge CK) Q (0.12 0.15))
// 0.12 is the delay value and 0.15 is the r-limit
// and e-limit.
// Three values in a delay:
(IOPATH F1/Y AND1/A (0.339 0.1 0.15))
// Path delay is 0.339, r-limit is 0.1 and
// e-limit is 0.15.
)
)
一个SDF文件中的延迟值可以使用有符号的实数或以下形式的三元数组来编写:
(8.0:3.6:9.8)
为了表示出设计在三个工艺工作条件下的最小、典型以及最大延迟,注释器通常会根据用户提供的选项来决定去选择哪个值。三元数组形式中的值是可选的,但是至少应有一个。例如,以下形式是规范的:
(::0.22)
(1.001: :0.998)
未指定的值就不会去标注。
时序检查(Timing Check)
在以TIMINGCHECK
关键字开头的部分中指定了时序检查的极限。在任何这些检查中,可以使用COND
结构指定有条件的时序检查。在某些情况下,可以指定两个额外的条件检查SCOND
和CCOND
,它们与
s
t
a
m
p
e
v
e
n
t
stamp\ event
stamp event和
c
h
e
c
k
e
v
e
n
t
check\ event
check event关联。
以下是一组检查:
SETUP
:建立时间检查;HOLD
:保持时间检查;SETUPHOLD
:建立时间和保持时间检查;RECOVERY
:恢复时间检查;REMOVAL
:撤销时间检查;RECREM
:恢复时间和撤销时间检查;SKEW
:单向偏斜时序检查;BIDIRECTSKEW
:双向偏斜时序检查;WIDTH
:脉宽时序检查;PERIOD
:周期时序检查;NOCHANGE
:不变化时序检查;
以下是一些例子:
(TIMINGCHECK
// Setup check limit:
(SETUP din (posedge clk) (2))
// Hold check limit:
(HOLD din (negedge clk) (0.445:0.445:0.445))
// Conditional hold check limit :
(HOLD (COND RST==1'b1 D) (posedge CLK) (1.15))
// Hold check between D and positive edge of CLK, but
// only when RST is 1.
// Setup and hold check limit:
(SETUPHOLD J CLK (1.2) (0.99))
// 1.2 is the setup limit and 0.99 is the hold limit.
// Conditional setup and hold limit:
(SETUPHOLD D CLK (0.809) (0.591) (CCOND ~SE))
// Condition applies with CLK for setup and
// with D for hold.
// Conditional setup and hold check limit:
(SETUPHOLD (COND ~RST D) (posedge CLK) (1.452) (1.11))
// Setup and hold check between D and positive edge
// of CLK, but only when RST is low.
// RECOVERY check limit:
(RECOVERY SE (negedge CLK) (0.671))
// Conditional removal check limit:
(REMOVAL (COND ~LOAD CLEAR) CLK (2.001:2.1:2.145))
// Removal check between CLEAR and CLK but only
// when LOAD is low.
// Recovery and removal check limit:
(RECREM RST (negedge CLK) (1.1) (0.701))
// 1.1 is the recovery limit and 0.701 is the
// removal limit.
// Skew conditional check limit:
(SKEW (COND MMODE==1'b1 GNT) (posedge REQ) (3.2))
// Bidirectional skew check limit:
(BIDIRECTSKEW (posedge CLOCK1) (negedge TCK) (1.409))
// Width check limit:
(WIDTH (negedge RST) (12))
// Period check limit:
(PERIOD (posedge JTCLK) (13.33))
// Nochange check limit:
(NOCHANGE (posedge REQ) (negedge GNT) (2.5) (3.12))
)
标签(Labels)
标签可用于指定 V H D L VHDL VHDL泛型(generics)或 V e r i l o g H D L Verilog\ HDL Verilog HDL参数的值。
(LABEL
(ABSOLUTE
(thold$d$clk (0.809))
(tph$A$Y (0.553))
)
)
时序环境(Timing Environment)
有许多结构可用于描述设计的时序环境。但是,这些结构可用于标注,而不是用于反标,例如在逻辑综合工具中。这些未在本文中描述。
B.2.1 例子(Examples)
接下来,我们将为两个设计提供完整的 S D F SDF SDF文件。
全加器(Full-adder)
这是用于全加器(full-adder)电路的 V e r i l o g H D L Verilog\ HDL Verilog HDL网表(netlist):
module FA_STR (A, B, CIN, SUM, COUT);
input A, B, CIN;
output SUM, COUT;
wire S1, S2, S3, S4, S5;
XOR2X1 X1 (.Y(S1), .A(A), .B(B));
XOR2X1 X2 (.Y(SUM), .A(S1), .B(CIN));
AND2X1 A1 (.Y(S2), .A(A), .B(B));
AND2X1 A2 (.Y(S3), .A(B), .B(CIN));
AND2X1 A3 (.Y(S4), .A(A), .B(CIN));
OR2X1 O1 (.Y(S5), .A(S2), .B(S3));
OR2X1 O2 (.Y(COUT), .A(S4), .B(S5));
endmodule
以下是时序分析工具生成的完整 S D F SDF SDF文件:
(DELAYFILE
(SDFVERSION "OVI 2.1")
(DESIGN "FA_STR")
(DATE "Mon May 24 13:56:43 2004")
(VENDOR "slow")
(PROGRAM "CompanyName ToolName")
(VERSION "V2.3")
(DIVIDER /)
// OPERATING CONDITION "slow"
(VOLTAGE 1.35:1.35:1.35)
(PROCESS "1.000:1.000:1.000")
(TEMPERATURE 125.00:125.00:125.00)
(TIMESCALE 1ns)
(CELL
(CELLTYPE "FA_STR")
(INSTANCE)
(DELAY
(ABSOLUTE
(INTERCONNECT A A3/A (0.000:0.000:0.000))
(INTERCONNECT A A1/A (0.000:0.000:0.000))
(INTERCONNECT A X1/A (0.000:0.000:0.000))
(INTERCONNECT B A2/A (0.000:0.000:0.000))
(INTERCONNECT B A1/B (0.000:0.000:0.000))
(INTERCONNECT B X1/B (0.000:0.000:0.000))
(INTERCONNECT CIN A3/B (0.000:0.000:0.000))
(INTERCONNECT CIN A2/B (0.000:0.000:0.000))
(INTERCONNECT CIN X2/B (0.000:0.000:0.000))
(INTERCONNECT X2/Y SUM (0.000:0.000:0.000))
(INTERCONNECT O2/Y COUT (0.000:0.000:0.000))
(INTERCONNECT X1/Y X2/A (0.000:0.000:0.000))
(INTERCONNECT A1/Y O1/A (0.000:0.000:0.000))
(INTERCONNECT A2/Y O1/B (0.000:0.000:0.000))
(INTERCONNECT A3/Y O2/A (0.000:0.000:0.000))
(INTERCONNECT O1/Y O2/B (0.000:0.000:0.000))
)
)
)
(CELL
(CELLTYPE "XOR2X1")
(INSTANCE X1)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.197:0.197:0.197)
(0.190:0.190:0.190))
(IOPATH B Y (0.209:0.209:0.209)
(0.227:0.227:0.227))
(COND B==1'b1 (IOPATH A Y (0.197:0.197:0.197)
(0.190:0.190:0.190)))
(COND A==1'b1 (IOPATH B Y (0.209:0.209:0.209)
(0.227:0.227:0.227)))
(COND B==1'b0 (IOPATH A Y (0.134:0.134:0.134)
(0.137:0.137:0.137)))
(COND A==1'b0 (IOPATH B Y (0.150:0.150:0.150)
(0.163:0.163:0.163)))
)
)
)
(CELL
(CELLTYPE "XOR2X1")
(INSTANCE X2)
(DELAY
(ABSOLUTE
(IOPATH (posedge A) Y (0.204:0.204:0.204)
(0.196:0.196:0.196))
(IOPATH (negedge A) Y (0.198:0.198:0.198)
(0.190:0.190:0.190))
(IOPATH B Y (0.181:0.181:0.181)
(0.201:0.201:0.201))
(COND B==1'b1 (IOPATH A Y (0.198:0.198:0.198)
(0.196:0.196:0.196)))
(COND A==1'b1 (IOPATH B Y (0.181:0.181:0.181)
(0.201:0.201:0.201)))
(COND B==1'b0 (IOPATH A Y (0.135:0.135:0.135)
(0.140:0.140:0.140)))
(COND A==1'b0 (IOPATH B Y (0.122:0.122:0.122)
(0.139:0.139:0.139)))
)
)
)
(CELL
(CELLTYPE "AND2X1")
(INSTANCE A1)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.147:0.147:0.147)
(0.157:0.157:0.157))
(IOPATH B Y (0.159:0.159:0.159)
(0.173:0.173:0.173))
)
)
)
(CELL
(CELLTYPE "AND2X1")
(INSTANCE A2)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.148:0.148:0.148)
(0.157:0.157:0.157))
(IOPATH B Y (0.160:0.160:0.160)
(0.174:0.174:0.174))
)
)
)
(CELL
(CELLTYPE "AND2X1")
(INSTANCE A3)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.147:0.147:0.147)
(0.157:0.157:0.157))
(IOPATH B Y (0.159:0.159:0.159)
(0.173:0.173:0.173))
)
)
)
(CELL
(CELLTYPE "OR2X1")
(INSTANCE O1)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.138:0.138:0.138)
(0.203:0.203:0.203))
(IOPATH B Y (0.151:0.151:0.151)
(0.223:0.223:0.223))
)
)
)
(CELL
(CELLTYPE "OR2X1")
(INSTANCE O2)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.126:0.126:0.126)
(0.191:0.191:0.191))
(IOPATH B Y (0.136:0.136:0.136)
(0.212:0.212:0.212))
)
)
)
)
I N T E R C O N N E C T s INTERCONNECTs INTERCONNECTs中的所有延迟均为 0 0 0,因为这是布局前的数据,因此建模的是理想互连走线模型。
十进制计数器(Decade Counter)
这是十进制计数器的 V e r i l o g H D L Verilog\ HDL Verilog HDL模型:
module DECADE_CTR (COUNT, Z);
input COUNT;
output [0:3] Z;
wire S1, S2;
AND2X1 a1 (.Y(S1), .A(Z[2]), .B(Z[1]));
JKFFX1
JK1 (.J(1'b1), .K(1'b1), .CK(COUNT),
.Q(Z[0]), .QN()),
JK2 (.J(S2), .K(1'b1), .CK(Z[0]), .Q(Z[1]), .QN()),
JK3 (.J(1'b1), .K(1'b1), .CK(Z[1]),
.Q(Z[2]), .QN()),
JK4 (.J(S1), .K(1'b1), .CK(Z[0]),
.Q(Z[3]), .QN(S2));
endmodule
对应的完整 S D F SDF SDF文件如下:
(DELAYFILE
(SDFVERSION "OVI 2.1")
(DESIGN "DECADE_CTR")
(DATE "Mon May 24 14:30:17 2004")
(VENDOR "Star Galaxy Automation, Inc.")
(PROGRAM "MyCompanyName ToolTime")
(VERSION "V2.3")
(DIVIDER /)
// OPERATING CONDITION "slow"
(VOLTAGE 1.35:1.35:1.35)
(PROCESS "1.000:1.000:1.000")
(TEMPERATURE 125.00:125.00:125.00)
(TIMESCALE 1ns)
(CELL
(CELLTYPE "DECADE_CTR")
(INSTANCE)
(DELAY
(ABSOLUTE
(INTERCONNECT COUNT JK1/CK (0.191:0.191:0.191))
(INTERCONNECT JK1/Q Z\[0\] (0.252:0.252:0.252))
(INTERCONNECT JK2/Q Z\[1\] (0.186:0.186:0.186))
(INTERCONNECT JK3/Q Z\[2\] (0.18:0.18:0.18))
(INTERCONNECT JK4/Q Z\[3\] (0.195:0.195:0.195))
(INTERCONNECT JK3/Q a1/A (0.175:0.175:0.175))
(INTERCONNECT JK2/Q a1/B (0.207:0.207:0.207))
(INTERCONNECT JK4/QN JK2/J (0.22:0.22:0.22))
(INTERCONNECT JK1/Q JK2/CK (0.181:0.181:0.181))
(INTERCONNECT JK2/Q JK3/CK (0.193:0.193:0.193))
(INTERCONNECT a1/Y JK4/J (0.224:0.224:0.224))
(INTERCONNECT JK1/Q JK4/CK (0.218:0.218:0.218))
)
)
)
(CELL
(CELLTYPE "AND2X1")
(INSTANCE a1)
(DELAY
(ABSOLUTE
(IOPATH A Y (0.179:0.179:0.179)
(0.186:0.186:0.186))
(IOPATH B Y (0.190:0.190:0.190)
(0.210:0.210:0.210))
)
)
)
(CELL
(CELLTYPE "JKFFX1")
(INSTANCE JK1)
(DELAY
(ABSOLUTE
(IOPATH (posedge CK) Q (0.369:0.369:0.369)
(0.470:0.470:0.470))
(IOPATH (posedge CK) QN (0.280:0.280:0.280)
(0.178:0.178:0.178))
)
)
(TIMINGCHECK
(SETUP (posedge J) (posedge CK)
(0.362:0.362:0.362))
(SETUP (negedge J) (posedge CK)
(0.220:0.220:0.220))
(HOLD (posedge J) (posedge CK)
(-0.272:-0.272:-0.272))
(HOLD (negedge J) (posedge CK)
(-0.200:-0.200:-0.200))
(SETUP (posedge K) (posedge CK)
(0.170:0.170:0.170))
(SETUP (negedge K) (posedge CK)
(0.478:0.478:0.478))
(HOLD (posedge K) (posedge CK)
(-0.158:-0.158:-0.158))
(HOLD (negedge K) (posedge CK)
(-0.417:-0.417:-0.417))
(WIDTH (negedge CK)
(0.337:0.337:0.337))
(WIDTH (posedge CK) (0.148:0.148:0.148))
)
)
(CELL
(CELLTYPE "JKFFX1")
(INSTANCE JK2)
(DELAY
(ABSOLUTE
(IOPATH (posedge CK) Q (0.409:0.409:0.409)
(0.512:0.512:0.512))
(IOPATH (posedge CK) QN (0.326:0.326:0.326)
(0.222:0.222:0.222))
)
)
(TIMINGCHECK
(SETUP (posedge J) (posedge CK)
(0.348:0.348:0.348))
(SETUP (negedge J) (posedge CK)
(0.227:0.227:0.227))
(HOLD (posedge J) (posedge CK)
(-0.257:-0.257:-0.257))
(HOLD (negedge J) (posedge CK)
(-0.209:-0.209:-0.209))
(SETUP (posedge K) (posedge CK)
(0.163:0.163:0.163))
(SETUP (negedge K) (posedge CK)
(0.448:0.448:0.448))
(HOLD (posedge K) (posedge CK)
(-0.151:-0.151:-0.151))
(HOLD (negedge K) (posedge CK)
(-0.392:-0.392:-0.392))
(WIDTH (negedge CK) (0.337:0.337:0.337))
(WIDTH (posedge CK) (0.148:0.148:0.148))
)
)
(CELL
(CELLTYPE "JKFFX1")
(INSTANCE JK3)
(DELAY
(ABSOLUTE
(IOPATH (posedge CK) Q (0.378:0.378:0.378)
(0.485:0.485:0.485))
(IOPATH (posedge CK) QN (0.324:0.324:0.324)
(0.221:0.221:0.221))
)
)
(TIMINGCHECK
(SETUP (posedge J) (posedge CK)
(0.339:0.339:0.339))
(SETUP (negedge J) (posedge CK)
(0.211:0.211:0.211))
(HOLD (posedge J) (posedge CK)
(-0.249:-0.249:-0.249))
(HOLD (negedge J) (posedge CK)
(-0.192:-0.192:-0.192))
(SETUP (posedge K) (posedge CK)
(0.163:0.163:0.163))
(SETUP (negedge K) (posedge CK)
(0.449:0.449:0.449))
(HOLD (posedge K) (posedge CK)
(-0.152:-0.152:-0.152))
(HOLD (negedge K) (posedge CK)
(-0.393:-0.393:-0.393))
(WIDTH (negedge CK) (0.337:0.337:0.337))
(WIDTH (posedge CK) (0.148:0.148:0.148))
)
)
(CELL
(CELLTYPE "JKFFX1")
(INSTANCE JK4)
(DELAY
(ABSOLUTE
(IOPATH (posedge CK) Q (0.354:0.354:0.354)
(0.464:0.464:0.464))
(IOPATH (posedge CK) QN (0.364:0.364:0.364)
(0.256:0.256:0.256))
)
)
(TIMINGCHECK
(SETUP (posedge J) (posedge CK)
(0.347:0.347:0.347))
(SETUP (negedge J) (posedge CK)
(0.226:0.226:0.226))
(HOLD (posedge J) (posedge CK)
(-0.256:-0.256:-0.256))
(HOLD (negedge J) (posedge CK)
(-0.208:-0.208:-0.208))
(SETUP (posedge K) (posedge CK)
(0.163:0.163:0.163))
(SETUP (negedge K) (posedge CK)
(0.448:0.448:0.448))
(HOLD (posedge K) (posedge CK)
(-0.151:-0.151:-0.151))
(HOLD (negedge K) (posedge CK)
(-0.392:-0.392:-0.392))
(WIDTH (negedge CK) (0.337:0.337:0.337))
(WIDTH (posedge CK) (0.148:0.148:0.148))
)
)
)
B.3 标注过程(The Annotation Process)
在本节中,我们将介绍如何在 H D L HDL HDL描述中进行 S D F SDF SDF的标注(annotation)。 S D F SDF SDF的标注可以通过多种工具执行,例如逻辑综合工具、仿真工具和静态时序分析工具。 S D F SDF SDF标注器(annotator)是这些工具的组件,可用于读取 S D F SDF SDF、解释并向设计中标注时序值。假定会使用与 H D L HDL HDL模型一致的信息创建 S D F SDF SDF文件,并且在反标期间使用相同的 H D L HDL HDL模型。此外, S D F SDF SDF标注器还需要负责正确解释 S D F SDF SDF中的时序值。
S D F SDF SDF标注器标注了反标时序的泛型和参数。如果在语法或映射(mapping)过程中不符合该标准,它将给出错误报告。如果一个 S D F SDF SDF标注器不支持某些 S D F SDF SDF结构,则不会产生任何错误,标注器将忽略这些错误。
如果 S D F SDF SDF标注器未能修改反标时序的泛型,则在反标过程中不会修改泛型的值,即保持不变。
在仿真工具中,反标通常发生在规划(elaboration)阶段之后,紧接在负约束延迟计算之前。
B.3.1 Verilog HDL
在 V e r i l o g H D L Verilog\ HDL Verilog HDL中,标注的主要机制是指定块(specify block),指定块可以指定路径延迟和时序检查。实际延迟值和时序检查极限值是通过 S D F SDF SDF文件指定的,映射是一种行业标准,在 I E E E S t d 1364 IEEE\ Std\ 1364 IEEE Std 1364中定义。
从
S
D
F
SDF
SDF文件中获得并在
V
e
r
i
l
o
g
H
D
L
Verilog\ HDL
Verilog HDL模块的指定块中标注的信息包括指定路径的延迟、参数值、时序检查约束极限值和互连走线延迟。向一个
V
e
r
i
l
o
g
H
D
L
Verilog\ HDL
Verilog HDL模型进行标注时,将忽略
S
D
F
SDF
SDF文件中的其它结构。
S
D
F
SDF
SDF中的LABEL
部分定义了参数值。通过将
S
D
F
SDF
SDF结构与相应的
V
e
r
i
l
o
g
H
D
L
Verilog\ HDL
Verilog HDL声明进行匹配,然后将现有的时序值替换为
S
D
F
SDF
SDF文件中的时序值,即可完成反标。
下表显示了 S D F SDF SDF延迟值如何映射到 V e r i l o g H D L Verilog\ HDL Verilog HDL延迟值:

下表描述了 S D F SDF SDF结构到 V e r i l o g H D L Verilog\ HDL Verilog HDL结构的映射:

有关示例,请参见后面部分。
B.3.2 VHDL
SDF到VHDL的标注是一个行业标准,它在VITAL ASIC建模规范的IEEE标准IEEE Std 1076.4中定义,该标准的其中一部分描述了SDF延迟到ASIC库的标注。在这里,我们仅介绍与SDF映射有关的VITAL标准的相关部分。
SDF可用于直接在符合VITAL的模型中修改反标时序泛型,只能使用SDF为符合VITAL的模型指定时序数据。有两种方法可以将时序数据传递到VHDL模型中:通过配置,或直接传递到仿真中去。SDF标注过程包括在仿真期间在符合VITAL的模型中映射SDF结构和相应的泛型。
在符合VITAL的模型中,存在着有关如何命名和声明泛型的规则,以确保可以在模型的时序泛型和相应的SDF时序信息之间建立映射。
时序泛型由泛型名称及其类型组成,名称指定时序信息的种类,类型指定时序值的种类。如果泛型名称不符合VITAL标准,则它不是时序泛型,也不会被标注。
下表显示了SDF延迟值如何映射到VHDL延迟:

在VHDL中,时序信息是通过泛型进行反标的。泛型名称遵循一定的规则,以便保持一致或从SDF结构中获取。利用每个时序泛型名称,可以指定条件边沿的可选后缀。边沿可以指定一个与时序信息相关联的边沿。
下表列出了各种时序泛型名称:
