一、前言
在FPGA中用ILA观测设计中的信号时,有时一些多比特信号会被拆分成一些零散的信号,这会增大信号观测的难度。这一问题的产生与vivado的综合工具有关,viavdo在综合时会对一些逻辑信号进行优化、重命名等操作,从而导致信号被拆分。
二、vivado相关综合属性
在对解决该问题之前,先对一些背景知识进行介绍,主要是对综合工具的一些属性设置。本小节内容主要来着Xilinx ug901 vivado综合相关文档。
2.1 KEEP
使用方式:
KEEP Example (Verilog)
(* keep = "true" *) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
支持的 KEEP 值为:
• TRUE:保留信号。
• FALSE:允许优化 Vivado 综合。FALSE 值不会强制工具删除信号。默认值为 FALSE。
使用 KEEP 属性可防止信号被优化或被吸收到逻辑块中的优化。此属性指示合成工具保留它所放置的信号,并将该信号放置在网列表中。
可以在reg ,wire上使用该属性。推荐仅在 RTL 中设置此属性。由于需要保留的信号通常会在读取 XDC 文件之前进行优化,因此在 RTL 中设置此属性可确保使用该属性。
模块或实体的端口不支持 KEEP 属性。如果需要保留特定端口,使用 -flatten_hierarchy none 设置,或者在模块或实体本身上使用DONT_TOUCH属性。
KEEP 属性不会强制布局布线保留信号。作为替代,使用 DONT_TOUCH 属性可以强制保留。
2.2 KEPP_HIERARCHY
使用方式:
KEEP_HIERARCHY Example (Verilog)
On Module:
(* keep_hierarchy = "yes" *) module bottom (in1, in2, in3, in4, out1, out2);
On Instance:
(* keep_hierarchy = "yes" *)bottom u0 (.in1(in1), .in2(in2), .out1(temp1));
KEEP_HIERARCHY Example (XDC)
On Instance:
set_property keep_hierarchy yes [get_cells u0]
KEEP_HIERARCHY用于防止沿层次结构边界进行优化。Vivado 综合工具尝试保持 RTL 中指定的相同通用层次结构,但出于更好的结果质量 (QoR) 原因,它可以扁平化或修改它们。
如果将KEEP_HIERARCHY放置在实例上,则综合工具将使该级别的边界保持静态。该属性会影响综合结果,不应用于描述 3 态输出和 I/O 缓冲器控制逻辑的模块。
KEEP_HIERARCHY可以放置在模块或架构级别或实例中。可以在 RTL 和 XDC 中设置此属性。如果在 XDC 中使用,则只能将其放在实例上。
2.3 DONT_TOUCH
使用方式:
DONT_TOUCH Verilog Examples
Verilog Wire Example
(* dont_touch = "yes" *) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
Verilog Module Example
(* DONT_TOUCH = "yes" *)
module example_dt_ver
(clk,
In1,
In2,
out1);
Verilog Instance Example
(* DONT_TOUCH = "yes" *) example_dt_ver U0
(.clk(clk),
.in1(a),
.in2(b),
out1(c));
DONT_TOUCH的值为 TRUE/FALSE 或 yes/no。可以将此属性放置在任何信号、模块、实体或组件上。
使用 DONT_TOUCH 属性代替 KEEP 或 KEEP_HIERARCHY。DONT_TOUCH的工作方式与 KEEP 或 KEEP_HIERARCHY 属性相同,但是,与 KEEP 和 KEEP_HIERARCHY 不同,DONT_TOUCH 是前向注释的,其作用范围包括布局布线阶段,用于防止布局布线进行逻辑优化。
通常,DONT_TOUCH属性不建议使用在XDC文件中,因为对于信号来说,通常优化是发生在工具读取XDC文件前,因此设置属性可能导致无效。唯一一种推荐使用到XDC中的场景是当RTL代码中使用了DONT TOUCH属性并设置为yes时,想让该属性不生效但又不想改变RTL设计时,可以在XDC文件中再次进行DONT TOUCH属性设置为no的设置,此时后者设置生效,信号将会被优化。
三、ila信号被拆分的问题
有人在xilinx支持网站上提出了该问题:ILA中的信号被拆分成很多部分是什么原因,如何解决? (xilinx.com)
官方回答是建议使用DONT_TOUCH属性。网上也有帖子说使用该属性效果不行:
解决vivado抓取ila信号名错乱问题_vivado为什么ila信号被拆分-CSDN博客
官网的建议笔者尚未尝试,后面将进行验证。目前笔者的观察是该现象多是在mark_debug进行ila观测时出现,笔者将其改为使用ILA IP核后,目前就没有遇到过该问题了。
四、参考资料
xilinx ug901 Vivado Design Suite User Guide_Synthesis_2022