一、时钟的特征
首先,我们需要强调的是,我们静态时序分析简明教程四的前提,是同步设计电路,STA的静态时序分析,对异步电路,是无效的。
其次,在我们对时钟进行约束的条件下,我们需要掌握时钟的三个特性,他们分别是:
- 周期:是指经过特定时间之后时钟信号重复的动作。
- 有效沿:时钟沿分为上升沿和下降沿。
- 占空比:正相位时间在整个时钟周期所占的百分比。
三、create_clock
create_clock -period period_value [source_objects] [-name clock_name] [-waveform edge_list] [-add] [-comment comment_string]
1. 定义时钟周期
-period 选项用于定义时钟周期,通常情况下,时钟信号的单位默认是ns,但是我们也可以通过set_units设置ps等时钟单位。
create_clock -period 10
上面的语句意味着,我们设置了一个时钟周期为10ns的时钟信号,即100Mhz的时钟频率。
2. 标识时钟源
当我们确定了时钟周期后,我们也需要将时钟信号对应于某一个源对象(比如说是一个clk的端口,或者是触发器的引脚P、网络N),这一步操作就像是将一个STA中的时钟信号映射到电路层面的某一个对象加以驱动
我们可以使用如下的语句加以标识
#代表作为时钟源端口 create_clock -period 10 [get_ports A] #代表作为时钟源的网络 create_clock -period 10 [get_nets N] #代表作为时钟源的引脚,若触发器的名称为FF的话 create_clock -period 10 [get_pins FF/P]
3.命名时钟
当我们将端口做映射后,一个紧接着出现的问题就是这个时钟的命名,假如我们不单独指定名称,工具会将一个默认的名称赋值给该时钟,在STA的时序分析中,时钟的名称是很重要的信息,因为一旦时钟信号被定义和命名的话,其他所有依赖这个时钟的SDC命令,只需要提到该时钟即可。我们通过 -name 的尾缀来命名时钟,比如
#创建一个10ns的时钟,映射到端口A,时钟命名为PCLK create_clock create_clock -period 10 [get_ports A] -name PCLK
4. 指定占空比
这里我们可以简略一点,因为对于数字电路而言,占空比不是1:1的电路结构,种类很少,但假如我们想要指定占空比的话,我们可以使用 -waveform 来进行,贴一下资料地址,感兴趣的读者可以自行查阅学习
Intel® Quartus® Prime Standard Edition User Guide: Timing Analyzer
5. 同源多时钟
当我们设计一个模块的时候,很多时候它的工作频率并不固定,比如一个UART模块,我们可能会将它用在200MHz的APB总线上,也可能会将它用在400M/1GHz的APB总线上,假如这个设计需要在时钟源指定多个时钟,从而满足多IO速度协议的需求,我们可能就需要在SDC中,对于进行约束,我们可以以“-add”的形式增加尾缀,使STA的过程中可以考虑到所有的时钟。假如我们不增加"-add"的话,后一个时钟信号可能就会覆盖掉前一个时钟信号
#同时对CLK端口做100MHz和50MHz的时钟约束 create_clock -name C1 -period 10 [get_ports CLK] create_clock -name C2 -period 20 [get_ports CLK] -add
6. 注释时钟
除了使用tcl语言的注释外,SDC也给工程师们提供了注释的选项,使用 -comment的尾缀,我们可以将时钟信号的文档信息,以备注的形式加以添加,比如:
#设定一个时钟信号,周期为10ns,信号名称为PCLK,映射到clk端口,备注为“Clock for UART input” create_clock -period 10 -name PCLK 9get_ports clk] -comment "Clock for UART input"
7. 虚拟时钟
最终的一个概念是虚拟时钟,顾名思义,虚拟时钟没有办法映射到真实的端口网络或引脚,但是他们的出现可以帮助设计者使用更为灵活的时钟特性(比如时钟偏移等)去进行检查,命令如下:
#建立一个周期为10ns,名称为vclk,不映射到具体端口的时钟(虚拟时钟) create_clock -period 10 -name vclk