在用Vivado时,必然会用到Tcl。一方面描述约束时要用到,另一方面执行各种操作典型的如生成各种定制化报告等也会用到。这其中涉及到一个重要问题:如何快速且高效地找到目标单元(cell)。什么是cell可以阅读这篇文章:一张图看懂cell, pin, net, port。
通常,Vivado综合后的结果是以层次化方式显示的,这种层次化方式和设计输入阶段的RTL代码层次基本吻合。因此,对于设计者而言,了解原始RTL代码的层次结构有助于查找cell。
方法1:根据目标cell的名字特征查找
Cell的名字其实是包含层次的,类似于操作系统中文件的全名。假如,已知cell名字中包含字符char_cnt_reg,那么可借助该字符查找cell,如下图所示。
这里,选项-hier的目的是层次化寻找。同时,还可以看到Vivado的命名特征:对于寄存器,综合后的名字是在原有名字后添加“_reg”。
方法2:根据REF_NAME查找
REF_NAME实际上是cell的一个属性。每个cell都有自己名字(NAME),也都有自己的REF_NAME。那么什么是REF_NAME呢?从宏观上看,Verilog module关键字后的名字或者VHDL entity关键字后的名字就是REF_NAME。module或entity被实例化后,会有个实例化名字,这个名字将构成NAME的一部分。从微观上看,RTL代码综合后的电路最终映射到具体芯片的查找表、触发器、Block RAM、DSP48等。这些逻辑单元都有自己对应的cell,同样每个cell都有REF_NAME。不同的是,REF_NAME的名字是固定的。例如,如果RTL代码对应的电路是触发器,那么其REF_NAME的可能值是FDCE、FDPE、FDRE或FDSE。如下图所示。
REF_NAME是cell的属性,因此在使用时需要借助选项-filter。例如:查找REF_NAME为FDRE的所有cell,其命令如下图所示。
显然,NAME和REF_NAME可以结合使用,以便更准确地找到目标cell。例如,查找名字中包含特征字符active,且REF_NAME是FDRE的cell,具体命令如下图所示。
这里,使用了“&&”,与Verilog中的含义一致,都表示逻辑与。
方法3:根据其他属性查找
选中一个cell,在其property窗口中可以看到相关的属性。根据属性的特征可以筛选出目标cell。例如,可以根据属性IS_SEQUENTIAL获取设计中的所有时序逻辑单元。
方法4:根据cell与net或pin的关系查找
通过与cell相连的net可以找到cell,通过附属于cell的pin也可以找到cell。看一个典型案例。具体电路如下图所示。图中蓝色标记的net为已知net,现在要找到这个net的所有负载。
具体命令如下图所示。注意第二条命令,先找到与net直接相连的pin。在找pin时,要求pin的方向为输入,也就是pin为输入管脚,同时pin是leaf pin,也就是最底层的pin,这意味着图中的rst_clk_tx不是目标pin,而FDSE的S以及FDRE的R是目标pin。
几个小技巧:
技巧1:
在Schematic视图下,选中一个对象,不管该对象是pin、cell还是net,在Tcl Console中输入命令get_selected_objects,就可以打印出该对象的全名。
技巧2:
如果已知一个对象的全名,在Tcl console中获得该对象,并执行select_objects,然后按下F4,则可显示该对象的Schematic视图。具体操作如下图所示。
技巧3:
如果返回对象很多,不便于查看可通过show_objects命令查看。具体操作如下图所示。该命令会打开一个新窗口,显示找到的对象。
典型案例:
查找指定模块下的所有触发器,假定这里指定的模块为samp_gen_i0下的子模块meta_harden_samp_gen_go_i0,具体命令如下图所示。这里将NAME和REF_NAME结合使用。
如果采用如下命令,则会报告没有匹配对象。这是因为-hier和层次表示符不能同时使用,但可以在选项-filter中使用,如上图所示的那样。
思考一下,根据上述方法,
1. 如果要找到指定模块下的所有Block RAM对应的cell,应采用什么样的命令?
2. 如果要找到指定模块下的所有Ultra RAM对应的cell,应采用什么样的命令?
3. 如果要找到指定模块下的所有DSP48对应的cell,应采用什么样的命令?
4. 如果要找到指定模块下的所有时序单元对应的cell,应采用什么样的命令?
在描述时序约束时,越具体越好,这里介绍的方法可以帮助我们准备找到目标cell。
文 | Lauren 图 | Lauren
Copyright @ Lauren的FPGA
转载事宜请私信 | 获得授权后方可转载