数字逻辑综合 DC 相关理解 (二)

发布时间 2023-06-26 16:00:55作者: 可达达鸭

1. 线负载模型

  • 根据模型中提供的扇出-线网长度对应表,可以根据线网扇出负载估计线网长度。
    • 根据线网长度和阻抗、容抗、面积对应表格计算线上参数和延时信息。
  • 根据延时计算方式,主要有三种模型:
    • worst_case_tree
    • best_case_tree
    • balanced_tree
set_wire_load_model 

2. 时钟属性

  • 时钟不确定性(uncertainty)包括skew和jitter。

2.1 时钟偏移(skew)

  • 由于线网等延时,导致时钟信号到达寄存器口存在相位差。
  • 其与时钟频率没有直接关系,与时钟线的长度及时钟线驱动的时序单元负载电容、个数有关。

2.2 时钟抖动(jitter)

  • 不随时间积累,时而超前、时而滞后的偏移。与时钟频率也无直接关系。
  • 包括随机抖动和固定抖动
    • 随机抖动来源于:热噪声、Flicker Noise等,与电子器件和半导体器件的电子和空穴特性有关。选择合适的工艺可以得到更小的随机抖动。
    • 固定抖动来源于:开关电源噪声、串扰、电磁干扰等。可以通过优化设计改善固定抖动;如选择合适的电源滤波方案、合理的PCB布局布线。

2.3 时钟延迟(latency)

  • 时钟信号从时钟源(例如:晶振)触发到达触发器时钟端口的延时,为时钟延迟。
    • 主要包括时钟源延迟(source latency)和 时钟网络延迟(network latency)。

3. 时序约束实例

3.1 路径2的约束

  • 为了满足FF2的建立时间要求,触发器翻转时间Tclk2q+寄存器和寄存器之前的组合逻辑延时Tlogic+FF2的建立时间 < 时钟周期。
  • 保持时间一般是满足的,因为传输的延时(Tclk2q+Tlogic)一般都会大于触发器的保持时间。

3.2 路径1的约束

img

  • 首先需要告诉DC被综合模块外的延时为Tclk_q+TM,留下的时间为Tclk-Tclk_q+TM,将其与Tn+Tsetup时间相比较,如果Tn太大,那么DC会对其进行优化,如果最优解也大于留下的时间,那么就会报错。
    • 假设我们已知输入端口外部电路的延迟为4ns,那么可以使用DC的约束指令
    set_input_delay  -max 4 -clock  CLK  [get_ports   A]
    set_input_delay 3.5 -max -clock clk1 [remove_from_collection [all_inputs][get_ports clk1]]
    # 命令表示从所有的输入端口中除掉时钟clk  
    
  • 前面介绍的是不考虑不确定因素的情况,当考虑时钟不确定性,有以下分析
    • 假设时钟不确定时间为U,假设触发器的建立时间为1ns,外部输入延时为D,那么内部N逻辑所允许的最大延迟S为:
      • S = Tclk-D-U-1

3.3 路径3的约束

  • 告诉DC要综合的模块外部电路延时为TT+TFF3,setup,留下的时间为Tclk-TT-TFF3,setup时间,将这个值与Tclk_q+Ts相比较,如果Ts太大,那么DC会对其进行优化,如果最优解也大于留下的时间,那么就会报错。
    • 假设DC约束指令如下
    create_clock  -period 20  [get_ports Clk]
    set_output_delay  -max  7.0  -clock   Clk  [get_ports  B]
    
  • 上面是没有考虑时钟不确定的,假设综合模块内部延时为S(包含T_clk2q和组合逻辑延时),外部输出延时为X(包括外部组合逻辑和后级寄存器的建立时间),时间不确定度为Y,时钟周期为T。
    • 满足T-S-Y=X。

3.4 路径4的约束

  • 分为两种情况
    • 模块内部除了从输入到输出的组合逻辑外还有时序逻辑。
      set_input_delay  0.4  -clock  CLK  -add_delay [get_ports B]
      set_output_delay    0.2  -clock  CLK  -add_delay [get_ports D]
      set_max_delay   $CLK_PERIOD  -from [get_ports B]  -to  [get_ports D] 
      
      • DC计算T>E+F+U+G(其中U为不确定时间)。
    • 模块内部都是组合逻辑,没有时序逻辑,这种需要使用虚拟时钟的概念。