Clock Requirement 时钟要求
Timequest Analyser支持一下几种时钟信号:
- base clock 基准时钟
- derived clock 衍生时钟
- virtual clock 虚拟时钟
时钟信号应当首先在SDC文件中被约束,因为Timequest Analyser读取sdc文件约束命令,顺序是从上到下的,所以时钟信号约束应当首先被定义,然后才是其他的约束。
Base Clocks 基准时钟
基准时钟是外界输入FPGA的时钟信号。与片内PLL不同的是,基准时钟是由外部晶振或者器件产生。基准时钟应当首先被定义,这是因为衍生时钟等其他约束是基于基准时钟的。
使用create_clock SDC命令来对所有的输入时钟进行约束。而该命令的对像通常是FPGA的引脚。为了指定FPGA设备引脚为目标,需要使用get_ports命令。
Example 8–1 展示了指定一个100MHz的系统输入时钟。
Example 8–1. create_clock Command
create_clock -period 10 [get_ports clk_sys]
我们还可以对同一个时钟端口指定多个时钟,通过-add命令就可以了.如果出现有两个外部晶振时钟同时驱动同一个FPGA端口,则SDC命令如下:create_clock -period 10 -<name> clk_100 [get_ports clk_sys ]
create_clock -period 5 -<name> clk_200 [get_ports clk_sys ] - add
Derived Clocks衍生时钟
衍生时钟是由FPGA生成的,并作为一个新的源时钟信号。由PLL或者寄存器分频产生的衍生时钟,需要在基准时钟约束之后进行约束。
我们可以使用create_generated_clock命令来约束所有的generated clock。而create_generated_clock该 命令指定的信号源,应当是你设计中的某个node,而不是之前约束过的clock。
Timequest timing Analyser可以使用derived_pll_clocks 命令来自动约束所有的FPGA中PLL输出。
Example 8–2 展示了一个二分频时钟
Example 8–2. Clock Divider
create_clock -period 10 [get_ports clk_sys]
create_generated_clock -name clk_div_2 -divide_by 2 -source [get_pins reg|clk] [get_pins reg|regout]
note: 当使用create_generated_clock 命令时,Altera建议 -source 选项 指向距离被约束对象最近的那个时钟,而不是时钟输入端口。在Example 8–2 中,-source 选项指向了寄存器的输入时钟引脚,而不是时钟端口clk。
这种用法可以用于当设计中某个端口存在多选一时钟的情形。
Virtual Clocks 虚拟时钟
virtual clock是在设计中没有real source的,并且并不直接与我们的设计发生关联。
virtual clock由命令create_clock 创建,但是不指定对象(Note:言下之意是不指定实际的端口给virtual clock)。Example 8–3展示了创建10ns虚拟时钟的约束。
Example 8–3. Creating a 10 ns Virtual Clock
create_clock -period 10 -name my_virt_clk (Note:这里并没有使用get_port命令指定某个端口)
Figure 8–1 and Example 8–4展示了一个虚拟时钟的应用。这个例子中,FPGA与一个外部器件交互,二者有不同的时钟源,这里外部的时钟源使用了virtual clock指定。
Example 8–4. Virtual Clock Example 1
#create base clock for the design
create_clock -period 5 [get_ports clk_in]
#create the virtual clock for the external register
create_clock -period 10 -name virt_clk -waveform { 0 5 } (Note: virtual clock这里没有指定实际的端口)
#set the output delay referencing the virtual clock
set_output_delay -clock virt_clk -max 1.5 [get_ports data_out]
Altera 建议使用virtual clocks,如果你的模型里有关于外部delay 并使用了set_input_delay 和set_output_delay 约束。这时候,使用derive_clock_uncertainty命令来约束你的设计,就显得十分重要了。The virtual clock prevents the derive_clock_uncertainty command from applying clock uncertainties for either intra- or inter-clock transfers on an I/O interface clock transfer(没看懂啥意思。)virtual clock 阻止derive_clock_uncertainty命令将时钟的uncertaintis作用于内部或者外部的时钟传输。
Altera recommends creating an equivalent virtual clock for each clock in your design that feeds an input or output port。
Altera建议,为我们设计中的每一个基准时钟,创建与其等价的虚拟时钟,这些时钟是用于feed input 或output port的。(refer to Figure 8–2 and Example 8–5)
Example 8–5. .sdc Commands to Constrain the I/O Interface
# Create the base clock for the clock port
create_clock –period 10 –name clk_in [get_ports clk_in]
# Create a virtual clock with the same properties of the base clock
# driving the source register
create_clock –period 10 –name virt_clk_in
# Create the input delay referencing the virtual clock and not the base
# clock
# DO NOT use set_input_delay –clock clk_in <delay_value>
# [get_ports data_in]
set_input_delay –clock virt_clk_in <delay value> [get_ports data_in]
I/O Requirements IO要求
为了全面分析设计,我们必须指定所有的时序要求。这包括指定内部和外部的时序要求。通过指定外部时序要求,IO接口或者FPGA外围器件 is vertified against any system specification。Timequest timing Analyser 支持对输入输出外部delay进行模拟。
我们应当在所有时钟约束完成以后,指定 IO口的约束。
当指定IO口约束时,Altera推荐使用virtual clock用于时序约束。
如果需要查阅set_input_delay和set_output_delay命令的使用指导,请查阅Quartus II TimeQuest Timing Analyzer chapter in volume 3 of the Quartus II Handbook
Input Requirements 输入要求
input requirements 允许对所有输入FPGA的外部延时进行约束。
我们可以使用set_input_delay命令来指定外部输入延时要求。Altera建议使用set_input_delay命令的时候,引用一个virtual clock,通过调用-clock选项 。
使用virtual clock能够让Timequest timing Analyser 正确的得到产生于内部和外部的时钟传输的clock uncertainties。virtual clock定义了输入端口的发射时钟(Launch clock)。而内部的锁存时钟latch clock(捕捉输入数据的)会自动被定义,因为所有芯片内的时钟信号都被定义了。Figure 8–3展示了一个引用virtual clock的输入延时示例。
Output Requirements 输出要求
输出要求允许所有的来自FPGA的外部延时被指定。
我们可以使用set_output_delay 命令来指定外部输出延时要求。set_output_delay命令必须引用一个virtual clock ,通过使用-clock选项。virtual clock指定了输出端口的锁存时钟latch clock。而内部的发射时钟launch clock(用于发射输出data)则自动被定义,因为所有的片内时钟都被定义了。Figure 8–4展示了一个引用virtual clock的输出延时示例。
Exceptions
Timing exceptions 机制,提供了修改默认timing analysis行为的途径,从而让analysis符合我们的设计。
Timequest timing analyser支持一下三种类型的exception
■ False paths 伪路径
■ Minimum and maximum delays 最大最小延时
■ Multicycles 多周期
exception在clocks,input & output delay 约束之后,因为timing exceptions 可以修改默认的analysis属性。
False Paths
当指定某个path 为false path的时候,我们便将它在analysis中去除了。这个path可以是point-to-point 路径,也可以是clock-to-clock路径。下面是一个例子:一个在上电时,只被写入一次的状态寄存器,之后就不再更改状态。
Although these signals often cross clock domains(嘛意思?), you may not want to make false path exceptions to a clock-to-clock path, because some data may transfer across those clock domains(嘛意思?). However, you can selectively make false path exceptions from the static configuration register to all endpoints
虽然这些信号有时会穿过时钟域,但是我们并不需要对clock-to-clock path使用 false path。因为一些数据可能会穿过这个时钟域。这里,我们可以有选择性的对这个状态寄存器的所有扇出 做false path。
Example 8–6展示了如何创建A* 和B* 寄存器之间的false path。
Example 8–6. False Path
set_false_path -from [get_pins A*] -to [get_pins B*]
Timequest timing analyer默认所有的时钟都是相关联的,除非我们另外指定。给clock分组,是一个在clock-to-clock path中创建false path的有效方式。相对于使用set_false_path,set_clock_groups可以让约束命令更短。该命令将相关联的时钟分组,并且使用 -asynchronous 选项来指定互不相关的时钟组。
In the case where multiple clocks are applied to the same port for multi-mode operation, use set_clock_groups with -exclusive to declare these clocks are placed into separate groups and mutually exclusive to each other.
在一个端口有多个时钟源的例子中,使用set_clock_groups命令(附加-exclusive)选项,可以声明这些时钟被放置于不同的分组中,并且是时钟之间是相异的。这个例子中,这些时钟在某一时刻,只能单独存在,不可同时存在。
Minimum and Maximum Delays 最小最大延时
使用set_max_delay和set_min_delay命令来约束异步信号,这些信号并没有明确的clock relationship在我们的设计中,但是却要求有一个有限的path delay。本节的这个exception作用于下面这种path:信号在FPGA中,从一个端口到另一个端口port-to-port,并且不经过寄存器。
如果我们对该路径使用exception,最好同时指定maximum 和Minimum 数值。The set_max_delay and set_min_delay commands modify the setup and hold relationship equal to the constraint’s value.
我们也可以使用set_net_delay命令,来指定最大,最小,或者时钟偏移(skew)in our design。. This constraint is used when no clock relationships are defined or required.当在没有时钟关系被指定的时候,该约束被使用。
For more information about the set_net_delay constraint, refer to the Quartus II TimeQuest Timing Analyzer chapter in volume 3 of the Quartus II Handbook
Multicycles多周期路径
多周期路径在设计中,往往很难被指定。只有了解了设计的整体功能,我们才能了解一个信号是否在默认的时钟沿被更新或采集。通过指定Multicycle,我们可以提高布线(Fitter)的performance以及编译的质量。因为Multicycle放松了一些setup hold relationship。
文章评论(0条评论)
登录后参与讨论