有时,前端在一些关键路径上的设计,可能会出现两个时钟周期驱动和采样一拍数据,来放松关键路径上的时序,这样的设计在STA约束过程中,如果不放松,会导致Timing违例过大,无法收敛,此时的Timing由前端逻辑实现保证,STA约束即可释放,以达到STA出口。
双Cycle驱动采样典型电路
双Cycle的驱动和采样电路,常见的为Lunch Reg和Capture Reg在D端会带有使能所存逻辑,如图3.2.1.1所示。
图3.2.1.1 典型双cycle采样电路结构
Lunch寄存器在使能信号EN为1时,时钟有效沿到来后,将数据采样到Q,当EN信号为0时,Q端锁存。Capture寄存器同理,在EN信号为1时,采样Lunch寄存器驱动的信号,EN为0时,锁存Q端信号。如果要做到双周期采样,EN信号的翻转应为时钟周期的二分频。该电路的时序如图3.2.1.2所示。
图3.2.1.2 双cycle电路设计时序图
MultiCycle的设置为对部分时钟有效沿不做setup或者hold检查,帮助清理Timing Violation,针对上述两拍出一个数据的设计,STA设置如下:
set_multicycle_path 2 -setup -from lunch_reg.clk to capture_reg.d
此时设置从lunch reg的时钟端到capture reg的数据D端为multicycle,放松setup检查一拍,如图3.2.1.3所示。
图3.2.1.3 multicycle检查点
按照上式设定STA约束后,Setup检查会放过一个cycle做路径的setup检查,如图3.2.1.3所示,红色线为capture沿的setup检查,而对于该路径,前一个沿放过Setup检查。如果不设置hold检查,当沿的hold会在capture沿提前一个cycle做,因此如图3.2.1.3所示蓝色线为hold检查沿,此时可以发现,multicycle路径下,capture沿的前一个有效沿可放过setup/hold检查。因此需要新增hold的约束设定。
set_multicycle_path 2 -setup -from lunch_reg.clk to capture_reg.d
set_multicycle_path 1 -hold -from lunch_reg.clk to capture_reg.d
增加设定后,对hold的检查沿如图3.2.1.4所示。
图3.2.1.4 正确的multicycle检查设定
针对上述典型事例设定的multicycle,双沿打拍场景下,中间的沿不做timing检查,lunch沿后两个周期作为capture沿检测setup,capture沿前两个周期检测hold。
3.2.2 单Cycle采样双Cycle驱动典型电路
在有的设计下,存在lunch沿后一个周期进行capture,此时可通过multicycle的设定放松hold检查,单cycle采样双cycle驱动电路如图3.2.2.1所示。
图3.2.2.1 单Cycle采样双Cycle驱动典型电路
该电路下的采样驱动时序如图3.2.2.2所示。
图3.2.2.2 单Cycle采样双Cycle驱动典型电路时序
此时multicycle应当做如下设定:
set_multicycle_path 1 -setup -from lunch_reg.clk to capture_reg.d
set_multicycle_path 1 -hold -from lunch_reg.clk to capture_reg.d
Setup检查为lunch沿的后一个Capture Cycle,而hold检查为Capture的前两个Cycle,如图3.2.2.3所示
这种电路的设计,有助于放松hold,因为跨过一个cycle不检查hold,因此对hold会放松。
Multicycle约束最常见的场景其实是同步时钟分频的lunch和采样问题,这类问题一般分为两类,一类是慢时钟lunch,快时钟capture,另一类是快时钟lunch,慢时钟capture。下面具体对两种场景进行multicycle分析。
慢时钟lunch快时钟capture
举一个例子,RTL设计在慢时钟域驱动数据,在快时钟域采样数据,慢时钟是快时钟的4分频,为同步设计,此时对于快时钟,可以设置multicycle如下:
set_multicycle_path 4 -setup -end -from clk_slow to clk_fast
相关时序分析和setup/hold检查沿如图3.2.3.1所示。
图3.2.3.1 同步分频时钟setup/hold约束
此时hold检查为capture的前一个沿,因此要该类设计还要放松hold,约束设置如下:
set_multicycle_path 4 -setup -end -from clk_slow to clk_fast
set_multicycle_path 3 -hold -end -from clk_slow to clk_fast
相关时序分析和setup检查沿如图3.2.3.2所示。
图3.2.3.2 同步分频时钟setup/hold约束
同理,对于setup的multicycle设定以及hold的multicycle设定,放松的具体cycle可以映射到时序图检查沿上,举例如下约束:
set_multicycle_path 2 -setup -end -from clk_slow to clk_fast
set_multicycle_path 3 -hold -end -from clk_slow to clk_fast
该约束对应的时序有效沿检查如图3.2.3.3。
图3.2.3.3 同步分频时钟setup/hold约束
3.2.4 快时钟lunch慢时钟capture
举另外一个例子,RTL设计在快时钟域驱动数据,在慢时钟域采样数据,慢时钟是快时钟的4分频,为同步设计,此时逻辑应保证信号在快时钟展宽,确保慢时钟能够采样到有效信号,此时也可以设置multicycle:
set_multicycle_path 4 -setup -start -from clk_fast to clk_slow
set_multicycle_path 3 -hold -start -from clk_fast to clk_slow
相关时序分析和setup/hold检查沿如图3.2.4.1所示。
图3.2.4.1 同步分频时钟setup/hold约束
前端RTL设计为在慢时钟下降沿采样数据,则multicycle约束要设定为:
set_multicycle_path 2 -setup -start -from clk_fast to clk_slow
set_multicycle_path 3 -hold -start -from clk_fast to clk_slow
相关时序分析和setup检查沿如图3.2.4.2所示。
图3.2.4.2 同步分频时钟setup/hold约束