相关阅读
SDC命令详解
https://blog.csdn.net/weixin_45791458/category_12931432.html
all_fanin命令用于创建一个输入端口、引脚和单元对象集合,包含指定对象的扇入时序路径上的对象,关于设计对象和集合的更详细介绍,可以参考下面的博客。
Synopsys:设计对象
https://chenzhang.blog.csdn.net/article/details/147015140?spm=1001.2014.3001.5502 本文针对Design Compiler,但该命令同样存在于PrimeTime、IC Compiler等工具中,它们大致相同,略有差别。all_fanin命令的BNF范式(有关BNF范式,可以参考以往文章)为:
all_fanin
-to sink_list
[-startpoints_only]
[-exclude_bboxes]
[-break_on_bboxes]
[-only_cells]
[-flat]
[-levels count]
[-trace_arcs arc_type]
[-continue_trace pin_types]
//注:该命令的选项和参数顺序任意
指定对象
-to选项用于指定作为向前遍历起点的引脚、端口或线网(其效果与列出该线网的驱动引脚相同),对于列表而言,如果有多于一个对象,需要使用引号或大括号包围(对使用集合无效),关于列表和集合的区别,可以参考下面的博客。
指定仅时序路径起点
-startpoints_only选项用于指定在对象集合中仅包含时序路径起点。默认情况下,对象集合中会包含从指定对象向前遍历直到时序路径起点(对于典型的时序路径是输入端口(包括输入输出双向端口)或触发器的时钟引脚)过程中的所有引脚/输入端口。
指定不包含黑盒
-exclude_bboxes选项用于指定对象集合中不包含黑盒单元及其引脚。
指定停止在黑盒
-break_on_bboxes选项用于指定向前遍历停止在黑盒单元的输出引脚(包括输入输出双向引脚)。默认情况下,如果黑盒单元有从输入引脚到输出引脚的时序弧,会继续向前遍历。
指定仅包含单元
-only_cells选项用于指定对象集合中只包含引脚所属的单元。
指定展平模式
-flat选项用于指定以展平模式执行命令。默认情况下是层次模式,对象集合中只会包含和指定对象在同一层次下的对象(这并不意味着遍历会停止在层次单元引脚)。
下面通过一个例子展示了展平模式和层次模式的区别,图1中存在多次穿越层次的时序路径。

图1 穿越层次的例子
dcnxt_shell> all_fanin -to [get_pins U_A/DFF2_reg/D] -flat
{U_A/DFF1_reg/CK U_A/DFF1_reg/Q U_B/U1/A U_B/U1/Y U_A/DFF2_reg/D}
dcnxt_shell> all_fanin -to [get_pins U_A/DFF2_reg/D]
{U_A/DFF1_reg/CK U_A/DFF1_reg/Q U_A/DFF2_reg/D}
指定级数
-levels选项用于指定向前遍历的最大级数,一个单元属于一级,默认值为无穷大。
指定时序弧类型
-trace_arcs选项用于指定向前遍历过程中的组合逻辑时序弧类型,当设置为timing时,仅追踪有效的组合逻辑时序弧,即未因set_disable_timing命令、set_case_analysis命令、固定值引起的常量传播、工具自动断开组合逻辑环(Timing Loop)和状态相关的时序弧(Conditional Timing Arc)缺少对应状态等原因而失效的组合逻辑时序弧;当设置为all时则不存在该限制。使用此选项将覆盖由fanin_fanout_trace_arcs变量(默认值为timing)设置的值。
该选项对时序逻辑时序弧没用,严格意义上说,该选项的使用能让向前遍历突破只能在一条时序路径上的限制。
指定覆盖默认的遍历行为
-continue_trace选项用于覆盖默认的遍历行为,可以将其指定为generated_clock_source。
当指定为generated_clock_source时,当指定对象在生成时钟的时钟路径上时,遍历不会停在生成时钟源(默认情况下,这是一个时序路径起点),而会继续向前遍历直到时钟源外的时序路径起点(对于典型的时序路径是输入端口(包括输入输出双向端口)或触发器的时钟引脚)。
严格意义上说,该选项的使用能让向前遍历突破只能在一条时序路径上的限制。
下面通过一个例子展示了-continue_trace选项的作用,图2中存在一个分频时钟。

图2 分频时钟的例子
dcnxt_shell> create_clock -name CLK -period 10 [get_ports clk]
1
dcnxt_shell> create_generated_clock -name CLK_DIV2 -source [get_ports clk] -divide_by 2 [get_pins div2_reg_reg/Q]
1
dcnxt_shell> all_fanin -to [get_pins dout_reg/CK]
{div2_reg_reg/Q dout_reg/CK}
dcnxt_shell> all_fanin -to [get_pins dout_reg/CK] -continue_trace generated_clock_source
{div2_reg_reg/CK div2_reg_reg/Q dout_reg/CK}
Multicorner-Multimode支持
该命令部分选项对当前场景生效,部分选项对对所有活跃场景生效。关于场景的更多介绍,可以参考下面的博客。
写在最后
all_fanin命令返回的是输入端口、引脚和单元对象集合,但返回对象集合的命令会自动调用query_objects命令显示对象名列表,执行该命令后可看到对应列表(列表中的对象名数量最多由collection_result_display_limit变量控制,默认为100)。
该命令不依赖当前实例,只根据当前设计进行查询。实际上,使用该命令时,当前实例必须是当前设计,否则会出现No sinks提示。
如果使用current_design命令切换了当前设计,则相对原当前设计得到的对象集合会暂时失效,如下所示。
dcnxt_shell> current_design top
Current design is 'top'.
{top}
dcnxt_shell> set a [all_fanin -to [get_pins cin]]
{cin}
dcnxt_shell> query_objects $a
{cin}
dcnxt_shell> current_design bot
Current design is 'bot'.
{bot}
dcnxt_shell> query_objects $a
Error: No such collection '_sel2040' (SEL-001)
dcnxt_shell> current_design top
Current design is 'top'.
{top}
dcnxt_shell> query_objects $a
{cin}