0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

正则表达式在Vivado约束文件中的应用

电子设计 来源:电子设计 作者:电子设计 2022-02-08 11:26 次阅读

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

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

使用xdc文件进行管脚、位置、时序和属性等约束的时候,经常会使用各种get命令。Vivado提供了很丰富的匹配表达式,比如等于==、不等于!=、匹配=~、不匹配!~、、=等等,这些表达式可以通过&&和||进行组合;同时还有大量的状态、属性和单元名称可用,比如DIRECTION、IN、IS_LOC_FIXED、IS_PRIMITIVE、NAME等等。

我在xdc文件中匹配目标的时候,在可行的情况下更倾向于使用正则表达式。本文就介绍一下我常使用的正则表达式和一些在Vivado中应用的特殊之处,同时也有个别自己尚未解决的问题。

1. -hierarchical和-regexp的使用

在匹配FPGA内部资源时,比如get_pins、get_cells、get_nets的时候,需要同时使用-hierarchical和-regexp。

-hierarchical表示Vivado在匹配对象的时候,将在工程中不同的层次内对该信号进行搜索。如果没有加这个选项,就必须在匹配字符中显式且精确的指出匹配对象所在的层次。需要注意的是,当使用get_ports时,不能使用-hierarchical选项。因为ports应该位于顶层,没有层次之分。

-regexp是指本次匹配将使用正则表达式,是必须使用的。

以下是一个使用-hierarchical的例子和注意事项。

pIYBAGAKB9yAJCbYAAA5Hntw-xs125.png

首先看第一行蓝色的get_cells命令,这里用来获得ConfigRegs_i这个实例内的满足bus_hsio_dly/。.*_fine_sel.*要求的对象。可以看到运行该命令后得到了下面黑色部分的对象。第三行指令在第一行的基础上,把顶层实例ConfigRegs_i的限制去掉,也获得了想要的对象。

再来看第五行的指令。此处去掉了-hierarchical,意味着匹配过程不能穿越不同的层次结构。同时“.*”虽然可以匹配任何除换行符之外的任何数量的字符,但是却不能替代在Vivado中表示层次概念的“/”符号。所以匹配过程只在顶层进行搜索,其结果就如第六行,不能找到所需的对象。

第七行也犯了一样的错误。在没有使用-hierarchical的情况下,虽然想通过“ConfigRegs_i.*”来匹配顶层的ConfigRegs_i实例,但是“.*”是不能匹配层次符号“/”的。同样无法获取对象。

第九行虽然没有使用-hierarchical,但是通过ConfigRegs_i/指定了对象的层次结构,是可以获得想要的对象的。但是这里有一个限制,即cmph_fine_sel_reg[0]这些对象必须位于ConfigRegs_i下。如果cmph_fine_sel_reg[0]和ConfigRegs_i中间还隔了别的实例,比如ConfigRegs_i例化了CmpDef_i,CmpDef_i内部定义了cmph_fine_sel_reg[0]。这种情况下,第九行是无法找到所需对象的。

2. 常用的匹配方法

正则表达式功能强大且复杂,要完全掌握会花费很长时间。但是对于我们编写xdc而言,只需要掌握很小一部分内容就可以应对绝大多数情况了。最常用的应该就是特殊字符和限定符了。下面是比较常用的特殊字符。

pIYBAGAKCF-AbiVSAABn6kj4D0s793.png

常用限定符如下。

pIYBAGAKCJ2AALooAABAaZ5sz04170.png

我们在FPGA工程中使用正则表达式不是为了进行字符处理,不需要考虑太多的容错性和可能性。对于我们而言,绝大多数命名都是确定的,使用正则是为了更方便的获取对象和简化匹配过程。

3. 使用示例

3.1 获取总线类对象

看以下例子。在进行物理约束的时候,为一个总线设置信号类型,如果一个一个的写即慢又可能犯错。使用正则可以将这类信号全部提取出来。以一个从0到31共32路的总线为例。

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

以上指令可以获取所有名字为c2c_sync[]的端口,方括号内可能是任意多个数字。这种写法不够准确,在文字处理程序里面会出大问题,但是在FPGA工程中足够了。当然也可以写的稍微严格点,比如:

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

这个表达式比上一个更进一步的约束了中括号内的内容。这里的/[是为了匹配“[”本身,而里面的[0-9]则定义了一个从数字0到数字9的字符集,[0-9]后面的{1,2}则表示[0-9]中的任意数字将出现1次,或以任意两个数字的组合出现1次。对于我们的应用,做到这一步就够了。

3.2 简化匹配表达式

工程中会有一些名字很特殊的信号,比如全局复位信号,这种信号在工程中往往只会出现一次,我用更加简单粗暴的方式来获得。

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

比如上面的例子。通过使用-hierarchical搜索所有层次,通过在rst_global_reg的前后都使用.*来匹配任何可能出现的字符。其中。表示匹配任何非换行符的字符,*表示。可以出现任意次。当然并不推荐这种写法,因为会增加编译时匹配对象的负担。可以使用更精准的匹配。

对于层次很深的信号,只要保证列出的匹配字符能够找到我们所要的对象即可。比如某工程有下图的层次结构。

比如设计者发现A_i0模块内部的D_i0内的某个关键信号的位置需要优化,且设计者知道该信号在D_i0中唯一。为了拿到这个关键信号,可以使用正则表达式,并且可以略过中间层次的所有模块。

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

3.3 特殊字符的获取

前面提到过一些特殊字符,比如?、。、/、[等等,如果需要匹配这些字符,需要用到转义符“/”。比如“/。”表示“。”这个字符本身,而不再是匹配符。。

比如在上文提到的get_ports -regexp {c2c_sync/[[0-9]{1,2}]}。这个总线的完整名称是c2c_sync[0]、c2c_sync[1]。..。..,此处的“/[”就是表示左方括号这个字符本身。而[0-9]中单独使用的[]就表示一个字符集合。这里有个需要注意的地方,作为字符使用的左方括号左侧加了转义符“/“,而右方括号则不需要加”/“。

另外一个需要注意的是上文中提到的get_cells -regexp -hierarchical ConfigRegs_i/bus_hsio_dly.*_fine_sel.*。这里面bus_hsio_dly是一个systemverilog中的interface,获取的对象是bus_hsio_dly接口中的cmph_fine_sel_reg信号,其表达方式应该是bus_hsio_dly.cmph_fine_sel_reg。此处我使用”.*“来匹配任何非换行字符,所以可以匹配”。“字符。

更合适一点的匹配表达式应该是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

打印结果不是/。,而是//。。对于这种情况,我猜想是//用来表示转义符”/“。而”//“表示的转义符则作用于特殊字符”。“,用来表示普通字符”。“。

这是个人猜测,但是为什么会这样?如果哪位清楚原因,不吝赐教。

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Vivado
    +关注

    关注

    19

    文章

    819

    浏览量

    67263
  • xdc
    xdc
    +关注

    关注

    1

    文章

    24

    浏览量

    5970
收藏 人收藏

    评论

    相关推荐

    Linux grep命令详解

    Linux grep命令是一种非常常用的文本搜索工具,它可以在给定的文件搜索匹配的字符串,并输出匹配的行。grep是全称“global search regular expression print”,可以识别正则表达式,并使
    的头像 发表于 12-25 09:39 366次阅读

    表达式画Coms电路,最近二周有比赛第一次接触Cmos,主要用与或非门电路画

    用与或非门电路绘画,通过表达式,来绘画cmos门电路
    发表于 12-04 16:02

    深入解析Django路由层:从基础配置到高效设计的全攻略

    参数是正则表达式 只要第一个参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配 直接执行对应的视图函数 输入url的时候默认加斜杠 django内部帮你做到重定向 一次匹配不行 url后面加斜杠
    的头像 发表于 12-04 13:55 279次阅读
    深入解析Django路由层:从基础配置到高效设计的全攻略

    详解nginx正则表达式

    前言,我这里验证的nginx-v1.23.2单机环境下的nginx正则表达式、location路径匹配规则和优先级。
    的头像 发表于 12-03 09:59 448次阅读
    详解nginx<b class='flag-5'>中</b>的<b class='flag-5'>正则表达式</b>

    Verilog表达式的位宽确定规则

    很多时候,Verilog中表达式的位宽都是被隐式确定的,即使你自己设计了位宽,它也是根据规则先确定位宽后,再扩展到你的设计位宽,这常常会导致结果产生意想不到的错误。
    的头像 发表于 10-22 15:41 808次阅读
    Verilog<b class='flag-5'>表达式</b>的位宽确定规则

    通过工业智能网关实现中间变量表达式的快速配置

    ,出现告警可能是多个变量达到条件而触发的,就需要对中间变量进行配置。 对此,物通博联提供基于工业智能网关实现中间变量表达式的快速配置操作。用户可以根据生产现场的应用需求,灵活配置中间变量表达式,实现多参数、多条件
    的头像 发表于 10-08 17:10 377次阅读
    通过工业智能网关实现中间变量<b class='flag-5'>表达式</b>的快速配置

    nginx正则表达式和location路径匹配指南

    前言,我这里验证的nginx-v1.23.2单机环境下的nginx正则表达式、location路径匹配规则和优先级。
    的头像 发表于 09-29 16:02 1160次阅读
    nginx<b class='flag-5'>中</b>的<b class='flag-5'>正则表达式</b>和location路径匹配指南

    求助,以下恒流源电路Io的计算表达式怎么计算?

    这个恒流源电路Io的计算表达式怎么计算,求给出详细计算过程
    发表于 08-22 08:16

    TestStand表达式中常用的语法规则和运算符使用

    TestStand也有自己的语言嘛?回答这个问题之前大家可以想一下使用TestStand时有一个和语言密切相关的属性。没错那就是表达式(Expressions),在这篇文章,小编
    的头像 发表于 08-15 18:10 2192次阅读
    TestStand<b class='flag-5'>表达式</b>中常用的语法规则和运算符使用

    Java表达式引擎选型调研分析

    1 简介 我们项目组主要负责面向企业客户的业务系统, 企业的需求往往是多样化且复杂的,对接不同企业时会有不同的定制化的业务模型和流程。 我们在业务系统 使用表达式引擎,集中配置管理业务规则,并实现
    的头像 发表于 08-15 14:25 476次阅读
    Java<b class='flag-5'>表达式</b>引擎选型调研分析

    鸿蒙原生应用元服务开发-仓颉基本概念表达式(二)

    }, ${y}\") } } 运行以上程序,将输出: 1, 2 3, 4 5, 63.迭代变量不可修改 for-in 表达式的循环体,不能修改迭代变量,例如以下程序在编译时会
    发表于 08-09 14:26

    鸿蒙原生应用元服务开发-仓颉基本概念表达式(一)

    程序能够表达更复杂的逻辑,仓颉,这种用来控制执行流的语言元素就是条件表达式和循环表达式
    发表于 08-08 10:27

    重启一次VsCode后,ESP_LOGI会提示错误“应输入表达式”的原因?

    我重启一次vsc后,ESP_LOGI会提示错误“应输入表达式”,不过build的时候没有问题。是我C/Cpp配置哪里搞错了吗?
    发表于 06-17 08:22

    求助,有关表达式选项卡(ADS)的问题求解

    你好。 我看不到表达式选项卡的某些变量值。 数组的大小显然是 256,但我最多只能看到 100。 请问问题出在哪里? 谢谢。
    发表于 06-03 06:23

    BGP路由过滤、引入与缺省路由的配置实践

    第一个用 AS-Path进行路由过滤 利用 AS-Path 进行路由过滤 让R3只接收来自AS 100的 做正则表达式
    发表于 04-08 10:47 1661次阅读
    BGP路由过滤、引入与缺省路由的配置实践