0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

正則表達(dá)式在Vivado約束文件中的應(yīng)用

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2022-02-08 11:26 ? 次閱讀

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/yinyeyy/article/details/106422415

使用xdc文件進(jìn)行管腳、位置、時(shí)序和屬性等約束的時(shí)候,經(jīng)常會(huì)使用各種get命令。Vivado提供了很豐富的匹配表達(dá)式,比如等于==、不等于!=、匹配=~、不匹配!~、、=等等,這些表達(dá)式可以通過&&和||進(jìn)行組合;同時(shí)還有大量的狀態(tài)、屬性和單元名稱可用,比如DIRECTION、IN、IS_LOC_FIXED、IS_PRIMITIVE、NAME等等。

我在xdc文件中匹配目標(biāo)的時(shí)候,在可行的情況下更傾向于使用正則表達(dá)式。本文就介紹一下我常使用的正則表達(dá)式和一些在Vivado中應(yīng)用的特殊之處,同時(shí)也有個(gè)別自己尚未解決的問題。

1. -hierarchical和-regexp的使用

在匹配FPGA內(nèi)部資源時(shí),比如get_pins、get_cells、get_nets的時(shí)候,需要同時(shí)使用-hierarchical和-regexp。

-hierarchical表示Vivado在匹配對(duì)象的時(shí)候,將在工程中不同的層次內(nèi)對(duì)該信號(hào)進(jìn)行搜索。如果沒有加這個(gè)選項(xiàng),就必須在匹配字符中顯式且精確的指出匹配對(duì)象所在的層次。需要注意的是,當(dāng)使用get_ports時(shí),不能使用-hierarchical選項(xiàng)。因?yàn)閜orts應(yīng)該位于頂層,沒有層次之分。

-regexp是指本次匹配將使用正則表達(dá)式,是必須使用的。

以下是一個(gè)使用-hierarchical的例子和注意事項(xiàng)。

pIYBAGAKB9yAJCbYAAA5Hntw-xs125.png

首先看第一行藍(lán)色的get_cells命令,這里用來獲得ConfigRegs_i這個(gè)實(shí)例內(nèi)的滿足bus_hsio_dly/。.*_fine_sel.*要求的對(duì)象??梢钥吹竭\(yùn)行該命令后得到了下面黑色部分的對(duì)象。第三行指令在第一行的基礎(chǔ)上,把頂層實(shí)例ConfigRegs_i的限制去掉,也獲得了想要的對(duì)象。

再來看第五行的指令。此處去掉了-hierarchical,意味著匹配過程不能穿越不同的層次結(jié)構(gòu)。同時(shí)“.*”雖然可以匹配任何除換行符之外的任何數(shù)量的字符,但是卻不能替代在Vivado中表示層次概念的“/”符號(hào)。所以匹配過程只在頂層進(jìn)行搜索,其結(jié)果就如第六行,不能找到所需的對(duì)象。

第七行也犯了一樣的錯(cuò)誤。在沒有使用-hierarchical的情況下,雖然想通過“ConfigRegs_i.*”來匹配頂層的ConfigRegs_i實(shí)例,但是“.*”是不能匹配層次符號(hào)“/”的。同樣無法獲取對(duì)象。

第九行雖然沒有使用-hierarchical,但是通過ConfigRegs_i/指定了對(duì)象的層次結(jié)構(gòu),是可以獲得想要的對(duì)象的。但是這里有一個(gè)限制,即cmph_fine_sel_reg[0]這些對(duì)象必須位于ConfigRegs_i下。如果cmph_fine_sel_reg[0]和ConfigRegs_i中間還隔了別的實(shí)例,比如ConfigRegs_i例化了CmpDef_i,CmpDef_i內(nèi)部定義了cmph_fine_sel_reg[0]。這種情況下,第九行是無法找到所需對(duì)象的。

2. 常用的匹配方法

正則表達(dá)式功能強(qiáng)大且復(fù)雜,要完全掌握會(huì)花費(fèi)很長(zhǎng)時(shí)間。但是對(duì)于我們編寫xdc而言,只需要掌握很小一部分內(nèi)容就可以應(yīng)對(duì)絕大多數(shù)情況了。最常用的應(yīng)該就是特殊字符和限定符了。下面是比較常用的特殊字符。

pIYBAGAKCF-AbiVSAABn6kj4D0s793.png

常用限定符如下。

pIYBAGAKCJ2AALooAABAaZ5sz04170.png

我們?cè)贔PGA工程中使用正則表達(dá)式不是為了進(jìn)行字符處理,不需要考慮太多的容錯(cuò)性和可能性。對(duì)于我們而言,絕大多數(shù)命名都是確定的,使用正則是為了更方便的獲取對(duì)象和簡(jiǎn)化匹配過程。

3. 使用示例

3.1 獲取總線類對(duì)象

看以下例子。在進(jìn)行物理約束的時(shí)候,為一個(gè)總線設(shè)置信號(hào)類型,如果一個(gè)一個(gè)的寫即慢又可能犯錯(cuò)。使用正則可以將這類信號(hào)全部提取出來。以一個(gè)從0到31共32路的總線為例。

set_property IOSTANDARD SSTL18_I_DCI [get_ports -regexp {c2c_sync/[.*]}]

以上指令可以獲取所有名字為c2c_sync[]的端口,方括號(hào)內(nèi)可能是任意多個(gè)數(shù)字。這種寫法不夠準(zhǔn)確,在文字處理程序里面會(huì)出大問題,但是在FPGA工程中足夠了。當(dāng)然也可以寫的稍微嚴(yán)格點(diǎn),比如:

set_property IOSTANDARD SSTL18_I_DCI [get_ports -regexp {c2c_sync/[[0-9]{1,2}]}]

這個(gè)表達(dá)式比上一個(gè)更進(jìn)一步的約束了中括號(hào)內(nèi)的內(nèi)容。這里的/[是為了匹配“[”本身,而里面的[0-9]則定義了一個(gè)從數(shù)字0到數(shù)字9的字符集,[0-9]后面的{1,2}則表示[0-9]中的任意數(shù)字將出現(xiàn)1次,或以任意兩個(gè)數(shù)字的組合出現(xiàn)1次。對(duì)于我們的應(yīng)用,做到這一步就夠了。

3.2 簡(jiǎn)化匹配表達(dá)式

工程中會(huì)有一些名字很特殊的信號(hào),比如全局復(fù)位信號(hào),這種信號(hào)在工程中往往只會(huì)出現(xiàn)一次,我用更加簡(jiǎn)單粗暴的方式來獲得。

set_false_path -from [get_cells -regexp -hierarchical .*rst_global_reg.*]

比如上面的例子。通過使用-hierarchical搜索所有層次,通過在rst_global_reg的前后都使用.*來匹配任何可能出現(xiàn)的字符。其中。表示匹配任何非換行符的字符,*表示??梢猿霈F(xiàn)任意次。當(dāng)然并不推薦這種寫法,因?yàn)闀?huì)增加編譯時(shí)匹配對(duì)象的負(fù)擔(dān)??梢允褂酶珳?zhǔn)的匹配。

對(duì)于層次很深的信號(hào),只要保證列出的匹配字符能夠找到我們所要的對(duì)象即可。比如某工程有下圖的層次結(jié)構(gòu)。

比如設(shè)計(jì)者發(fā)現(xiàn)A_i0模塊內(nèi)部的D_i0內(nèi)的某個(gè)關(guān)鍵信號(hào)的位置需要優(yōu)化,且設(shè)計(jì)者知道該信號(hào)在D_i0中唯一。為了拿到這個(gè)關(guān)鍵信號(hào),可以使用正則表達(dá)式,并且可以略過中間層次的所有模塊。

get_cells -regexp -hierarchical {A_i0/.*/D_i0/start_reg}

3.3 特殊字符的獲取

前面提到過一些特殊字符,比如?、。、/、[等等,如果需要匹配這些字符,需要用到轉(zhuǎn)義符“/”。比如“/?!北硎尽??!边@個(gè)字符本身,而不再是匹配符。。

比如在上文提到的get_ports -regexp {c2c_sync/[[0-9]{1,2}]}。這個(gè)總線的完整名稱是c2c_sync[0]、c2c_sync[1]。..。..,此處的“/[”就是表示左方括號(hào)這個(gè)字符本身。而[0-9]中單獨(dú)使用的[]就表示一個(gè)字符集合。這里有個(gè)需要注意的地方,作為字符使用的左方括號(hào)左側(cè)加了轉(zhuǎn)義符“/“,而右方括號(hào)則不需要加”/“。

另外一個(gè)需要注意的是上文中提到的get_cells -regexp -hierarchical ConfigRegs_i/bus_hsio_dly.*_fine_sel.*。這里面bus_hsio_dly是一個(gè)systemverilog中的interface,獲取的對(duì)象是bus_hsio_dly接口中的cmph_fine_sel_reg信號(hào),其表達(dá)方式應(yīng)該是bus_hsio_dly.cmph_fine_sel_reg。此處我使用”.*“來匹配任何非換行字符,所以可以匹配”?!白址?。

更合適一點(diǎn)的匹配表達(dá)式應(yīng)該是ConfigRegs_i/bus_hsio_dly/。.*_fine_sel_reg。第一處修改是明確使用/。來匹配”。“,第二處修改時(shí)添加了_reg后綴(Vivado會(huì)給寄存器變量默認(rèn)添加_reg后綴)。如果不添加該后綴,可能會(huì)獲取一些不期望的對(duì)象。比如使用get_cells時(shí),可能或獲取帶_fine_sel的LUT,比如_fine_sel_i_1等等。

再進(jìn)一步,我們可能注意到上述匹配獲得的對(duì)象打印出來是:

bus_hsio_dly//.cmph_fine_sel_reg

打印結(jié)果不是/。,而是//。。對(duì)于這種情況,我猜想是//用來表示轉(zhuǎn)義符”/“。而”//“表示的轉(zhuǎn)義符則作用于特殊字符”?!埃脕肀硎酒胀ㄗ址?。“。

這是個(gè)人猜測(cè),但是為什么會(huì)這樣?如果哪位清楚原因,不吝賜教。

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    812

    瀏覽量

    66547
  • xdc
    xdc
    +關(guān)注

    關(guān)注

    1

    文章

    24

    瀏覽量

    5928
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux grep命令詳解

    Linux grep命令是一種非常常用的文本搜索工具,它可以在給定的文件搜索匹配的字符串,并輸出匹配的行。grep是全稱“global search regular expression print”,可以識(shí)別正則表達(dá)式,并使
    的頭像 發(fā)表于 12-25 09:39 ?87次閱讀

    詳解nginx正則表達(dá)式

    前言,我這里驗(yàn)證的nginx-v1.23.2單機(jī)環(huán)境下的nginx正則表達(dá)式、location路徑匹配規(guī)則和優(yōu)先級(jí)。
    的頭像 發(fā)表于 12-03 09:59 ?186次閱讀
    詳解nginx<b class='flag-5'>中</b>的<b class='flag-5'>正則表達(dá)式</b>

    Verilog表達(dá)式的位寬確定規(guī)則

    很多時(shí)候,Verilog中表達(dá)式的位寬都是被隱式確定的,即使你自己設(shè)計(jì)了位寬,它也是根據(jù)規(guī)則先確定位寬后,再擴(kuò)展到你的設(shè)計(jì)位寬,這常常會(huì)導(dǎo)致結(jié)果產(chǎn)生意想不到的錯(cuò)誤。
    的頭像 發(fā)表于 10-22 15:41 ?496次閱讀
    Verilog<b class='flag-5'>表達(dá)式</b>的位寬確定規(guī)則

    通過工業(yè)智能網(wǎng)關(guān)實(shí)現(xiàn)中間變量表達(dá)式的快速配置

    ,出現(xiàn)告警可能是多個(gè)變量達(dá)到條件而觸發(fā)的,就需要對(duì)中間變量進(jìn)行配置。 對(duì)此,物通博聯(lián)提供基于工業(yè)智能網(wǎng)關(guān)實(shí)現(xiàn)中間變量表達(dá)式的快速配置操作。用戶可以根據(jù)生產(chǎn)現(xiàn)場(chǎng)的應(yīng)用需求,靈活配置中間變量表達(dá)式,實(shí)現(xiàn)多參數(shù)、多條件
    的頭像 發(fā)表于 10-08 17:10 ?250次閱讀
    通過工業(yè)智能網(wǎng)關(guān)實(shí)現(xiàn)中間變量<b class='flag-5'>表達(dá)式</b>的快速配置

    nginx正則表達(dá)式和location路徑匹配指南

    前言,我這里驗(yàn)證的nginx-v1.23.2單機(jī)環(huán)境下的nginx正則表達(dá)式、location路徑匹配規(guī)則和優(yōu)先級(jí)。
    的頭像 發(fā)表于 09-29 16:02 ?789次閱讀
    nginx<b class='flag-5'>中</b>的<b class='flag-5'>正則表達(dá)式</b>和location路徑匹配指南

    求助,以下恒流源電路Io的計(jì)算表達(dá)式怎么計(jì)算?

    這個(gè)恒流源電路Io的計(jì)算表達(dá)式怎么計(jì)算,求給出詳細(xì)計(jì)算過程
    發(fā)表于 08-22 08:16

    TestStand表達(dá)式中常用的語(yǔ)法規(guī)則和運(yùn)算符使用

    TestStand也有自己的語(yǔ)言嘛?回答這個(gè)問題之前大家可以想一下使用TestStand時(shí)有一個(gè)和語(yǔ)言密切相關(guān)的屬性。沒錯(cuò)那就是表達(dá)式(Expressions),在這篇文章,小編
    的頭像 發(fā)表于 08-15 18:10 ?1439次閱讀
    TestStand<b class='flag-5'>表達(dá)式</b>中常用的語(yǔ)法規(guī)則和運(yùn)算符使用

    Java表達(dá)式引擎選型調(diào)研分析

    1 簡(jiǎn)介 我們項(xiàng)目組主要負(fù)責(zé)面向企業(yè)客戶的業(yè)務(wù)系統(tǒng), 企業(yè)的需求往往是多樣化且復(fù)雜的,對(duì)接不同企業(yè)時(shí)會(huì)有不同的定制化的業(yè)務(wù)模型和流程。 我們?cè)跇I(yè)務(wù)系統(tǒng) 使用表達(dá)式引擎,集中配置管理業(yè)務(wù)規(guī)則,并實(shí)現(xiàn)
    的頭像 發(fā)表于 08-15 14:25 ?355次閱讀
    Java<b class='flag-5'>表達(dá)式</b>引擎選型調(diào)研分析

    鴻蒙原生應(yīng)用元服務(wù)開發(fā)-倉(cāng)頡基本概念表達(dá)式(二)

    }, ${y}\") } } 運(yùn)行以上程序,將輸出: 1, 2 3, 4 5, 63.迭代變量不可修改 for-in 表達(dá)式的循環(huán)體,不能修改迭代變量,例如以下程序在編譯時(shí)會(huì)
    發(fā)表于 08-09 14:26

    鴻蒙原生應(yīng)用元服務(wù)開發(fā)-倉(cāng)頡基本概念表達(dá)式(一)

    程序能夠表達(dá)更復(fù)雜的邏輯,倉(cāng)頡,這種用來控制執(zhí)行流的語(yǔ)言元素就是條件表達(dá)式和循環(huán)表達(dá)式
    發(fā)表于 08-08 10:27

    求助,有關(guān)表達(dá)式選項(xiàng)卡(ADS)的問題求解

    你好。 我看不到表達(dá)式選項(xiàng)卡的某些變量值。 數(shù)組的大小顯然是 256,但我最多只能看到 100。 請(qǐng)問問題出在哪里? 謝謝。
    發(fā)表于 06-03 06:23

    mapgis屬性篩選表達(dá)式

    篇文章,我們將詳細(xì)討論MapGIS的屬性篩選表達(dá)式,包括語(yǔ)法、操作符和函數(shù)等。 屬性篩選表達(dá)式是一種MapGIS中用于指定要素選擇條件的代碼。它由一組操作符、函數(shù)和屬性字段組成,用
    的頭像 發(fā)表于 02-25 10:58 ?1648次閱讀

    西門子博途的算術(shù)表達(dá)式

    算術(shù)表達(dá)式既可以是一個(gè)數(shù)字值,也可以是由帶有算術(shù)運(yùn)算符的兩個(gè)值或表達(dá)式組合而成。 算術(shù)運(yùn)算符可以處理當(dāng)前 CPU 所支持的各種數(shù)據(jù)類型。如果在該運(yùn)算中有 2 個(gè)操作數(shù),那么可根據(jù)以下條件來確定結(jié)果的數(shù)據(jù)類型。
    的頭像 發(fā)表于 01-24 11:36 ?1011次閱讀

    你還不會(huì)gvim正則表達(dá)式?一文搞懂!

    gvim正則表達(dá)式常在命令行模式下使用,一般用于文本文件字符串的替換、刪除等操作。
    的頭像 發(fā)表于 01-19 16:47 ?1192次閱讀

    rs觸發(fā)器的邏輯表達(dá)式

    邏輯表達(dá)式是描述邏輯關(guān)系的符號(hào)表示,可以用于定義和描述各種電路和邏輯操作。邏輯電路,RS觸發(fā)器是一種基本的存儲(chǔ)器元件,也被稱為鎖存器。 RS觸發(fā)器是由兩個(gè)與門組成的,其輸出互相連接,形成一個(gè)反饋
    的頭像 發(fā)表于 01-12 14:09 ?3169次閱讀