解锁Vivado综合技巧,这份HDL XDC属性设置清单让你事半功倍!(一)

本文转载自: FPGA入门到精通(微信号:weilaikejisaidao)微信公众号

Vivado综合工具支持多种属性设置,可以直接在RTL文件或XDC文件中设置属性。设置属性有助于指导综合工具的操作,生成相应的逻辑电路。如果Vivado综合工具能够识别出属性,就会生成相应的电路;如果不能识别属性,则会将该属性和值存放在生成的网表中。其中,一些属性(如LOC约束)只适用于布线过程,必须保留该属性配置情况。

本文将介绍Vivado综合工具支持的常用属性设置,并给出了Verilog示例,供大家参考。

1、ASYNC_REG

ASYNC_REG属性可将reg类型配置为可接受异步数据的寄存器或带同步链的同步寄存器。该属性默认为FALSE,可以设置为TRUE。该属性既可以在RTL中设置,也可以在XDC文件中设置。

(* ASYNC_REG = "TRUE" *) reg [2:0] sync_regs_r;

2、CASCADE_HEIGHT

(CASCADE_HEIGHT)只适用于UltraScale架构的FPGA,用于设置将块RAM级联为大型RAM的最大长度。通常情况下,工具会根据创建的RAM选择如何级联块RAM,该属性可以用于缩短级联链的长度。该属性需要在RTL中设置,值为0或1时表示禁止任何块RAM的级联。

(* cascade_height *) reg [31:0] ram [1024-1:0];

3、BLACK_BOX

黑盒子属性(BLACK_BOX)用于在RTL设计中设置一个模块,该模块内部的所有层次结构对外都不可见,通常用于调试过程。该属性只能在module、entity或component上设置,仅适用于RTL,不需要设置值。

(* black_box *) module test(clk, in1, in2, out);

4、DIRECT_ENABLE

直接使能属性(DIRECT_ENABLE)用于将一个输入或信号直接作为触发器的使能信号(连接到flop的使能线上)。可以在RTL或XDC中设置。

(* direct_enable = “yes” *) input ena; //Verilog示例
set_property direct_enable yes [get_nets -of [get_ports ena]] #XDC示例

5、CLOCK_BUFFER_TYPE

时钟缓冲器类型属性(CLOCK_BUFFER_TYPE)应用于顶层模块的输入时钟端口上,设置使用哪种时钟缓冲器,默认使用BUFG,可以设置为BUFG、BUFH、BUFIO、BUFMR、BUFR或none。该设置只能在RTL设计中设置

(* clock_buffer_type = “none” *) input clk; //Verilog示例

6、DIRECT_RESET

直接复位属性(DIRECT_RESET)与直接使能属性类似,可用于将一个输入或信号直接作为触发器的复位信号(连接到flop的复位线上)。该属性只对网络(net)类型有效,必须使用get_nets命令来获取网络对象。该属性可在RTL或XDC中设置。

(* direct_reset = “yes” *) input reseta; //Verilog示例
set_property direct_reset yes [get_nets -of [get_ports reseta]] #XDC示例

注意在XDC中,这两个属性只对网络(net)类型有效,必须使用get_nets命令来获取网络对象。

7、EXTRACT_ENABLE

EXTRACT_ENABLE 属性用于设置综合工具对使能信号的管理方式。默认情况下,Vivado 会自动选择是否使用寄存器的使能管脚。如果默认表现没有按设计意图进行时,我们可以使用该属性进行强制设置。例如,在设计中一个信号没有被视为使能信号时,我们可以使用该属性将信号连接到触发器的 CE 管脚上。该属性也只适用于 RTL 设计。示例代码如下:

(* extract_enable = “yes” *) reg reg_t;

除了 EXTRACT_ENABLE 属性,还有 EXTRACT_RESET 属性可用于设置对复位信号的管理方式,其作用和使用方法与 EXTRACT_ENABLE 相同。这两个属性只适用于 RTL 设计。。

8、DONT_TOUCH

DONT_TOUCH 属性可以用于保护信号、模块、实体或组件不被综合工具优化掉。与 KEEP 和 KEEP_HIERARCHY 属性相比,DONT_TOUCH 有更高的优先级,并且在整个流程中都会生效。该属性可用于配置任意信号、module、entity 或 component。示例代码如下:

(* DONT_TOUCH = “yes” *) wire sig;
assign sig = in1 & in2;
assign out = sig & in2; //sig不会被优化掉

(* DONT_TOUCH = “yes” *) module test (clk...); //该层次与接口不会被优化掉

9、FSM_SAFE_STATE

FSM_SAFE_STATE 属性指示Vivado综合向状态机中插入逻辑来检测是否存在非法状态,如果存在则将其修复为正常状态并放在下一个时钟周期。该属性用于设置状态机寄存器,可以在RTL或XDC中设置。可设置的值有:

auto:使用Hamming-3编码进行单bit级自动纠正;

reset_state:使用Hamming-2编码进行单bit级检测,强制状态机进入复位状态;

power_on_state:使用Hamming-2编码进行单bit级检测,强制状态机进入上电状态;

default_state:使用Hamming-2编码进行单bit级检测,强制状态机进入default状态。Default状态即为case语句中设定的状态。

该属性用于设置状态机寄存器,可以在RTL或XDC中设置,示例如下:

(* fsm_safe_state = “reset_state” *) reg [7:0] state_r; //Verilog示例

10、FSM_ENCODING

FSM_ENCODING 属性用于设置状态机寄存器,控制状态机的编码方式,可选参数有独热码(one_hot)、顺序编码(sequential)、johnson编码(johnson)、格雷码(gray)、自动(auto)和无(none)。默认为auto,Vivado会自动选择最佳的编码方式。可以在RTL或XDC中设置。

(* fsm_encoding = “one_hot” *) reg [7:0] state_r; //Verilog示例

最新文章

最新文章