作者:猫叔 科学计算tech微信公众号
在前面的章节中,我们用了很多tcl的指令,但有些指令并没有把所有的参数多列出来解释,这一节,我们就把约束中的tcl指令详细讲一下。
我们前面讲到过get_pins和get_ports的区别,而且我们也用过get_cells、get_clocks和get_nets这几个指令,下面就通过一张图直观展现它们的区别。
get_clocks后面的对象是我们之前通过create_clocks或者create_generated_clocks创建的时钟,不在硬件上直接映射。
我们再来看下各个命令的属性。
1. port
我们可以通过tcl脚本查看port的所有属性,比如上面的wave_gen工程中,有一个port是clk_pin_p,采用如下脚本:
set inst [get_ports clk_pin_p]
report_property $inst
显示如下:
get_ports的使用方法如下:
# 获取所有端口
get_ports *
# 获取名称中包含data的端口
get_ports *data*
# 获取所有输出端口
get_ports -filter {direction == out}
# 获取所有输入端口
all_inputs
# 获取输入端口中名字包含data的端口
get_ports -filter {direction == in} *data*
# 获取总线端口
get_ports -filter {bus_name != }
2. cell
按照上面的同样的方式,获取cell的property,如下:
get_cells的使用方法如下:
# 获取顶层模块
get_cells *
# 获取名称中包含字符gen的模块
get_cells *gen*
# 获取clk_gen_i0下的所有模块
get_cells clk_gen_i0/*
# 获取触发器为fdre类型且名称中包含字符samp
get_cells -hier filter {ref_name == fdre} *samp*
# 获取所有的时序单元逻辑
get_cells -hier -filter {is_sequential == 1}
# 获取模块uart_rx_i0下两层的lut3
get_cells -filter {ref_name == lut3} *uart_tx_i0/*/*
3. pin
获取pin的property,如下:
get_pins的使用方法如下:
# 获取所有pins
get_pins *
# 获取名称中包含字符led的引脚
get_pins -hier -filter {name =~ *led*}
# 获取ref_pin_name为led的引脚
get_pins -hier -filter {ref_pin_name == led}
# 获取时钟引脚
get_pins -hier -filter {is_clock == 1}
# 获取名称中包含cmd_parse_i0的使能引脚
get_pins -filter {is_enable == 1} cmd_parse_i0/*/*
# 获取名称中包含字符cmd_parse_i0且为输入的引脚
get_pins -filter {direction == in} cmd_parse_i0/*/*
4. net
获取pin的property,如下:
get_nets的使用方法如下:
# 获取所有nets
get_nets *
# 获取名称中包含字符send_resp_val的网线
get_nets -hier *send_resp_val*
get_nets -filter {name =~ *send_resp_val*} -hier
# 获取穿过边界的同一网线的所有部分
get_nets {resp_gen_i0/data4[0]} -segments
# 获取模块cmd_parse_i0下的所有网线
get_nets -filter {parent_cell == cmd_parse_i0} -hier
# 获取模块cmd_parse_i0下的名称中包含字符arg_cnt[]的网线
get_nets -filter {parent_cell == cmd_parse_i0} -hier *arg_cnt[*]
这5个tcl指令的常用选项如下表:
这5个tcl命令对应的5个对象之间也有着密切的关系,下图所示的箭头的方向表示已知箭头末端对象可获取箭头指向的对象。
以wave_gen中的clk_gen_i0模块为例来说明上面的操作:
# 获取模块的输入引脚
get_pins -of [get_cells {clk_gen_i0/clk_core_i0}] -filter {direction == in}
# 已知引脚名获取所在模块
get_cells -of [get_pins clk_gen_i0/clk_core_i0/clk_in1_n]
# 已知模块名获取与该模块相连的网线
get_nets -of [get_cells {clk_gen_i0/clk_core_i0}]
# 已知引脚名获取与该引脚相连的网线
get_nets -of [get_pins clk_gen_i0/clk_core_i0/clk_rx]
# 已知时钟引脚获取时钟引脚对应的时钟
get_clocks -of [get_pins clk_gen_i0/clk_core_i0/clk_rx]
需要注意的是:
1. -hier不能和层次分隔符“/”同时使用,但“/”可出现在-filter中
2. 可根据属性过滤查找目标对象
3. -filter中的属性为:“==”(相等)、“!=”(不相等)、=~(匹配)、!~(不匹配),若有多个表达式,其返回值为bool类型时,支持逻辑操作(&& ||)
英特尔新设备集团将裁员 或退出可穿戴设备市场
新唐科技M451MLE6AE控制器简介
MWC17核心趋势:从0到M,领先厂商们基于创新服务的转型之道
三星GalaxyA60全面评测 线性马达惊喜不小
AR技术的原理及在汽车安全领域的应用实例分析
FPGA约束中的Tcl指令技术探讨
中国研发出超强碳纳米管纤维,甚至能用于制造通往太空的电梯
FPGA异构计算现状及优化
牵手华为 沃尔沃下一代智能车载互联系统中引入华为“智能互联”服务
三星第七代 OLED 可折叠OLED屏,分辨率达到 3480×2160 像素的 5.5 英寸屏幕
微软或将是大家2020年最值得期待的硬件公司
单片机的硬件特性,区分单片机8位和16位的方法
生物电子微流控平台,用于直流电刺激下受伤细胞群伤口愈合机制研究
一文浅析传输线的阻抗和传输延时
多相DC-DC转换器简介
用MAX2538和KSS IF滤波器构成的蜂窝CDMA混频器性能
易灵思FPGA做替代,到底有多难?
TD-LTE整合Wi-Fi基站爆商机 电信商圈地战开打
可编程逻辑器件APEX20K的特点、功能及应用案例
RFID和NFC之间的关系以及两者之间的区别