SDC命令详解:使用集合(Collection)而不是字符串(String)/列表(List)作为命令参数
相关阅读
SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html
在使用SDC命令时,有时直接使用字符串或列表(Tcl中的列表本质上也是用空格分隔的字符串)而不是集合作为命令参数也可以得到正确的结果。例如对于图1所示的电路,下面这些创建时钟的命令是等价的,它们都是以端口clk为源对象创建周期为5的时钟。
# 使用字符串或列表作为参数
create_clock -period 5 clk
create_clock -period 5 "clk"
create_clock -period 5 {clk}# 使用集合作为参数
create_clock -period 5 [get_ports clk]
图1 一个简单的例子
上例并不能体现出两者的差别,但对于参数较多的命令,使用字符串或列表作为命令参数能大大减少命令的长度,如下面这个创建生成时钟的命令。
# 使用字符串作为参数
create_generated_clock -source U1/Y -divide_by 1 -master_clock clk c# 使用集合作为参数
create_generated_clock -source [get_ports U1/Y] -divide_by 1 -master_clock [get_clocks clk] [get_ports c]
这是否意味着,选择使用字符串或列表作为命令参数永远是一个正确的选择呢?还是以图1为例,下面这些设置负载电容的命令是等价的吗?
# 使用字符串或列表作为参数
set_load 0.5 data_out
set_load 0.5 "data_out"
set_load 0.5 {data_out}# 使用集合作为参数
set_load 0.5 [get_ports data_out]
set_load 0.5 [get_nets data_out]
由于负载电容既可以设置在端口上也可以设置在线网上,图1中又存在名字同为data_out的端口和线网,此时仅使用字符串或列表作为命令参数不足以表明设计意图,工具将以默认顺序进行搜索,对于set_load命令而言,首先搜索的是端口然后是线网。
出于对以上两方面的考虑,对于那些参数类别唯一的选项(这可能需要查询命令的手册),可以选择使用字符串或列表以减少命令的长度;对于那些参数类别不唯一的选项,强烈建议使用集合以消除模糊(即使可能设计中不存在重名问题),如下面设置输入延迟的命令所示。
set_input_delay 0.25 -clock clk [get_ports data_in]
为了保险,统一使用集合作为命令参数也是可以接受的,毕竟确保设计意图正确远比减少命令的长度重要。