前言

先给出近期文章列表:

逻辑设计中复位的稳妥处理方法?

逻辑设计中需要显式地使用IBUF以及OBUF类似的原语吗?

TCL中关于管脚(Ports)的一些使用方法?

TCL中关于Pins的一些使用方法?

TCL中关于Cells的一些使用方法?

TCL中关于Nets的一些用法?

前面几篇关于TCL的文章都是关于某种对象单独的使用方法,这篇文章就要将他们都联系起来;

我们依然使用wavegen示例工程作为今天的工程来测试:

正文

标题中所说的这些对象:Ports/Pins/Nets/Cells/Clocks,它们之间都有相互的联系

例如:

可以获取与特定cells相关的pins、ports、nets、clocks,当然如果存在的话,就可以获取。

以wavegen中的模块clk_gen_i0为例:

  1. 获取特定模块的pins:
get_pins -of [get_cells clk_gen_i0]

clk_gen_i0/CLK
clk_gen_i0/Q[0]
clk_gen_i0/Q[10]
clk_gen_i0/Q[11]
clk_gen_i0/Q[12]
clk_gen_i0/Q[13]
clk_gen_i0/Q[14]
clk_gen_i0/Q[15] clk_gen_i0/Q[1] clk_gen_i0/Q[2] clk_gen_i0/Q[3] clk_gen_i0/Q[4] clk_gen_i0/Q[5] clk_gen_i0/Q[6] clk_gen_i0/Q[7] clk_gen_i0/Q[8] clk_gen_i0/Q[9] clk_gen_i0/active clk_gen_i0/bit_cnt_reg[4] clk_gen_i0/clk_pin_n clk_gen_i0/clk_pin_p clk_gen_i0/clk_samp clk_gen_i0/clk_tx clk_gen_i0/en_clk_samp clk_gen_i0/int_rst clk_gen_i0/reset clk_gen_i0/rst_clk_tx clk_gen_i0/samp_val
  1. 获取特定模块的ports:
get_ports -of [get_cells clk_gen_i0]
clk_pin_n clk_pin_p
  1. 获取特定模块的nets:
get_nets -of [get_cells clk_gen_i0]

clk_rx clkx_pre_i0_n_31
clkx_pre_i0_n_21
clkx_pre_i0_n_20
clkx_pre_i0_n_19
clkx_pre_i0_n_18 clkx_pre_i0_n_17 clkx_pre_i0_n_16 clkx_pre_i0_n_30 clkx_pre_i0_n_29 clkx_pre_i0_n_28 clkx_pre_i0_n_27 clkx_pre_i0_n_26 clkx_pre_i0_n_25 clkx_pre_i0_n_24 clkx_pre_i0_n_23 clkx_pre_i0_n_22 active dac_spi_i0_n_7 clk_pin_n clk_pin_p clk_samp clk_tx en_clk_samp int_rst rst_i rst_clk_tx samp_val
  1. 获取特定模块的clock
get_clocks -of [get_cells clk_gen_i0]

clk_rx_clk_core
clk_pin_p
clk_samp
clk_tx_clk_core

可见,cells可以和其他所有对象交互;

同理,我们也可以获取特定引脚的cell:

我们先看看和clk_gen_i0相关的pin有哪些:

get_pins -of [get_cells clk_gen_i0]

clk_gen_i0/CLK
clk_gen_i0/Q[0] clk_gen_i0/Q[10] clk_gen_i0/Q[11] clk_gen_i0/Q[12] clk_gen_i0/Q[13] clk_gen_i0/Q[14] clk_gen_i0/Q[15] clk_gen_i0/Q[1] clk_gen_i0/Q[2] clk_gen_i0/Q[3] clk_gen_i0/Q[4] clk_gen_i0/Q[5] clk_gen_i0/Q[6] clk_gen_i0/Q[7] clk_gen_i0/Q[8] clk_gen_i0/Q[9] clk_gen_i0/active clk_gen_i0/bit_cnt_reg[4]

clk_gen_i0/clk_pin_n

clk_gen_i0/clk_pin_p

clk_gen_i0/clk_samp

clk_gen_i0/clk_tx

clk_gen_i0/en_clk_samp clk_gen_i0/int_rst clk_gen_i0/reset clk_gen_i0/rst_clk_tx clk_gen_i0/samp_val

我们关注到一个引脚clk_gen_i0/clk_pin_n ,我们就来看看这个引脚相关的cells:

get_cells -of [get_pins clk_gen_i0/clk_pin_n]

clk_gen_i0

再看看和pin相关的net:

get_nets -of [get_pins clk_gen_i0/clk_pin_n]
clk_pin_n

能获得与pin相关的时钟吗?

也可以,如果存在的话:

get_clocks -of [get_pins clk_gen_i0/clk_core_i0/clk_rx]
clk_rx_clk_core

如果不存在的话:

get_clocks -of [get_pins clk_gen_i0/clk_pin_n]

WARNING: [Vivado 12-1008] No clocks found for command 'get_clocks -of [get_pins clk_gen_i0/clk_pin_n]'.
Resolution: Verify the create_clock command was called to create the clock object before it is referenced.
INFO: [Vivado 12-626] No clocks found. Please use 'create_clock' or 'create_generated_clock' command to create clocks.

会有相应的提醒。

因此,最终的结论是它们之间都有着相互的联系,如果存在的话,可以相互获取。