优化移位寄存器

embedded/2024/11/24 22:23:56/

Note:文章内容以 Xilinx 7系列 FPGA 进行讲解

1、FPGA中移位寄存器资源(7系列)

        7系列FPGA中的SLICE分为两大类:SLICEL和SLICEM。每个SLICE内都有4个查找表(Look-Up Table,LUT)。其中,SLICEL中的LUT仅可用作逻辑函数发生器,而SLICEM中的LUT不仅可以用作逻辑函数发生器,还可以用作存储器,这也是SLICEM名称的由来(M表示Memory)。对比SLICEL和SLICEM中的LUT,如图下图所示(左侧为SLICEL中的LUT,右侧为SLICEM中的LUT):

        不难看出,SLICEL和SLICEM中的LUT的输入/输出端口存在明显差异。

        因为移位寄存器是存储器中的一种,所以如果想用LUT来实现移位寄存器,那么只能用SLICEM中的LUT资源。

        SLICEM中的每个LUT可实现深度为32的移位寄存器(等效于32个寄存器级联),意味着可将一位数据延迟32个时钟周期。

        同一个SLICEM中的LUT又可通过专用级联走线构成深度更大的移位寄存器,最大可构成深度为128(32×4)的移位寄存器,这意味着可将一位数据延迟128个时钟周期。这4个LUT的级联方向是由上至下

        如果需要更大深度(深度大于128)的移位寄存器,就不得不将不同SLICEM中的LUT级联起来,这时跨越SLICEM之间的走线不是专用走线。(不是专用走线,势必对时序收敛有影响)

         同时由上图可以看出,LUT并没有置位/复位端口,因此,不管是同步还是异步,将LUT用作移位寄存器时都不支持置位/复位。所以用RTL代码描述移位寄存器时,如果期望其映射为SLICEM中的LUT,则不能添加置位/复位功能。


2、时序路径上的移位寄存器管理

        在综合阶段,Vivado提供了两个选项用于指导工具如何处理移位寄存器,如下图所示:

        -no_srlextract用于阻止工具将移位寄存器映射为LUT,则意味着所有的移位寄存器都将被综合为级联的寄存器,也就是以寄存器链的形式实现移位寄存器。

        -shreg_min_size决定了移位寄存器被映射为SRL最小深度。当移位寄存器的深度小于-shreg_min_size时,最终的实现方式为触发器级联的形式,即FF+FF或FF+FF+FF;当其深度大于等于-shreg_min_size时,实现方式则为FF+LUT+FF的形式(SRL一般都是由LUT生成)。

        -no_srlextract和-shreg_min_size是全局选项,意味着对设计中的所有模块均适用(-no_srlextract 优先级高于-shreg_min_size)。因此,通常情况下不会手工修改这两项,而是由综合策略决定其具体设置情况,如下图所示:

        可以看到, 较大的-shreg_min_size可以改善布线拥塞

        除此之外,Vivado还提供了综合属性shreg_extractsrl_style(具体用法见Vivado综合设置与综合属性-CSDN博客)。

        Vivado还支持模块化综合技术,这使得对综合的管理粒度更加精细。其中,和移位寄存器相关的属性有两个:SHREG_MIN_SIZESRL_STYLE,具体使用方法如下图所示:

        无论是综合选项还是综合属性,或者模块化综合技术,使用的前提是RTL代码对用户是可见的。若已到了设计实现阶段或用户仅可见综合后的网表文件,则需要使用其他方法对移位寄存器进行优化。此时就需要先找到网表中的移位寄存器。 具体Tcl命令如下:

        这三类移位寄存器正是设计中需要格外关注的,尤其是当它们是时序路径终点单元时。因为这三类移位寄存器的深度较浅,所以可考虑是否将其替换为触发器更为合适。 

         上表中的约束属性可以在opt_design阶段使用,具体用法如下图所示:

        ① 若SRL是时序路径的终点单元 ,可借助约束属性SRL_STAGES_TO_REG_INPUT在移位寄存器输入端提取出一个寄存器,从而有利于工具改善布线延迟或降低逻辑级数。

        ② 若SRL是时序路径的起点单元 ,可借助约束属性SRL_STAGES_TO_REG_OUTPUT在移位寄存器输出端提取出一个寄存器,从而有利于改善时序。


~End~


http://www.ppmy.cn/embedded/140224.html

相关文章

【AI日记】24.11.23 学习谷歌数据分析初级课程-第4课

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容:学习谷歌数据分析初级课程地址:第四课《从脏数据到干净数据的处理》时间:4 小时评估:不错,完成 读书 书名:權力與進步时…

实现el-table 点击按钮 增加一条数据 让表格滚动到最底部

在使用 Element UI 的 el-table 组件时,如果你希望在点击一个按钮后增加一条数据并让表格滚动到底部,你可以通过以下步骤来实现: 增加数据:首先,将新数据添加到你的数据数组中。滚动到底部:然后&#xff0c…

网络编程1

多进程实现网络通信&#xff08;TCP&#xff09; 服务器端函数 #include <myhead.h> #define PORT 8848 #define IP "192.168.60.78" #define BACKLOG 20 void fun(int sss) {if(sssSIGCHLD){waitpid(-1,NULL,0);} } int main(int argc, const char *argv[])…

微积分复习笔记 Calculus Volume 1 - 6.5 Physical Applications

6.5 Physical Applications - Calculus Volume 1 | OpenStax

移门缓冲支架:减少噪音,提升生活质量

在现代家居设计中&#xff0c;移门因其节省空间、操作简便的特点而被广泛采用。然而&#xff0c;传统的移门在关闭时往往会产生较大的噪音&#xff0c;这种噪音不仅影响家庭成员的休息和睡眠&#xff0c;也可能导致邻里间的不满。移门缓冲支架的出现&#xff0c;正是为了应对这…

[C++]:特殊类的设计

1. 不可拷贝类 我们知道&#xff0c;某些资源只能有一个对象持有&#xff0c;拷贝可能导致资源混乱。例如智能指针std::unique_ptr独占管理动态分配对象&#xff0c;文件句柄、网络套接字、数据库连接等资源通常也是独占的&#xff0c;不允许拷贝。 在C11之前&#xff0c;要创…

Java基础面试题02:简述什么是值传递和引用传递?

面试题&#xff1a;简述什么是值传递和引用传递&#xff1f; 什么是值传递&#xff1f; 值传递&#xff08;pass by value&#xff09;是指在调用函数时&#xff0c;把实际参数的值复制一份传递给函数。换句话说&#xff0c;函数内部对参数的任何修改&#xff0c;都不会影响到…

SpringBoot3+Jasypt如何在配置文件中对数据库的密码进行加密以防止密码泄露

在 Spring Boot 3 中&#xff0c;可以通过jasypt-spring-boot-starter对配置文件中的数据库密码或者其他重要密码进行加密&#xff0c;操作非常简单&#xff0c;可以有效防止密码泄露&#xff1a; 1. 使用 Jasypt 加密 添加依赖 在 pom.xml 中添加 Jasypt 依赖&#xff1a; …