集成电路设计

时序约束(timing constraint / SDC)

想象你把一个包裹交给快递员,叮嘱一句「这个必须 9:00 整准时送到」。你并没有告诉他走哪条路——你只是定下了截止时间,找出一条能赶上的路线是他的事。时序约束正是这样一种指令,只不过它面向的是你的芯片设计工具。你告诉工具时钟跳得多快、截止时间是多少,工具就自己去推算出能踩点完成的门电路和连线。

你要声明的最重要的一件事是时钟周期——比如「这个时钟跑在 1 GHz,所以一个信号大约有 1 纳秒的时间,从一个寄存器走到下一个」。仅凭这一句话,工具就能为设计中的各条路径推出一份时序预算。然后它会两次倚重这份预算:逻辑综合靠它来挑选更快或更小的门,好让逻辑装进预算之内;静态时序分析则在事后靠它来核查,确保没有信号来得太晚(建立 setup)——或者同样糟糕,来得太早(保持 hold)。没有约束,工具就没有可瞄准的截止时间,「这块芯片够快吗?」也就成了一个无从回答的问题。

除了时钟本身,你还要描述你这个模块之外的世界——在信号到达你的输入端之前,周期里已经有多少被上游逻辑用掉了(输入延迟 input delay),以及在你的输出之后,下游那块芯片还需要多少时间(输出延迟 output delay)——并且为那些不按常理出牌的路径划出例外:一条在逻辑上根本不会传播、压根不该参与时序检查的伪路径(false path),或者一条你有意允许它用两个甚至更多时钟周期才完成的多周期路径(multicycle path)。在实践中,这一切都写在 SDC(Synopsys Design Constraints,新思设计约束)里——一种基于 Tcl 的文本格式,几乎每家厂商的工具都能读它,于是当你的设计在一个个工具之间流转时,同样的意图也得以一路保留下来。

# 1 GHz clock on port clk; data_in already consumes 0.3 ns upstream before it arrives
create_clock -name clk -period 1.0 [get_ports clk]
set_input_delay 0.3 -clock clk [get_ports data_in]

一段最小的 SDC 片段——先定义一个 1 ns 的时钟,再声明在输入到达之前,周期里有多少时间花在了模块之外。

人们常把「SDC」当作「时序约束」的同义词,但两者并不完全是一回事:SDC 是文件格式(诞生于新思 Synopsys),而时序约束是底层的意图——也就是时钟与预算——只是恰好被这个文件编码了下来。同样的意图也可以用某个工具自家的命令来表达;SDC 的好处只是让它能在工具之间通用。

又称
SDCSDC constraintsclock constrainttiming budget时序约束時序約束