一.基本SDC实例
Synopsys设计约束(SDC)格式提供简单而又直接的方法来约束最简单和最复杂的设计。以下是最简单的SDC文件内容,约束设计中的所有时钟(端口和引脚)、输入I/O通道、输出I/O通道。
# Global fMAX of 100 MHz
# All detected clocks will be constrained with a 100 MHz requirement
derive_clocks -period "100MHz"
# Automatically apply a generate clock on the output of phase-locked loops (PLLs)
# This command can be safely left in the SDC even if no PLLs exist in the design
derive_pll_clocks
# Constrain the input I/O path
set_max_delay -from [all_inputs] -to [all_registers] 1
set_min_delay -from [all_inputs] -to [all_registers] 2
# Constrain the output I/O path
set_max_delay -from [all_registers] -to [all_outputs] 3
二.多周期排除
采用Synopsys设计约束(SDC)命令set_multicycle_path,您可以规定相对于目的时钟或者源时钟的允许时钟周期数,使数据能够在源寄存器和目的寄存器之间正确传输。这在以下情况时非常有用。
在图1的简单电路中,目的寄存器reg2需要两个多周期。寄存器reg2应在每个时钟周期对数据进行锁存 。
图1. 寄存器至寄存器多周期通道
下面的SDC命令对上面电路的时钟进行约束。
#Constrain the base clock
create_clock -period 10.000 [get_ports clkin]
#Constrain the PLL output clock
create_generated_clock -source inst|inclk[0] -multiply_by 2 \-name inst|clk[1] inst|clk[1]
#Constrain the input and output ports
set_input_delay -clock clk_in 1.2 [get_ports data_in]
set_input_delay -clock clk_in 1.5 [get_ports async_rst]
set_output_delay -clock clk_in 2 [get_ports data_out]
#Apply a multicycle of 2 to registers reg1 and reg2
#By default the multicycle is relative to the destination clock waveform
set_multicycle_path -to [get_pins reg2|*] 2
三.约束生成时钟
采用 Synopsys 设计约束 (SDC) 命令 create_generated_clock ,您可以建立任意数量以及任意深度的生成时钟。这在以下情况时非常有用 ( 参见图 1 和图 2) 。
在图 1 的简单电路中,寄存器 div2reg 输出需要一个生成时钟。
图1.2 分频生成时钟
下面的 SDC 命令对上面电路的时钟进行约束。
#Constrain the base clock
create_clock -add -period 10.000 \
-waveform { 0.000 5.000 } \
-name clock_name \
[get_ports clock]
#Constrain the divide by 2 register clock
create_generated_clock -add -source clock \
-name div2clock \
-divide_by 2 \
-master_clock clock_name \
[get_pins div2reg|regout]
在图2的简单电路中,寄存器 div2reg 输出需要一个生成时钟。
图2. PLL生成时钟
下面的 SDC 命令对上面电路的时钟进行约束。
#Constrain the base clock
create_clock -add -period 10.000 \
-waveform { 0.000 5.000 } \
-name clock_name [get_ports clock]
#Constrain the output clock clock
create_generated_clock -add -source PLL_inst|INCLK[0] \
-name PLL_inst|CLK[1] \
-multiply_by 2 \
-master_clock clock_name \
[get_pins PLL_inst|CLK[1]]
四.TimeQuest时钟多路复用实例
TimeQuest分析器简化了利用Synopsys设计约束(SDC)命令来约束复杂时钟结构的过程,例如多路复用时钟。以下介绍三个实例电路,以及对其进行约束的SDC命令。
1 . 片外时钟多路复用
图 1 所示是一个简单的寄存器至寄存器电路,通过clk端口进行同步。
图 1. 片外时钟多路复用
clk 端口由一个片外多路复用器驱动,该复用器在两个时钟之间进行选择,一个时钟的周期是10ns ,另一个是8ns。下面的SDC命令显示了怎样对clk端口分配多路时钟,以及怎样加入一个排除指示,使FPGA中的两个时钟决不会同时有效。
# Create the two clocks on the port
create_clock -name clk_100 -period 10 [get_ports clk]
create_clock -name clk_125 -period 8 [get_ports clk] -add
# Set the two clocks as exclusive clocks
set_clock_groups -exclusive -group {clk_100} -group {clk_125}
2 . 片内时钟多路复用
图2显示了FPGA中一个简单的寄存器至寄存器电路,它带有一个时钟多路复用器,含两个时钟端口:clkA和clkB 。
图2. 片内时钟多路复用
假设周期是10ns的时钟驱动clkA端口,周期是8ns的时钟驱动clkB端口。下面的SDC命令显示了怎样分配时钟。该例与前面的例子相似,但是时钟分配给不同的端口。
# Create a clock on each port
create_clock -name clk_100 -period 10 [get_ports clkA]
create_clock -name clk_125 -period 8 [get_ports clkB] -add
# Set the two clocks as exclusive clocks
set_clock_groups -exclusive -group {clk_100} -group {clk_125}
3 . 交联时钟多路复用
图3中的时钟电路要复杂一些,FPGA中含有交联时钟多路复用。
图3. 交联时钟多路复用
在这个例子中,必须使用set_clock_groups命令指明,时钟A和D、A和B、C和D、B和C决不会同时有效。
create_clock -name A -period 10 [get_ports clkA]
create_clock -name B -period 8 [get_ports clkB]
create_clock -name C -period 8 [get_ports clkC]
create_clock -name D -period 10 [get_ports clkD]
# cut paths between clocks
set_clock_groups -exclusive -group {A C} -group {B D}
五.约束最大斜移
TimeQuest时序分析器不支持规定最大斜移的单个约束,但是您可以规定相对于时钟端口的建立和保持时间,来约束源同步接口。下面的例子采用了图1中的简单源同步电路。
图1. 源同步接口图
约束输出总线的斜移
该实例对接口进行约束,在clk_out信号之后的2至3ns , data_out 总线的所有比特传输至片外。假设clk_in和clk_out周期为8ns。下面的等式和实例介绍了怎样建立时序要求,以满足图2中的时序关系。
图2. 源同步时序图
这些等式显示了怎样为 set_output_delay –min 命令计算数值,该命令在目的时钟设置2ns保持要求。对于源时钟和目的时钟相同的保持要求计算, <latch> - <launch> = 0 。
latch - launch = 0 ns
output delay = latch - launch - 2 ns
output delay = -2 ns
这些等式显示了怎样为 set_output_delay 命令计算数值,该命令在目的时钟设置3ns建立要求。对于源时钟和目的时钟相同的建立要求计算, <latch> - <launch> = clock period 。
latch - launch = 8 ns
output delay = latch - launch - 3 ns
output delay = 5 ns
最后,下面的约束将所有计算合并在一起,为源同步输出加上时序要求。
set period 8.000
create_clock -period $period -name clk_in \
[get_ports clk_in]
derive_pll_clocks
set_output_delay -add_delay \
-clock ddr_pll_1_inst|altpll_component|pll|CLK[0] \
-reference_pin [get_ports clk_out] -min -2.000 \
[get_ports data_out*]
set_output_delay -add_delay \
-clock ddr_pll_1_inst|altpll_component|pll|CLK[0] \
-reference_pin [get_ports clk_out] \
-max [expr $period - 3.000] [get_ports data_out*]
六.基本源同步输出
这些实例介绍了采用Synopsys设计约束(SDC)来约束源同步输出时序的两种方法。如果要约束源同步输出时序,必须采取方法规定相对于FPGA时钟驱动输出的输出延时。
生成时钟
您可以在 FPGA 时钟输出端口建立一个生成时钟。生成时钟自动计算与源时钟的延时。必须进行以下三种约束来约束图 1 中简单电路的输出。
·基本时钟驱动 clk_in 端口
·clk_out 端口的生成时钟
·data_out 端口的输出延时约束,相对于 clk_out 端口的生成时钟。
图1.带有生成时钟的源同步约束
以下 SDC 命令对输出进行约束。
# Define the input clock
create_clock -period 10 -name clk_100 [get_ports clk_in]
# Apply a generated clock to the output of the PLL
create_generated_clock -name pll_output \
-source [get_pins inst|altpll_component|pll|INCLK[0]] \
[get_pins inst|altpll_component|pll|CLK[0]]
# Apply a generated clock to the clk_out port
create_generated_clock -name clk_out \
-source [get_pins inst|altpll_component|pll|CLK[0]] \
[get_ports clk_out]
set_output_delay -clock clk_out 1.200 [get_ports data_out]
-reference_pin选项
-reference_pin选项是Altera专用SDC扩展,简化了对源同步输出的约束。通过set_input_delay/set_output_delay命令使用-reference_pin选项时,需要规定相对于网表中引脚和端口的输入或者输出延时。
-reference_pin选项自动包括特定端口或者引脚的时钟延时。对于源同步输出,输出延时是相对于输出时钟端口。在图2的电路中,clk_in端口和clk_out端口的延时包含在 -reference_pin选项中。
图2.带有-reference_pin 选项的源同步约束
下面的SDC命令对输出进行约束。这个例子中不需要生成时钟,这是因为-reference_pin选项含有延时 。
# Define the input clock
create_clock -period 10 -name clk_100 [get_ports clk_in]
# Apply a generated clock to the output of the PLL
create_generated_clock -name pll_output \
-source [get_pins inst|altpll_component|pll|INCLK[0]] \
[get_pins inst|altpll_component|pll|CLK[0]]
# Set the output delay with the -reference_pin option
set_output_delay -clock pll_output -reference_pin [get_ports clk_out] \1.200 [get_ports data_out]
用户380721 2012-8-16 10:08