Vivado合成允许门控时钟的转换。要执行此转换,请使用:
•Vivado IDE中的一个开关,指示工具尝试转换。
•GATED_CLOCK RTL属性或XDC属性,指示工具关于哪个信号在门控逻辑中是时钟。将此属性放置在作为时钟的信号或端口上。要控制开关:
1.选择工具>设置>项目设置>合成。
2.在“选项”区域中,将-gated_clock_conversion选项设置为以下选项之一价值观
•off:禁用门控时钟转换。
•开启:如果在RTL代码中设置了Gated_clock属性,则发生门控时钟转换。此选项使您能够更好地控制结果。
•自动:如果以下任一事件为真,则发生门控时钟转换:
•gated_clock属性设置为YES。
•Vivado合成可以检测门,并且存在有效的时钟约束集。这选项让工具做出决定。
GATED_CLOCK Verilog Example
(* gated_clock = "yes" *) input clk;
GATED_CLOCK VHDL Example
entity test is port (
in1, in2 : in std_logic_vector(9 downto 0);
en : in std_logic;
clk : in std_logic;
out1 : out std_logic_vector( 9 downto 0));
attribute gated_clock : string;
attribute gated_clock of clk : signal is "yes";
end test;
GATED_CLOCK XDC Example
set_property GATED_CLOCK yes [get_ports clk]
IOB属性控制寄存器是否应进入I/O缓冲区。值为TRUE或错误的将此属性放在I/O缓冲区中所需的寄存器上。此属性可以是仅在RTL中设置。
IOB Verilog Example
(* IOB = "true" *) reg sig1;
IOB VHDL Example
signal sig1:std_logic;
attribute IOB: string;
attribute IOB of sig1 : signal is "true";
在任何顶级端口上应用IO_BUFFER_TYPE属性以指示工具使用缓冲区。添加值为“NONE”的属性以禁用上缓冲区的自动推断输入或输出缓冲区,这是Vivado合成的默认行为。此属性仅支持,并且只能在RTL中设置。
IO_BUFFER_TYPE Verilog Example
(* io_buffer_type = "none" *) input in1;
IO_BUFFER_TYPE VHDL Example
entity test is port(
in1 : std_logic_vector (8 downto 0);
clk : std_logic;
out1 : std_logic_vector(8 downto 0));
attribute io_buffer_type : string;
attribute io_buffer_type of out1: signal is "none";
end test;
使用KEEP属性来防止优化或吸收信号转换为逻辑块。该属性指示合成工具保持其所放置的信号,并且该信号被放置在网表中。例如,如果一个信号是2位AND门的输出,并且它驱动另一个AND门KEEP属性可以用于防止该信号被合并到更大的LUT中包含两个AND门。
小心!将KEEP与其他属性一起使用时要小心。在其他属性与冲突的情况下KEEP,属性通常优先。KEEP通常也与时间约束一起使用。如果信号有时间限制通常会进行优化,KEEP会防止这种情况发生,并允许正确的计时规则习惯于
注意:模块或实体的端口不支持KEEP属性。
如果你需要保持具体端口,使用-plane_hierarch-none设置或在模块或实体上放置DONT_TOUCH它本身
小心!在无负载信号上使用KEEP属性时要小心。合成保持这些信号从而导致流程中稍后出现问题。
例如:
•当一个信号上有MAX_FANOUT属性,而第二个信号上则有KEEP属性时由第一个驱动的信号;第二个信号上的KEEP属性不允许扇出复制。
•对于RAM_STYLE=“块”,当寄存器上有KEEP时,需要成为RAM的一部分时,KEEP属性会阻止块RAM被推断出来。支持的KEEP值为:
•TRUE:保持信号。
•FALSE:允许Vivado合成进行优化。FALSE值不会强制工具移除信号。默认值为FALSE。
您可以将此属性放置在任何信号、寄存器或导线上。
建议:仅在RTL中设置此属性。因为需要保留的信号通常在读取XDC文件之前进行了优化,在RTL中设置此属性可确保使用该属性。
注意:KEEP属性不会强制地点和路线保持信号。相反,这是使用DONT_TOUCH属性完成。
KEEP Verilog Example
(* keep = "true" *) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
KEEP VHDL Example
signal sig1 : std_logic;
attribute keep : string;
attribute keep of sig1 : signal is "true";
....
....
sig1 <= in1 and in2;
out1 <= sig1 and in3;
KEEP_HIERARCHY用于防止沿层次边界进行优化。Vivado合成工具试图保持RTL中指定的相同通用层次结构,但为了更好结果质量(QoR)原因是它可以压平或修改它们。如果将KEEP_HIERARCHY放置在实例上,则合成工具会将边界保持在该实例上水平静态。这可能会影响QoR,也不应用于描述3的控制逻辑的模块-状态输出和I/O缓冲器。KEEP_HIERARCHY可以放置在模块中,或者架构级别或实例。此属性可以在RTL和XDC中设置。如果在中使用XDC,它只能放在实例上。
KEEP_HIERARCHY Verilog Example
On Module
(* keep_hierarchy = "yes" *) module bottom (in1, in2, in3, in4, out1, out2);
On Instance
(* keep_hierarchy = "yes" *) module bottom (in1, in2, in3, in4, out1, out2);
KEEP_HIERARCHY VHDL Example
On Architecture
attribute keep_hierarchy : string;
attribute keep_hierarchy of beh : entity is "yes";
KEEP_HIERARCHY XDC Example
On Instance
set_property keep_hierarchy yes [get_cells u0]
此属性适用于网络对象。一些网络可以具有专用连接或其他禁止用于调试目的的可见性的方面。MARK_DEBUG值为:“TRUE”或“FALSE”。
语法
Verilog语法
要设置此属性,请在有问题的信号上放置正确的Verilog属性语法:
(* MARK_DEBUG = "{TRUE|FALSE}" *)
Verilog Syntax Example
// Marks an internal wire for debug
(* MARK_DEBUG = "TRUE" *) wire debug_wire,
VHDL语法
若要设置此属性,请在有问题的信号上放置正确的VHDL属性语法。按如下方式声明VHDL属性:
attribute MARK_DEBUG : string;
按如下方式指定VHDL属性:
attribute MARK_DEBUG of signal_name : signal is "{TRUE|FALSE}";
其中signal_name是内部信号。
VHDL Syntax Example
signal debug_wire : std_logic;
attribute MARK_DEBUG : string;
-- Marks an internal wire for debug
attribute MARK_DEBUG of debug_wire : signal is "TRUE";
XDC Syntax
set_property MARK_DEBUG value [get_nets <net_name>]
XDC语法示例
通常,MARK_DEBUG的使用是基于层次结构的,可以用于任何详细的顺序元素,如RTL_REG。MARK_DEBUG属性用于网络。它是建议您同时使用get_nets和get_pins命令,如图所示,例如
set_property MARK_DEBUG true [get_nets -of [get_pins\ hier1/hier2/
<flop_name>/Q]]
该推荐使用确保MARK_DEBUG进入连接到该引脚的网络,无论其名称如何。
注意:如果将MARK_DEBUG应用于声明为bit_vector的信号的某个位,则整个总线将MARK_DEBUG属性。此外,如果将MARK_DEBUG放置在层次结构的引脚上,则保持了层次结构。