本文转载自: FPGA入门到精通(微信号:weilaikejisaidao)微信公众号
Vivado综合工具支持多种属性设置,可以在RTL文件或XDC文件中进行设置。这些属性设置有助于指导综合工具的操作,生成相应的逻辑电路。
本文将介绍Vivado综合工具支持的常用属性设置,并给出了Verilog示例,供大家参考。
1、GATED_CLOCK
GATED_CLOCK属性用于控制门控时钟的转换。配合综合设置中的-gated_clock_conversion选项使用,如果将其设置为“off”,就可以禁止门控时钟转换。如果设置为“on”则会进行门控时钟转换,而“auto”则会由工具自动判断。下面是一个示例代码:
(* gated_clock = “true” *) input clk; // 在Verilog中声明clk为门控时钟
2、FULL_CASE
FULL_CASE属性只适用于Verilog语言,它可以自动设定case、casex、casez语句中所有未创建的数值。你只需要在RTL文件中进行设置即可。下面是一个示例代码:
(* full_case *) case select
3’b100 : sig <= val1;
3’b010 : sig <= val2;
3’b001 : sig <= val3;
endcase
3、IO_BUFFER_TYPE
IO_BUFFER_TYPE属性适用于任何顶层模块的端口,可以指定工具如何使用缓冲器。Vivado综合会自动地推断使用哪种类型的缓冲器,输入缓冲器或输出缓冲器。如果将IO_BUFFER_TYPE设置为none则会禁用自动推断。你可以在RTL或XDC文件中进行设置。下面是一个示例代码:
(* IO_BUFFER_TYPE = “none” *) input in1; //Verilog示例
4、IOB
IOB并不是一个综合属性,而是用于实现过程中的属性。它可以指示一个寄存器是否连接到I/O缓存器。你可以在RTL或XDC文件中进行设置。下面是一个示例代码:
(* IOB = “true” *) reg sig1; //sig1将被连接到I/O buffer
5、KEEP_HIERARCHY
Vivado综合工具可以展开层次结构进行优化。为模块设置KEEP_HIERARCHY属性,可以保留该模块在RTL中的输入输出端口,即保留一个完整的边界。只能在RTL中设置,例如:
(* keep_hierarchy = “yes” ) module test (clk,rst, in, out); //模块示例
( keep_hierarchy = “yes” *)test u0 (.clk(clk), … //实例化示例
6、KEEP
KEEP属性可以防止在综合时对信号进行优化,保留信号在网表中而不将其优化掉或纳入其他逻辑块中。请注意,KEEP属性不能用于模块的端口上,可以通过将-flatten_hierarchy属性设置为none或为模块设置DONT_TOUCH属性来实现相应的功能。任何信号、reg、wire都可以设置KEEP属性,只能在RTL中设置,例如:
(* keep = “true” *) wire test; //wire示例
7、MAX_FANOUT
MAX_FANOUT属性用于设置寄存器和组合逻辑信号的最大扇出限制,即最大驱动数量。当超出该限制时,会复制一个完全相同的寄存器或组合逻辑。在工程综合设置中,-fanout_limit是针对整个工程的设置,但对某一信号或寄存器单独设置MAX_FANOUT属性会忽略-fanout_limit的限制。
另外,-fanout_limit不会对控制信号(如置位信号set、复位信号reset、时钟使能信号clock enable)产生作用,但可以使用MAX_FANOUT属性对这些信号的扇出进行限制。可以在RTL或XDC中设置。
(* max_fanout = 50 *) reg test_r; //Verilog示例
8、MARK_DEBUG
MARK_DEBUG属性可以将任何网络对象(net)设置为debug状态,以便在Vivado硬件管理器中进行调试。同时,该属性还会阻止对该信号的优化。可以在RTL或XDC中设置,例如:
(* MARK_DEBUG = “TRUE” *) wire test_w; //Verilog示例
set_property MARK_DEBUG TRUE [get_nets test_w] #XDC示例
9、RAM_STYLE
RAM_STYLE属性指示综合工具如何实现RAM存储器。它可以设置为block(使用BRAM即块RAM来实现)、distributed(使用LUT搭建分布式RAM)、registers(使用寄存器组来替代RAM)或ultra(使用UltraScale中的URAM)。
默认情况下,工具会自动选择实现方法。如果该属性在定义RAM的信号处声明,它仅适用于该信号;如果在某一层次结构处声明,则会应用于该层次中的所有RAM,但不影响该层次的子层次。
(* ram_style = “distributed” *) reg [size-1:0] ram [(1>Deepth)-1:0]; //Verilog示例