目录12.FSM_ENCODINGFSM_ENCODING Example (Verilog)FSM_ENCODING Example (VHDL)13.FSM_SAFE_STATEFSM_SAFE_STATE Example (Verilog)FSM_SAFE_STATE Example (VHDL)14.FULL_CASE(Verilog Only)FULL_CASE Example (Verilog)15.GATED_CLOCKGATED_CLOCK Example (Verilog)GATED_CLOCK Example (VHDL)16.IOBIOB Example (Verilog)IOB Example (VHDL)IOB Example (XDC)17.IO_BUFFER_TYPEIO_BUFFER_TYPE Example (Verilog)IO_BUFFER_TYPE Example (VHDL)18.KEEPKEEP Example (Verilog)KEEP Example (VHDL)19.KEEP_HIERARCHYKEEP_HIERARCHY Example (Verilog)On Module:On Instance:KEEP_HIERARCHY Example (VHDL)On Architecture:KEEP_HIERARCHY Example (XDC)On Instance:20.MARK_DEBUGSyntax (Verilog)Syntax Example (Verilog)Syntax (VHDL)Syntax Example (VHDL)Syntax (XDC)Syntax Example (XDC)以下内容直译于xilinx官方文档《UG901》如有错误欢迎批评指正。12.FSM_ENCODINGFSM-Encoding控制状态机的编码。通常Vivado工具根据默认规则为状态机选择一个编码方式这对大多数设计都是有利的。FSM-Encoding参数可设置在状态机寄存器上。其合法值包括“one_hot”、“sequential”、“johnson”、“gray”、“user_encoding”和“none”。默认值为“auto”此时工具将自动确定最佳编码方案。若选择“user_encoding”值则工具仍会推断状态机配置但会采用用户在RTL中指定的编码方式。在RTL和XDC上使用FSM_ENCODING Example (Verilog)(* fsm_encoding one_hot *) reg [7:0] my_state;FSM_ENCODING Example (VHDL)type count_state is (zero, one, two, three, four, five, six, seven);signal my_state : count_state;attribute fsm_encoding : string;attribute fsm_encoding of my_state : signal is sequential;13.FSM_SAFE_STATEFSM-safe_state指示Vivado合成在状态机中插入逻辑以检测是否存在非法状态然后在下一个时钟周期将其放入已知的、良好的状态。例如如果有一个使用“one_hot”编码的状态机而该状态机处于“0101”状态这是“one_hot”的非法状态则该状态机将能够恢复。在状态机寄存器上放置FSMSAFE_STATE属性。您可以在RTL或XDC中设置此属性。取值为auto_safe_state采用汉明码-3编码实现单比特翻转自动校正功能;reset_state通过汉明码-2检测单比特翻转强制状态机进入复位状态;power_on_state通过汉明码-2检测单比特翻转强制状态机进入开机状态;default_state强制状态机进入RTL中指定的默认状态——该状态可选自Verilog代码中case语句的default分支或VHDL代码中case语句的others分支。需注意要使该功能生效RTL中必须包含default或others状态。FSM_SAFE_STATE Example (Verilog)(* fsm_safe_state reset_state *) reg [7:0] my_state;FSM_SAFE_STATE Example (VHDL)type count_state is (zero, one, two, three, four, five, six, seven);signal my_state : count_state;attribute fsm_safe_state : string;attribute fsm_safe_state of my_state : signal is power_on_state;14.FULL_CASE(Verilog Only)FULLCASE指出所有可能的case取值都通过case、casex或casez语句指定。如果指定了case取值则Vivado综合不会为这些case取值创建额外逻辑。该属性应放置在case语句上。只能在RTL中设置。FULL_CASE Example (Verilog)(* full_case *)case select3’b100 : sig val1;3’b010 : sig val2;3’b001 : sig val3;endcase15.GATED_CLOCK门控时钟是一种通过使用逻辑门通常是AND或OR门来控制时钟信号是否传递到寄存器组的技术。其核心思想是如果一组寄存器暂时不需要工作就关掉它们的时钟以节省动态功耗因为时钟网络的翻转是芯片功耗的主要来源之一。Vivado综合流程支持时钟信号的门控转换。具体操作步骤如下在Vivado图形界面中启用开关控件指示工具执行时钟信号转换通过RTL属性指定门控逻辑中的时钟信号只需将该属性设置在对应信号或端口即可。控制 开关的具体操作步骤如下:选择Tools Settings Project Settings Synthesis在Options area将-gated_clock_conversion设置为以下其中一个值之一Off禁用门控时钟转换On若在RTL代码中设置了gated clock属性则会启用门控时钟转换。此选项可让您更精准地控制转换结果Auto当满足以下任一条件时将触发门控时钟转换-gated clock属性设置为true-Vivado综合流程能识别门控信号且存在有效的时钟约束条件。该选项允许工具自主决策。使用KEEP_HIERARCHY、DONT TOUCH和MARK_DEBUG等属性时应格外小心。如果将这些属性放置在需要更改以支持转换的层次结构或实例上它们可能会干扰门控时钟转换。GATED_CLOCK Example (Verilog)(* gated_clock true *) input clk;GATED_CLOCK Example (VHDL)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 true;end test;16.IOBIOB属性控制寄存器是否应进入I/O缓冲区。其值为TRUE或FALSE。将此属性放置在要放入I/O缓冲区的寄存器上。只能在RTL中设置此属性。IOB Example (Verilog)(* IOB true *) reg sig1;IOB Example (VHDL)signal sig1:std_logic;attribute IOB: string;attribute IOB of sig1 : signal is true;IOB Example (XDC)set_property IOB true [get_cells sig1]17.IO_BUFFER_TYPE在任意顶层端口上应用IO_BUFFER_TYPE属性以指示工具使用缓冲器。添加一个值为“NONE”的属性禁用输入或输出缓冲器的自动推断功能——这正是Vivado综合的默认行为。该属性仅支持在RTL中设置且只能在RTL中进行配置。IO_BUFFER_TYPE Example (Verilog)(* io_buffer_type none *) input in1;IO_BUFFER_TYPE Example (VHDL)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;18.KEEP使用KEEP属性可以防止信号被优化。该属性指示综合工具保留其放置的信号该信号将被放置在网表中。将KEEP与其他属性一起使用时要小心。如果其他属性与KEEP冲突通常KEEP属性优先。模块或实体的端口不支持KEEP属性。如果需要保留特定端口请使用-flatten_hierarchy none设置或者在模块或实体本身上放置DONT TOUCH。在无负载信号上使用KEEP属性时需谨慎。合成过程会保留这些信号从而导致流程后续出现的问题。取值为TRUE/FALSE取值为FALSE时不会强制删除信号。仅在RTL中设置此属性。KEEP属性不强制要求保留信号的位置和路径可以通过DONT TOUCH属性来实现。KEEP Example (Verilog)(* keep true *) wire sig1;assign sig1 in1 in2;assign out1 sig1 in2;KEEP Example (VHDL)signal sig1 : std_logic;attribute keep : string;attribute keep of sig1 : signal is true;........sig1 in1 and in2;out1 sig1 and in3;19.KEEP_HIERARCHY阻止 Vivado 综合工具在执行优化时展平Flatten 掉模块的边界。它强制工具将指定的模块或实例作为一个独立的、黑盒式的层级单元进行处理和优化。保留清晰的设计层次结构这对于调试Debug、团队协作、增量编译Incremental Compile 和模块化设计至关重要。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 (VHDL)On Architecture:attribute keep_hierarchy : string;attribute keep_hierarchy of beh : entity is yes;KEEP_HIERARCHY Example (XDC)On Instance:set_property keep_hierarchy yes [get_cells u0]20.MARK_DEBUG告诉 Vivado 工具链综合、实现“请保留这个信号或网线不要优化掉它并使其可用于调试”此属性适用于网对象。Syntax (Verilog)To set this attribute, place the proper Verilog attribute syntax on the signal in question:(* MARK_DEBUG {TRUE|FALSE} *)Syntax Example (Verilog)// Marks an internal wire for debug(* MARK_DEBUG TRUE *) wire debug_wire,Syntax (VHDL)To set this attribute, place the proper VHDL attribute syntax on the signal in question.Declare the VHDL attribute as follows:attribute MARK_DEBUG : string;Specify the VHDL attribute as follows:attribute MARK_DEBUG of signal_name : signal is {TRUE|FALSE};Wheresignal_nameis an internal signal.Syntax Example (VHDL)signal debug_wire : std_logic;attribute MARK_DEBUG : string;-- Marks an internal wire for debugattribute MARK_DEBUG of debug_wire : signal is TRUE;Syntax (XDC)set_property MARK_DEBUG value [get_nets net_name]Wherenet_nameis a signal name.Syntax Example (XDC)# Marks an internal wire for debugset_property MARK_DEBUG TRUE [get_nets debug_wire]参考xilinx官方文档《UG901》