关于SDC中的clock

本篇主要介绍ASIC中的clock和SDC约束的方法。

创建clock

举一个例子, 如下如所示的clock 在SDC中如何产生?

sdc的约束可以像下面描述的:

1
2
create_clock -period 5.0 [get_ports CK1]
create_clock -period 5.0 -waveform {1.0 2.0} [get_ports CK2]

multiple clock

有clock MUX 存在时, 常常用exclusive clock 来约束:

1
set_clock_groups -logically_exclusive -group {CK1} -group {CK2}

也可以像这样指定多个clock group, 那么每一个group相对于其他group都是exclusive。

1
2
set_clock_groups -logically_exclusive \
-group {CK1 CK2} -group {CK3 CK4} -group {CK5}

但是如果只指定了一个group, 那么这个group的clock 相对其他所有的clock都是exclusive:

1
set_clock_groups -logically_exclusive -group {CK1 CK2}

clock gating 检查

默认情况下, 工具不会检查clock gating 信号的setup和hold violation。可以使用set_clock_gating_check来进行检查:

1
2
3
4
5
6
set_clock_gating_check
[-setup setup_margin]
[-hold hold_margin]
[-rise] [-fall]
[-high [-low]
[object_list]

如下图所示:

generated clcok

  1. 在STA的时候, 工具会通过combinational 和sequential两种PATH计算clock的latency。如下图所示:

如果在计算latency的时候想要Tool避开这些sequential PATH, 可以使用下面的约束:

1
2
create_generated_clock -name CLK_INV \
-source [get_ports CLK] -divide_by 1 get_pins A/Y
  1. 再看一个非单边时钟约束的例子:如下图所示:

正沿的clock和负沿的clock都会穿过MUX, 所以可以在FF1的Q pin上有两个clock:可以用下面的约束方式创建:

1
2
3
4
5
6
7
create_generated_clock -divide_by 2 -source \
[get_pins FF1/CLK] -name gclk_pos [get_pins FF1/Q]
create_generated_clock -divide_by 2 -source \
[get_pins FF1/CLK] -name gclk_neg \
[get_pins FF1/Q] -preinvert
create_generated_clock -divide_by 2 -source
[get_pins FF1/CLK] -name

-preinvert选项指的是源时钟反向, 而invert是gen clk反向。 区别如下图所示: