資料介紹
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/yinyeyy/article/details/106422415
使用xdc文件進行管腳、位置、時序和屬性等約束的時候,經(jīng)常會使用各種get命令。Vivado提供了很豐富的匹配表達式,比如等于==、不等于!=、匹配=~、不匹配!~、、=等等,這些表達式可以通過&&和||進行組合;同時還有大量的狀態(tài)、屬性和單元名稱可用,比如DIRECTION、IN、IS_LOC_FIXED、IS_PRIMITIVE、NAME等等。
我在xdc文件中匹配目標的時候,在可行的情況下更傾向于使用正則表達式。本文就介紹一下我常使用的正則表達式和一些在Vivado中應(yīng)用的特殊之處,同時也有個別自己尚未解決的問題。
1. -hierarchical和-regexp的使用
在匹配FPGA內(nèi)部資源時,比如get_pins、get_cells、get_nets的時候,需要同時使用-hierarchical和-regexp。
-hierarchical表示Vivado在匹配對象的時候,將在工程中不同的層次內(nèi)對該信號進行搜索。如果沒有加這個選項,就必須在匹配字符中顯式且精確的指出匹配對象所在的層次。需要注意的是,當使用get_ports時,不能使用-hierarchical選項。因為ports應(yīng)該位于頂層,沒有層次之分。
-regexp是指本次匹配將使用正則表達式,是必須使用的。
以下是一個使用-hierarchical的例子和注意事項。
首先看第一行藍色的get_cells命令,這里用來獲得ConfigRegs_i這個實例內(nèi)的滿足bus_hsio_dly/..*_fine_sel.*要求的對象??梢钥吹竭\行該命令后得到了下面黑色部分的對象。第三行指令在第一行的基礎(chǔ)上,把頂層實例ConfigRegs_i的限制去掉,也獲得了想要的對象。
再來看第五行的指令。此處去掉了-hierarchical,意味著匹配過程不能穿越不同的層次結(jié)構(gòu)。同時“.*”雖然可以匹配任何除換行符之外的任何數(shù)量的字符,但是卻不能替代在Vivado中表示層次概念的“/”符號。所以匹配過程只在頂層進行搜索,其結(jié)果就如第六行,不能找到所需的對象。
第七行也犯了一樣的錯誤。在沒有使用-hierarchical的情況下,雖然想通過“ConfigRegs_i.*”來匹配頂層的ConfigRegs_i實例,但是“.*”是不能匹配層次符號“/”的。同樣無法獲取對象。
第九行雖然沒有使用-hierarchical,但是通過ConfigRegs_i/指定了對象的層次結(jié)構(gòu),是可以獲得想要的對象的。但是這里有一個限制,即cmph_fine_sel_reg[0]這些對象必須位于ConfigRegs_i下。如果cmph_fine_sel_reg[0]和ConfigRegs_i中間還隔了別的實例,比如ConfigRegs_i例化了CmpDef_i,CmpDef_i內(nèi)部定義了cmph_fine_sel_reg[0]。這種情況下,第九行是無法找到所需對象的。
2. 常用的匹配方法
正則表達式功能強大且復(fù)雜,要完全掌握會花費很長時間。但是對于我們編寫xdc而言,只需要掌握很小一部分內(nèi)容就可以應(yīng)對絕大多數(shù)情況了。最常用的應(yīng)該就是特殊字符和限定符了。下面是比較常用的特殊字符。
常用限定符如下。
我們在FPGA工程中使用正則表達式不是為了進行字符處理,不需要考慮太多的容錯性和可能性。對于我們而言,絕大多數(shù)命名都是確定的,使用正則是為了更方便的獲取對象和簡化匹配過程。
3. 使用示例
3.1 獲取總線類對象
看以下例子。在進行物理約束的時候,為一個總線設(shè)置信號類型,如果一個一個的寫即慢又可能犯錯。使用正則可以將這類信號全部提取出來。以一個從0到31共32路的總線為例。
set_property IOSTANDARD SSTL18_I_DCI [get_ports -regexp {c2c_sync/[.*]}]
以上指令可以獲取所有名字為c2c_sync[]的端口,方括號內(nèi)可能是任意多個數(shù)字。這種寫法不夠準確,在文字處理程序里面會出大問題,但是在FPGA工程中足夠了。當然也可以寫的稍微嚴格點,比如:
set_property IOSTANDARD SSTL18_I_DCI [get_ports -regexp {c2c_sync/[[0-9]{1,2}]}]
這個表達式比上一個更進一步的約束了中括號內(nèi)的內(nèi)容。這里的/[是為了匹配“[”本身,而里面的[0-9]則定義了一個從數(shù)字0到數(shù)字9的字符集,[0-9]后面的{1,2}則表示[0-9]中的任意數(shù)字將出現(xiàn)1次,或以任意兩個數(shù)字的組合出現(xiàn)1次。對于我們的應(yīng)用,做到這一步就夠了。
3.2 簡化匹配表達式
工程中會有一些名字很特殊的信號,比如全局復(fù)位信號,這種信號在工程中往往只會出現(xiàn)一次,我用更加簡單粗暴的方式來獲得。
set_false_path -from [get_cells -regexp -hierarchical .*rst_global_reg.*]
比如上面的例子。通過使用-hierarchical搜索所有層次,通過在rst_global_reg的前后都使用.*來匹配任何可能出現(xiàn)的字符。其中.表示匹配任何非換行符的字符,*表示.可以出現(xiàn)任意次。當然并不推薦這種寫法,因為會增加編譯時匹配對象的負擔??梢允褂酶珳实钠ヅ洹?/p>
對于層次很深的信號,只要保證列出的匹配字符能夠找到我們所要的對象即可。比如某工程有下圖的層次結(jié)構(gòu)。
比如設(shè)計者發(fā)現(xiàn)A_i0模塊內(nèi)部的D_i0內(nèi)的某個關(guān)鍵信號的位置需要優(yōu)化,且設(shè)計者知道該信號在D_i0中唯一。為了拿到這個關(guān)鍵信號,可以使用正則表達式,并且可以略過中間層次的所有模塊。
get_cells -regexp -hierarchical {A_i0/.*/D_i0/start_reg}
3.3 特殊字符的獲取
前面提到過一些特殊字符,比如?、.、/、[等等,如果需要匹配這些字符,需要用到轉(zhuǎn)義符“/”。比如“/.”表示“.”這個字符本身,而不再是匹配符.。
比如在上文提到的get_ports -regexp {c2c_sync/[[0-9]{1,2}]}。這個總線的完整名稱是c2c_sync[0]、c2c_sync[1]......,此處的“/[”就是表示左方括號這個字符本身。而[0-9]中單獨使用的[]就表示一個字符集合。這里有個需要注意的地方,作為字符使用的左方括號左側(cè)加了轉(zhuǎn)義符“/“,而右方括號則不需要加”/“。
另外一個需要注意的是上文中提到的get_cells -regexp -hierarchical ConfigRegs_i/bus_hsio_dly.*_fine_sel.*。這里面bus_hsio_dly是一個systemverilog中的interface,獲取的對象是bus_hsio_dly接口中的cmph_fine_sel_reg信號,其表達方式應(yīng)該是bus_hsio_dly.cmph_fine_sel_reg。此處我使用”.*“來匹配任何非換行字符,所以可以匹配”.“字符。
更合適一點的匹配表達式應(yīng)該是ConfigRegs_i/bus_hsio_dly/..*_fine_sel_reg。第一處修改是明確使用/.來匹配”.“,第二處修改時添加了_reg后綴(Vivado會給寄存器變量默認添加_reg后綴)。如果不添加該后綴,可能會獲取一些不期望的對象。比如使用get_cells時,可能或獲取帶_fine_sel的LUT,比如_fine_sel_i_1等等。
再進一步,我們可能注意到上述匹配獲得的對象打印出來是:
bus_hsio_dly//.cmph_fine_sel_reg
打印結(jié)果不是/.,而是//.。對于這種情況,我猜想是//用來表示轉(zhuǎn)義符”/“。而”//“表示的轉(zhuǎn)義符則作用于特殊字符”.“,用來表示普通字符”.“。
這是個人猜測,但是為什么會這樣?如果哪位清楚原因,不吝賜教。
- visual C++ 2010 CLR字符串與正則表達式 0次下載
- Python正則表達式指南 10次下載
- Python正則表達式的學(xué)習指南 0次下載
- Python正則表達式教程之標準庫的完整介紹及使用示例說明 3次下載
- 如何在C++?Builder6上使用Boost正則表達式庫的詳細資料概述 1次下載
- 基于改進正則表達式規(guī)則分組的內(nèi)網(wǎng)行為審計方案 0次下載
- 正則表達式學(xué)習心得 8次下載
- php 記憶卡 字符串 正則表達式 6次下載
- 基于正則表達式匹配的網(wǎng)絡(luò)設(shè)備自動管理系統(tǒng)_李林廣 0次下載
- 基于正則表達式的數(shù)據(jù)處理應(yīng)用方斌 0次下載
- 源碼-正則表達式應(yīng)用一例 1次下載
- 正則表達式應(yīng)用一例 3次下載
- 精通正則表達式 5次下載
- PHP正則表達式 0次下載
- 正則表達式匹配器 0次下載
- 你還不會gvim正則表達式?一文搞懂! 898次閱讀
- GVIM正則表達式介紹和使用示例 850次閱讀
- 什么是正則表達式?正則表達式如何工作?哪些語法規(guī)則適用正則表達式? 1681次閱讀
- OpenHarmony中使用正則表達式 1063次閱讀
- shell腳本基礎(chǔ):正則表達式grep 1046次閱讀
- 正則表達式(RegularExpression)使用指南 1354次閱讀
- 文本處理技巧之正則表達式 3471次閱讀
- C語言如何使用正則表達式 4693次閱讀
- Vivado IDE全面了解XDC文件的約束順序 3963次閱讀
- 不懂正則表達式?不如借助這三個神器 2057次閱讀
- 教你如何輕松搞定Linux正則表達式 3523次閱讀
- 3分鐘搞定Linux正則表達式! 2755次閱讀
- 校驗數(shù)字校驗字符和特殊需求的常用正則表達式大全 4.9w次閱讀
- 快速入門IPv6和正則表達式 8721次閱讀
- 開發(fā)中常用的一些正則表達式的匯總 2406次閱讀
下載排行
本周
- 1HFSS電磁仿真設(shè)計應(yīng)用詳解PDF電子教程免費下載
- 24.30 MB | 128次下載 | 1 積分
- 2雷達的基本分類方法
- 1.25 MB | 4次下載 | 4 積分
- 3電感技術(shù)講解
- 827.73 KB | 2次下載 | 免費
- 4從 MSP430? MCU 到 MSPM0 MCU 的遷移指南
- 1.17MB | 2次下載 | 免費
- 5有源低通濾波器設(shè)計應(yīng)用說明
- 1.12MB | 2次下載 | 免費
- 6RA-Eco-RA2E1-48PIN-V1.0開發(fā)板資料
- 35.59 MB | 2次下載 | 免費
- 7面向熱插拔應(yīng)用的 I2C 解決方案
- 685.57KB | 1次下載 | 免費
- 8愛普生有源晶體振蕩器SG3225EEN應(yīng)用于儲能NPC、新能源
- 317.46 KB | 1次下載 | 免費
本月
- 12024年工控與通信行業(yè)上游發(fā)展趨勢和熱點解讀
- 2.61 MB | 763次下載 | 免費
- 2HFSS電磁仿真設(shè)計應(yīng)用詳解PDF電子教程免費下載
- 24.30 MB | 128次下載 | 1 積分
- 3繼電保護原理
- 2.80 MB | 36次下載 | 免費
- 4正激、反激、推挽、全橋、半橋區(qū)別和特點
- 0.91 MB | 32次下載 | 1 積分
- 5labview實現(xiàn)DBC在界面加載配置
- 0.57 MB | 21次下載 | 5 積分
- 6在設(shè)計中使用MOSFET瞬態(tài)熱阻抗曲線
- 1.57MB | 15次下載 | 免費
- 7GBT 4706.1-2024家用和類似用途電器的安全第1部分:通用要求
- 7.43 MB | 14次下載 | 免費
- 8H橋中的電流感測
- 545.39KB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935113次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191360次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183329次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81578次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73804次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評論
查看更多