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

举报
李锐博恩 发表于 2021/09/21 22:40:53 2021/09/21
【摘要】 前言 Ports,Pins,Cells,nets以及clock都是FPGA中模块的关键组成部分,地位差不多,tcl中对它们的操作也大同小异。 给出前几篇文章列表,便于查询: 逻辑设计中复位的稳妥处理...

前言

Ports,Pins,Cells,nets以及clock都是FPGA中模块的关键组成部分,地位差不多,tcl中对它们的操作也大同小异。

给出前几篇文章列表,便于查询:

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

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

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

正文

为了不来回翻阅,这里还是得贴出一张图:

端口

何为pins?一目了然!

从这张图中也可以看出,pins是分模块的,不想ports永远都是顶层模块的。

既然如此,获得的pins也一定是指出属于哪个模块的pins等。

以Xilinx的wavegen示例工程为例,我们如何获取内部各个模块的pins?

模块规划如下(这个图确实漂亮,我们自己设计模块的时候,如果要写文档,可以借鉴下,并没有太多花里胡哨的颜色,却又相对直观):
模块划分

  1. 获取模块中的所有pins :get_pins

当然,这各并不实用,因为FPGA中模块太多了(一般来说),那么pins也很多,不易观看。

这里列出部分结果:

get_pins

...
IBUF_rst_i0/O 
IBUF_rst_i0/I 
IBUF_rxd_i0/O 
IBUF_rxd_i0/I 
OBUF_dac_clr_n/O 
OBUF_dac_clr_n/I 
OBUF_dac_cs_n/O 
...
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] 

...
 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  1. 获取包含特定字符的PIN:
get_pins -hier -filter {NAME =~ *uart_tx*}

# 此处省略大多数pin,太多不利于观看
uart_tx_i0/clk_tx 
uart_tx_i0/dout[0] 
uart_tx_i0/dout[1] 
uart_tx_i0/dout[2]

# ......


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 获取时钟pin:
get_pins -hier -filter {IS_CLOCK == 1}


# 此处省略很多pin
char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][0]/C char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][1]/C 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可见,寄存器的C端即时钟端。

  1. 获取输入pins:
get_pins -filter {DIRECTION == IN}



IBUF_rst_i0/I IBUF_rxd_i0/I OBUF_dac_clr_n/I OBUF_dac_cs_n/I OBUF_led_i0/I OBUF_led_i1/I 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 获取输出pins:
get_pins -filter {DIRECTION == OUT}
IBUF_rst_i0/O IBUF_rxd_i0/O OBUF_dac_clr_n/O OBUF_dac_cs_n/O OBUF_led_i0/O OBUF_led_i1/O OBUF_led_i2/O

  
 
  • 1
  • 2
  1. 获取pin的属性

上面我们获得了时钟的pins,我们看看这个时钟PIN的属性:
上面获取的时钟:

 get_pins char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][0]/C


  
 
  • 1
  • 2
set inst [get_pins char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][0]/C ]

  
 
  • 1

char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][0]/C

report_property $inst

  
 
  • 1
Property            Type     Read-only  Value
CLASS               string   true       pin
DIRECTION           enum     true       IN
HD.ASSIGNED_PPLOCS  string*  true       
HOLD_SLACK          double   true       needs timing update***
IS_CLEAR            bool     true       0
IS_CLOCK            bool     true       1
IS_CONNECTED        bool     true       1
IS_ENABLE           bool     true       0
IS_INVERTED         bool     false      0
IS_LEAF             bool     true       1
IS_ORIG_PIN         bool     true       1
IS_PRESET           bool     true       0
IS_RESET            bool     true       0
IS_REUSED           bool     true       0
IS_SET              bool     true       0
IS_SETRESET         bool     true       0
IS_TIED             bool     true       0
IS_WRITE_ENABLE     bool     true       0
LOGIC_VALUE         string   true       needs timing update***
NAME                string   true       char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][0]/C
PARENT_CELL         cell     true       char_fifo_i0/U0/inst_fifo_gen/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_cdc_inst/dest_graysync_ff_reg[0][0]
REF_NAME            string   true       FDRE
REF_PIN_NAME        string   true       C
SETUP_SLACK         double   true       needs timing update***

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

注意,这里的操作完全是仿照获取ports属性的操作。

结尾

总结起来无非就是get_pins加上一些条件,筛选自己需要的一些pins。

也许,这些看起来没有什么用,但其实用途也不在要实实在在,非要用这些东西,我想更大的用于在于了解这一类元素(Ports,Pins,Cells,nets以及clock)的规律,能够加深对模块的理解,它总会有作用的。

例如在看时序报告时,内部器件以及走线延迟,都是这种形式,一眼就知道,有一种熟悉感,有利于我们理解这些之外的内容,例如整体的认识,时序的计算,不至于看了报告,还没来得及分析,就被这一大串的pins,nets给整懵了。

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/120393707

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200