前言

经过前两篇关于ports以及pins的用法讲解,自然而然大概可以猜出cells的使用方法了?

盲猜应该是get_cells类似的语法,其实正是如此。

正文

同理给出一张示意图,再次声明cell的位置:

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

可见,cell的引脚是pin,我们上篇博文中的pins都是cell上的pins,也就是模块的引脚。

如果模块是顶层模块,那模块的引脚也称为管脚,叫做ports,具有具体的位置信息。

同样先以wavegen示例工程为例,我们来讲解有关cells的一些用法:

  1. 获取模块所有的cells,get_cells:
get_cells
IBUF_rst_i0
IBUF_rxd_i0
OBUF_dac_clr_n
OBUF_dac_cs_n
OBUF_led_i0
OBUF_led_i1
OBUF_led_i2
OBUF_led_i3
OBUF_led_i4
OBUF_led_i5
OBUF_led_i6
OBUF_led_i7
OBUF_spi_clk
OBUF_spi_mosi
OBUF_txd
char_fifo_i0
clk_gen_i0
clkx_nsamp_i0
clkx_pre_i0
clkx_spd_i0
cmd_parse_i0
dac_spi_i0
lb_ctl_i0
lb_sel_pin_IBUF_inst
resp_gen_i0
rst_gen_i0
samp_gen_i0 samp_ram_i0
uart_rx_i0 uart_tx_i0

可见获得的cell都是例化名,而不是模块本身的名字,这也提醒我们如果模块就一个的话,用模块名作为例化名是不是更好识别一点(也不见得如此,关键看代码风格,以及公司规定之类)。

还可以看出,cells不仅包含用户定义的模块,还包含用户例化的原语等。

  1. 获取具有特定字符的cell:

例如获取带有clk字符的cell:

get_cells *clk*
OBUF_spi_clk
clk_gen_i0
clkx_nsamp_i0
clkx_pre_i0 clkx_spd_i0

  1. 获取cell的属性:

例如上面我们得到了好多带有clk字符的cell,那么我们获取任意一个的属性:

set inst [get_cells clk_gen_i0]

clk_gen_i0

report_property $inst

Property Type Read-only Value
CLASS string true cell
FILE_NAME string true E:/A1_PRJ/blog_prj/wave_gen/wave_gen.srcs/sources_1/imports/Sources/kintex7/wave_gen.v
IS_BLACKBOX bool true 0
IS_DEBUGGABLE bool true 0
IS_MATCHED bool true 0
IS_ORIG_CELL bool true 1
IS_PRIMITIVE bool true 0
IS_REUSED bool true 0
IS_SEQUENTIAL bool true 0
LINE_NUMBER int true 206
NAME string true clk_gen_i0
PRIMITIVE_COUNT int true 69
REF_NAME string true clk_gen
REUSE_STATUS enum true

用的指令是从ports开始就使用过的:

set inst [get_cells clk_gen_i0]

report_property $inst

  1. 获取包含特定字符的触发器:
    下面展示部分:
get_cells -hier -filter {REF_NAME == FDRE} *samp*

clkx_nsamp_i0/bus_samp_src_reg[0] clkx_nsamp_i0/bus_samp_src_reg[10] clkx_nsamp_i0/bus_samp_src_reg[1] clkx_nsamp_i0/bus_samp_src_reg[2]
# 内容太多,不一一展示

我觉得这么多就够了,其他的例如:

获取所有的时序单元逻辑

get_cells -hier -filter {IS_SEQUENTIAL == 1}

获取模块uart_rx_i0下两层的LUT3

get_cells -filter {REF_NAME == LUT3} uart_tx_i0//*

可自行尝试。