For循环在综合约束上的应用
1、for循环的应用场景
IC设计中,一个模块可能会存在很多类似的输入数据,输入时钟,此类信号只名称有数字上的差异,如tx_serdes_clk0,tx_serdes_clk0,...,tx_serdes_clk72,如果每个时钟单独设置,需要很多行,而且不便于修改,此时使用for循环约束,效率高,清晰易懂。DC综合约束一般采用tcl语言编写约束,本文for循环的使用同样要遵守tcl语法。
2、利用for循环设置约束
设置时钟周期
利用for循环创建时钟和相应的cdc时钟
for {set i 0} {$i<73} {incr i} {
create_clock -period $period_720M -name tx_serdes_clk${i} [get_ports tx_serdes_clk${i} ] -add
create_clock -period $period_720M -name tx_serdes_clk${i}__cdc [get_ports tx_serdes_clk${i} ] -add
}
设置跨时钟max delay
输入的tx_serdes_clk0~72之间存在数据跨时钟,因此需要设置max_delay,相同时钟之间不应该设置max_delay,不同的时钟之间需要相互设置,因此下面约束有两行设置代码
for {set i 0} {$i < 73} {incr i}{
for {set j 0} {$j < 73} {incr j} {
if { $i==$j} {
} else {
set_max_delay [expr 0.8 * $period_720M] - from [get_clocks tx_serdes_clk${i}__cdc] -to [get_clocks tx_serdes_clk${j}__cdc]
set_max_delay [expr 0.8 * $period_720M] - from [get_clocks tx_serdes_clk${j}__cdc] -to [get_clocks tx_serdes_clk${i}__cdc]
}
}
}
3、利用for循环的注意事项
- for循环的使用需要注意tcl语法格式,if{ xxx}空格 {},两个}{括号间的必须要有空格
- For循环语法有错误,在综合时的sdc读取打印报告中(sdc_read.log)会报error
- For循环没有语法错误,设置正确,在综合时的sdc读取打印报告中(sdc_read.log)不会报错,也不会产生正确的1标识,而非for循环正确约束会产生正确标识1.