1. 时钟为什么建模?
背景:
默认情况下,即使一个时钟要驱动很多寄存器,DC也不会在时钟连线上加clock
buffer。Clock buffer 或时钟树,一般由后端工具完成。
为了准确的描述时钟树,使综合结果与版图的结果匹配,需要为时钟树建模。
Set_clock_uncertainty、set_clock_latency
、set_clock_transtion
理想的时钟网络latency、skew、transition默认是零。时钟网络还是理想的,但是原来的零值,由这些命令中指定的值替代。
Set_clock_uncertainty
——模拟skew和jitte之和
set_clock_latency —— 模拟 时钟源延迟或连线延迟
set_clock_transtion —— 模式转换时间
2 说明两点
Set_clock_uncertainty
—setup 0.5 给时钟赋予建立时间
Set_clock_transition —setup 给时钟赋予上升转换时间。
两个都有setup选项,但是不是一回事。
set_clock_latency
–source :时钟源延迟,指时钟信号从其实际时钟原地到设计中时钟定义点的传输时间(P94会体会到)。
set_clock_latency : 时钟信号从其定义的点到寄存器时钟引脚的传输时间。
2. Set_input_delay,和set_output_delay
是通过设置外部电路的延迟,来用时钟周期相减,计算留给内部要综合电路的做大延迟。
注意:1)设置的数值是外部的数值,
2)最大延迟是,内部要综合电路的最大延迟
3)只作用于同步电路,内部和外部时钟一致,而不适用于异步打拍的电路。
3. 建立时间预算
背景:如果不知道外部输入延迟和外部输出的建立要求,则需要通过建立时间预算time budget,为输入/输出口设置约束。
一般假设:输入和输出的内部电路仅仅用了时钟的40%(即ts=tt=40%),还有20%富裕量包括tclkq+tsetp。
注:
1)因此需知道,通过time budget如何设置值?
设置值为60%Tperiod,也就是留给内部的Tn+Tsetup 只有40%。
2)如果模块划分,以寄存器输出进行划分,时间预算将变得简单。
但是实际中很少完全这样划分。
Set_input_delay –max
$clk_to_q –clock CLK $all_in_ex_clk
Set_output_delay –max
[expr 10 - $clk_to_q] –clock CLOCK [all_outputs]
设置环境约束
目的:上面的set_input_delay是提供了约束,但要计算路径的延迟,才能知道和约束是否满足。
背景:为了保证输入/输出路径(除时钟外)延时约束的精确性,还需提供环境属性。
1) 输出端,电容负载
为了精确计算输出电路的时间,DC需要知道,输出单元驱动的总负载电容。
默认情况下,DC外部电容负载为0.
DC中用set_load: 说明输入或输出上外部电容负载。
Load_of: 说明电容负载值为工艺库中某一单元引脚的负载。
2) 输入端,转换时间
为了精确计算输出电路的时间,DC需要知道,输入端口的转换时间transition。
Set_driving_cell
说明输入端口是由一个真实的外部单元驱动。
通过驱动,计算输入转换时间:
默认情况下,DC假设输入端口上外部型号转换时间为0.
Set_driving_cell命令在输入端口上加上一个驱动单元,DC将计算输入信号的实际转换时间。
3) 负载预算(load
budget)
背景:
模块划分时,设计者不知道输入端口的外部驱动单元或输出端口的负载,需要通过负载预算,设置环境约束。
负载预算规则:
1. 保守起见,假设输入端口由驱动能力弱的单元驱动
2. 限制每一个输入端口的输入电容(负载)
3. 估算输出端口的驱动模块数目。
规则2,可以通过加限制性的设计规则做到,工艺库中设计规则分别是
”max_capacitance,
max_transition, max_fanout”
注:
1. set_load不仅可,用于设置输出负载,也可用于设置输入负载
2. max_capacitance ,限制每一个输入端口的输入电容(负载)
门延迟和连线延迟
门延迟采用非线性延迟模型。由输入转换时间和输