Vivado使用技巧(24):HDL/XDC中設定綜合屬性
Vivado綜合工具支援直接在RTL檔案或XDC檔案中設定綜合屬性。如果Vivado識別出設定的屬性,會建立與之相關的邏輯電路;如果不能識別設定的屬性,會將該屬性和值存放在生成的網表中。因為某些屬性,比如LOC約束適用於佈線過程,因此必須保留該屬性配置情況。
本文將介紹Vivado綜合工具支援的所有屬性設定,並給出Verilog示例。
1.ASYNC_REG
該屬性將reg型別配置為可以在D輸入管腳接受非同步資料的暫存器,或者帶同步鏈的同步暫存器。該屬性預設為FALSE,可設定為TRUE。可在RTL或XDC中設定。示例如下:
(* ASYNC_REG = “TRUE”) reg [2:0] sync_regs; //Verilog示例
2.BLACK_BOX
當設定了該屬性時,Vivado綜合工具會為該模組建立一個黑盒子,模組內部的所有層次結構對外都不可見,該功能多用於除錯過程。該屬性可以設定在module、entity或component上,只能在RTL中設定。示例如下:
(* black_box *) module test(in1, in2, clk, out); //Verilog示例,不需要設定值
3.CASCADE_HEIGHT
該屬性只適用於UltraScale架構的FPGA,用於設定將塊RAM級聯為大型RAM的最大長度。通常工具會根據建立的RAM選擇如何級聯塊RAM,該屬性可以用於縮短級聯鏈的長度。需要在RTL中設定,值為0或1時表示禁止任何塊RAM的級聯。示例如下:
(* cascade_height *) reg [31:0] ram [(2**15)-1:0]; //Verilog示例
4.CLOCK_BUFFER_TYPE
該屬性應用於頂層模組的輸入時鐘埠上,設定使用哪種時鐘緩衝器。預設使用BUFG,可以設定為BUFG、BUFH、BUFIO、BUFMR、BUFR或none。該設定只能在RTL設計中,示例如下:
(* clock_buffer_type = “none” *) input clk1; //Verilog示例
5.DIRECT_ENABLE
如果希望一個輸入或訊號直接作為觸發器的使能訊號(連線到flop的使能線上),可以使用該屬性。可以在RTL或XDC中設定,示例如下:
(* direct_enable = “yes” *) input ena1; //Verilog示例
set_property direct_enable yes [get_nets -of [get_ports ena1]] #XDC示例
6.DIRECT_RESET
如果希望一個輸入或訊號直接作為觸發器的復位訊號(連線到flop的復位線上),可以使用該屬性。可以在RTL或XDC中設定,示例與上一屬性類似。注意在XDC中,這兩個屬性只對網路(net)型別有效,必須使用get_nets命令來獲取網路物件。
7.DONT_TOUCH
該屬性與KEEP和KEEP_HIERARCHY屬性作用相同,區別在於DONT_TOUCH 在佈局佈線過程中仍會保持作用。當其他屬性與DONT_TOUCH屬性發生衝突時,DONT_TOUCH屬性有更高的優先順序。該屬性可用於配置任意訊號、module、entity或component。該屬性僅可用於RTL中,示例如下:
(* DONT_TOUCH = “yes” *) wire sig1; //wire示例
assign sig1 = in1 & in2;
assign out = sig1 & in2; //sig1不會被優化掉
(* DONT_TOUCH = “yes” *) module test (clk… //該層次與介面不會被優化掉
8.EXTRACT_ENABLE
設定綜合工具對使能訊號的管理方式。預設情況下,Vivado會根據設計自動選擇是否使用暫存器的使能管腳。當預設表現沒有按設計意圖進行時,可以使用該屬性。比如設計中一個訊號沒有被視作使能訊號,使用該屬性可以強制將訊號接入到觸發器的CE管腳。該屬性僅可用於RTL中,示例如下:
(* extract_enable = “yes” *) reg my_reg; //Verilog示例
另外還有EXTRACT_RESET屬性用來設定對復位訊號的管理方式,作用與使用方法與EXTRACT_ENABLE相同。
9.FSM_ENCODING
該屬性用於設定狀態機暫存器,控制狀態機的編碼方式,可選引數有獨熱碼(one_hot)、順序編碼(sequential)、johnson編碼(johnson)、格雷碼(gray)、自動(auto)和無(none)。預設為auto,Vivado會自動選擇最佳的編碼方式。可以在RTL或XDC中設定,示例如下:
(* fsm_encoding = “one_hot” *) reg [7:0] my_state; //Verilog示例
10.FSM_SAFE_STATE
該屬性指示Vivado綜合向狀態機中插入邏輯來檢測是否存在非法狀態,如果存在則將其修復為正常狀態並放在下一個時鐘週期。比如對於獨熱碼,0101狀態就是一個非法狀態。可設定的值有:
- 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] my_state; //Verilog示例
11.FULL_CASE
該屬性僅用於Verilog中,可以自動設定case、casex、casez語句中所有未建立的值。該屬性只能在RTL中設定,示例如下:
(* full_case *) case select
3’b100 : sig = val1;
3’b010 : sig = val2;
3’b001 : sig = val3;
endcase
12.GATED_CLOCK
該屬性用於控制門控時鐘的轉換,與綜合設定中的-gated_clock_conversion配合使用,設定為off禁止門控時鐘轉換;設定為on遇到RTL程式碼中的GATED_CLOCK設定會進行門控時鐘轉換;設定為auto工具會自動判斷。示例如下:
(* gated_clock = “true” *) input clk; //Verilog示例,申明clk為門控時鐘
13.IOB
IOB不是一個綜合屬性,它用於實現過程中。該屬性指示一個暫存器是否接入到I/O快取器。可以在RTL或XDC中設定,示例如下:
(* IOB = “true” *) reg sig1; //sig1將接到I/O buffer
14.IO_BUFFER_TYPE
該屬性用於任何頂層模組的埠,指示工具如何使用緩衝器。Vivado綜合預設會自動推斷使用輸入緩衝器或輸出緩衝器,IO_BUFFER_TYPE設定為none會禁用自動推斷。可以在RTL或XDC中設定,示例如下:
(* IO_BUFFER_TYPE = “none” *) input in1; //Verilog示例
15.KEEP
使用該屬性阻止對訊號的優化。綜合時帶有該屬性的訊號會保留在網表中,不會被優化掉或者納入其它邏輯塊中。如下面的例子,假設訊號A是一個兩位與門,該訊號又送入另一個與門,預設情況下Vivado會把兩個與門合共為一個LUT來實現相應功能,但設定KEEP屬性即可保留下訊號A。
但是KEEP不能用於模組的埠上,相應功能應該通過將-flatten_hierarchy設定為none或為模組設定DONT_TOUCH屬性來實現。假設為訊號B設定了KEEP,但是該訊號在後面的RTL設計中並沒有使用,綜合會保留訊號B(儘管它沒有任何驅動),但是在後面的流程中還是會引發問題。另外,當KEEP屬性和其它屬性衝突時,KEEP有更高的優先順序。
任何訊號、reg、wire都可設定KEEP屬性,只能在RTL中設定,示例如下:
(* keep = “true” *) wire sig1; //wire示例
assign sig1 = in1 & in2;
assign out = sig1 & in2; //sig1不會被優化掉
16.KEEP_HIERARCHY
Vivado綜合工具可以展開層級結構進行優化,為模組設定KEEP_HIERARCHY屬性,可以保留該模組在RTL中的輸入輸出埠,即保留一個完整的邊界。只能在RTL中設定,示例如下:
(* keep_hierarchy = “yes” *) module bottom (in1… //模組示例
(* keep_hierarchy = “yes” *)bottom u0 (.in1(in1), … //例項化示例
17.MARK_DEBUG
該屬性可將任何網路物件(net)設定為debug狀態,以便在Vivado硬體管理器中除錯,同時還會阻止對該訊號的優化。可以在RTL或XDC中設定,示例如下:
(* MARK_DEBUG = “TRUE” *) wire debug_wire; //Verilog示例
set_property MARK_DEBUG TRUE [get_nets debug_wire] #XDC示例
18.MAX_FANOUT
設定暫存器和組合邏輯訊號的最大扇出限制(即最大驅動數量)。超出該設定時,會複製一個完全相同的暫存器或組合邏輯。綜合設定中的-fanout_limit是對工程整體的設定(詳情見第22篇),對某一訊號或暫存器單獨設定MAX_FANOUT屬性會忽視-fanout_limit的限制。
另一點區別是-fanout_limit不會對控制訊號產生作用,如置位訊號set、復位訊號reset、時鐘使能訊號clock enable,但可以用MAX_FANOUT對這些訊號的扇出進行限制。可以在RTL或XDC中設定,示例如下:
(* max_fanout = 50 *) reg sig1; //Verilog示例
19.PARALLEL_CASE
該屬性僅用於Verilog中,可以將case語句強制用並行結構來實現,而不會被優化為if -elsif的結構。該屬性只能在RTL中設定,示例如下:
(* parallel_case *) case select
3’b100 : sig = val1;
3’b010 : sig = val2;
3’b001 : sig = val3;
endcase
20.RAM_DECOMP
該屬性用於指示綜合工具如何用塊RAM來實現一個較大的RAM。比如需要一個2K*36的RAM,通常會用兩個2K18的BRAM組合實現(為了提高設計速度)。如果將該屬性設定為power,則會用兩個1K36的BRAM來組合實現,這樣在讀寫過程中,使用地址使只需要一個BRAM處於活躍狀態,因此可以降低功耗。
該屬性只有一個可配置值即power,雖然可以降低功耗,但是會增加地址解碼的時間。可以在RTL或XDC中設定,示例如下:
(* ram_decomp = “power” *) reg [size-1:0] myram [2**addr-1:0]; //Verilog示例
set_property ram_decomp power [get_cells myram] #XDC示例
21.RAM_STYLE
指示綜合工具如何實現一個RAM儲存器,可設定為block(使用BRAM即塊RAM來實現)、distributed(使用LUT搭建分散式RAM)、registers(使用暫存器組來替代RAM)或ultra(使用UltraScale中的URAM)。
預設情況下工具會為了得到最好的設計效果而自動選擇。如果該屬性在定義RAM的訊號處申明,則僅作用於該訊號;如果在某一層次結構處申明,將作用於該層次中的所有RAM(但不會影響到該層次的子層次)。可以在RTL或XDC中設定,示例如下::
(* ram_style = “distributed” *) reg [size-1:0] myram [2**addr-1:0]; //Verilog示例
22.ROM_STYLE
指示綜合工具如何實現一個ROM儲存器,可設定為block(使用BRAM即塊RAM來實現)或distributed(使用LUT搭建分散式ROM),預設情況下工具會為了得到最好的設計效果而自動選擇。可以在RTL或XDC中設定,示例如下:
(* rom_style = “distributed” *) reg [size-1:0] rom [2**addr-1:0]; //Verilog示例
23.SHREG_EXTRACT
指示綜合工具是否推斷SRL結構(一種移位暫存器的實現結構)。設定為NO時不會推斷SRL,設計中的移位暫存器會用暫存器組的形式實現。可以在RTL或XDC中設定,示例如下:
(* SHREG_EXTRACT = “no” *) reg [16:0] my_srl; //Verilog示例
24.SRL_STYLE
指示暫存器如何推斷設計中的SRL(僅支援靜態移位暫存器),可設定的值有:
- register:僅使用暫存器資源實現移位暫存器;
- srl:使用SRL結構實現移位暫存器;
- srl_reg:SRL尾部保留一個暫存器;
- reg_srl:SRL頭部保留一個暫存器;
- reg_srl_reg:SRL的首尾各保留一個暫存器;
- block:使用塊RAM實現移位暫存器。
注意當SRL_STYLE和SHREG_EXTRACT同時使用時,後者優先順序更高。該屬性僅可用於RTL設定,示例如下:
(* SRL_STYLE = “register” *) reg [16:0] my_srl; //Verilog示例
25.TRANSLATE_ON/OFF
這兩個屬性用於指示綜合工具忽略一段程式碼。該屬性通過放在註釋行中來實現,且註釋必須以synthesis、synopsys、pragma中的一個關鍵詞為開頭。但注意:如果需要忽視的程式碼塊會影響到設計功能表現,模擬器會試圖呼叫這段程式碼,因此會出現“mismatch”的情況。該屬性只能在RTL中設定,Verilog示例如下:
// synthesis translate_off
Code…
// synthesis translate on
26.USE_DSP
老版本中為USE_DSP48,後來FPGA中增加了其它大小的新DSP塊,更改為USE_DSP。雖然USE_DSP48仍然有效,但推薦使用USE_DSP命令。
該屬性用於指示綜合工具如何處理算術結構,預設情況下乘法器、乘加、乘減、乘累加型別的結構都會用DSP單元實現。雖然加法器、減法器、累加器也可以用DSP單元實現,但預設會使用邏輯單元實現,可以使用該屬性將其設定為在DSP單元中實現。
引數值可選擇logic(專門指示異或結構用DSP單元來實現)、yes或no(指示是否將邏輯用DSP單元實現),前者必須在module/architecture處申明,後者可以在訊號、architecture、component、entity、module處申明。示例如下:
(* use_dsp = “yes” *) module test(in1, in2, clk. out); //Verilog示例
使用自定義屬性
Vivado支援在RTL中使用自定義屬性,通常是為了在其它工具的綜合後流程中使用。前文提到過,Vivado綜合工具遇到不能識別的屬性時也會將其儲存到網表中,但是如果Vivado綜合工具可以優化一個帶有自定義屬性的物件,優化後該屬性也就丟失了,因此該物件必須使用DONT_TOUCH或KEEP_HIERARCHY屬性來阻止優化掉帶有自定義屬性的物件。
自定義屬性可以用於某一層次或某一訊號。當作用於層次結構(hierarchy)時,必須在綜合設定中將-flatten_hierarchy設定為none,或者配置一個KEEP_HIERARCHY屬性。因為預設情況下綜合會展開所有的層次結構,優化設計之後,再按RTL設計來重組設計結構(詳情見第22篇),這樣自定義屬性可能會丟失。示例程式碼如下:
(* my_att = “value”, DONT_TOUCH = “yes” *) module test(in1, … //Verilog示例
當作用於訊號(signal)時,也要用DONT_TOUCH或KEEP屬性來避免優化導致自定義屬性丟失。比如一個訊號根據RTL程式碼可能會用暫存器也可能用net來實現。綜合工具會檢查同時帶有自定義屬性和DONT_TOUCH屬性的物件,如果net是由暫存器驅動,綜合會將自定義屬性複製到暫存器和net上,因為這種情況下會有使用自定義屬性的多種方法,有些屬性也被希望能同時用於暫存器 和net。示例程式碼如下:
(* my_att = “value”, DONT_TOUCH = “yes” *) reg sig; //Verilog示例
在XDC檔案中使用綜合屬性
上文提到的屬性有些可以用在XDC檔案中。總的來說,那些在綜合開始階段使用的屬性和對編譯有影響的屬性只能用在RTL中;用於綜合結束階段和描述綜合如何建立邏輯的屬性可以用在XDC檔案中。
比如KEEP和DON’T_TOUCH就不允許用在XDC中,因為當綜合從XDC檔案中讀取到屬性時,這兩個屬性可能早已在綜合過程中被優化掉了。在XDC檔案中設定綜合屬性可以按照如下語法模板:
set_property <attribute> <value> <target>
另外,在Elaborated設計中也可以設定屬性。先開啟Elaborated設計,在原理圖視窗中或RTL網表視窗中選擇需要設定屬性的物件。
在屬性視窗的Properties標籤中,修改屬性值。如果沒有目標屬性,則右鍵->Add Properties,選擇新增屬性。點選儲存即可將屬性設定新增到XDC檔案中。
相關文章
- Vivado使用技巧(22):綜合策略與設定的選擇
- Vivado使用技巧(26):HDL編寫技巧
- Vivado使用技巧(23):綜合執行與OOC
- Vivado使用技巧(5):屬性編輯器的使用
- Vivado使用技巧(11):設定FPGA配置模式FPGA模式
- Vivado使用技巧(19):使用Vivado Simulator
- Echarts中Option屬性設定Echarts
- Vivado使用技巧(12):設定DCI與內部參考電壓
- Vivado使用技巧(13):CSV檔案定義IO Ports
- 表屬性設定
- python中__setattr__的屬性設定Python
- Vivado使用技巧(27):RAM編寫技巧
- Vivado使用技巧(21):模擬中的Debug特性
- HDL/FPGA學習筆記二十五:Vivado PLL IP核的使用FPGA筆記
- jQuery設定disabled屬性與移除disabled屬性jQuery
- Vivado使用技巧(15):DRC設計規則檢查
- AppTheme屬性設定集合APP
- Cookie設定HttpOnly屬性CookieHTTP
- Vivado使用技巧(17):建立IBIS模型模型
- Xcode設定自己的個性屬性XCode
- 行內元素屬性設定
- 執行緒屬性設定執行緒
- CSS內聯樣式的使用,設定字型屬性CSS
- Vivado使用技巧(6):Messages視窗管理
- Vivado使用技巧(29):約束功能概述
- Vivado使用技巧(20):Waveform功能詳解ORM
- Vivado使用技巧(18):模擬功能概述
- Vivado使用技巧(33):時序異常
- Vivado使用技巧(25):Block Synthesis技術BloC
- C#反射設定屬性值和獲取屬性值C#反射
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- Vivado使用技巧(9):COE檔案使用方法
- CSS中常用的屬性設定CSS
- jQuery - 設定內容和屬性jQuery
- Vivado使用技巧(4):查詢功能詳解
- Vivado使用技巧(3):Force Up-to-Date功能
- Vivado使用技巧(8):Core Container打包IP核AI
- Vivado使用技巧(34):路徑分割現象