概述
1.参考
https://mp.weixin.qq.com/s/-Oyc0DVUvtFWBmKNWphCtw
2.警惕设计中的DONT_TOUCH
DONT_TOUCH这个综合属性(Attribute)可能很多FPGA工程师在设计中都用过。先说说在什么情况下会使用DONT_TOUCH。
使用DONT_TOUCH的场景
注:这些场景使用DONT_TOUCH未必合理
场景1:保留等效寄存器
最典型的场合是为降低扇出,对高扇出的寄存器进行复制,之后对复制的寄存器和原始寄存器添加DONT_TOUCH属性。因为这些寄存器是等效寄存器,这样做可以保证在综合阶段哲学等效寄存器不会被合并。
场景2:保留观测寄存器
为了观测某一个信号(需要将其添加到ILA中),可能会出现在综合后的网表中无法找到的情况。这时候有些工程师会选择用DONT_TOUCH,使得该寄存器可以被保留在综合后的网表中。
场景3:保留冗余逻辑
举一个简单的例子,两个LUT级联,每个LUT的功能都是取反,这样最后一级LUT的输出与第一级LUT的输入是完全一样的,差别在于延迟。而这种延迟又是设计刻意为之(暂且不管什么原因)。抛开延迟而言,这两个LUT其实是冗余逻辑,可以被优化掉的。一旦使用了DONT_TOUCH就可以保证它们不会被移除。
DONT_TOUCH的作用对象
从上述三个场景不难看出,DONT_TOUCH的作用对象可以是signal(VHDL)/wire(Verilog),也可以是entity(VHDL)/module(Verilog)。看一个简单的例子:(文字来源Page 49, UG901 (v2019.1) June 12, 2019)
DONT_TOUCH的后果
DONT_TOUCH的最直接后果就是使得作用对象在设计的任何阶段都不会被优化掉。“不被优化掉”可能是设计本身的意图,从这个角度看是有利的。例如,手工复制寄存器以降低扇出,就要确保这些等效寄存器自始至终都存在。但如果不是设计本身的意图,就会阻碍工具的优化。例如,寄存器输入端D恒为0,但该寄存器被使用了DONT_TOUCH,那么工具就无法对该路径优化。这样,它既占用了一些逻辑资源,同时又占用了一些布线资源。甚至这些路径会成为时序收敛的瓶颈,从而,在应对时序违例时给我们带来困扰或者误导。
如何找到使用DONT_TOUCH的逻辑单元
可以通过如下Tcl命令找到使用了DONT_TOUCH的逻辑单元(只能用Tcl,没有图形界面方式,可见Tcl多么强大,还不赶紧学习学习,想学习Tcl,点这里Tcl知识库),对应下图第3行。也可以只找使用了DONT_TOUCH的触发器,对应下图第5行
如果需要找到使用了DONT_TOUCH的触发器,且触发器的输入端D恒为高或恒为低,可以使用如下图所示的Tcl脚本
回到最开始我们提到的三个场景,其中第一个场景是合理的,和KEEP不同,DONT_TOUCH可以保证Vivado在任何阶段都不会对设定对象进行优化。场景2其实是可以用MARK_DEBUG,但要在Elaborated Design阶段使用。场景3,在FPGA中不多见。建议在时序收敛初始阶段,不要使用DONT_TOUCH。
最后
以上就是冷艳冷风为你收集整理的VIVADO学习笔记之--DONT_TOUCH1.参考2.警惕设计中的DONT_TOUCH的全部内容,希望文章能够帮你解决VIVADO学习笔记之--DONT_TOUCH1.参考2.警惕设计中的DONT_TOUCH所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复