ic基础|时序篇:握手协议valid和ready的时序优化

大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~

当我们遇到时序违例时,通常采用的方式为插入寄存器(打拍)或者是后端插入buffer,这对使能信号或数据信号是有用的,但是对于那些需要满足握手协议的信号来说(例如:AXI协议中的多组握手信号xxready和xxvalid)单纯的打拍是行不通的,因为需要满足valid-ready协议,如果仅仅使用打拍很容易丢失数据。

因此,需要采取特殊的方法进行打拍,这种针对AXI协议中握手信号的打拍通常称为axi register slice,通常来说,根据需要打拍的信号的不同有三种模式:

  • 前向寄存器Forward Registered :对valid和data路打拍。
  • 后向寄存器Backward Registered :对ready路打拍。
  • 双向寄存器Forward-Backward Registered :同时对valid/data路和ready路打拍。

一、Forward Registered

首先来分析的是第一种Forward Registered。

Forward指的是从数据发送方到数据接收方之间的数据传递方向,为了保持时序上的一致性,需要打拍的当然不止是valid信号,还得包括data信号。否则,valid信号和data信号对不齐的话,数据传输会出错。

Forward 打拍的电路结构如下所示:
在这里插入图片描述
对于forward寄存器打拍,我们所要考虑的是何时可以往寄存器里打拍,即满足以下两个条件:

1.forward寄存器里是空的;

2.forward寄存器非空,但是接收端准备好接收数据了;

因此有以下的verilog代码:

module forward_buffer(input  wire         clk         ,input  wire         rst_n       ,input  wire         valid_src   ,input  wire [31:0]  data_src,output wire         ready_src   ,output reg          valid_dst   ,output reg  [31:0]  data_dst    ,input  wire         ready_dst
);always @(posedge clk or negedge rst_n) beginif (!rst_n) beginvalid_dst   <= 1'b0;end else if (ready_src) beginvalid_dst   <= valid_src;endend    always @(posedge clk) begin  if (valid_src & ready_src) begindata_dst    <= data_src;endendassign ready_src = ready_dst || (~valid_dst);endmodule

解释一下上面的代码:

-valid_dst: 用于对发送端的valid_src进行打拍,它会在以下两种情况接收发送端的valid_src的值:

	valid_dst为0:代表此时valid_dst寄存器和data_dst寄存器没有有效数据,为空,可以接收发送端的输入valid_src。ready_dst为1:代表此时接收端准备好了接收数据,则有以下两种情况:-若此时valid_dst为0:代表此时接收方先准备好接受数据,而valid_dst寄存器和data_dst寄存器没有有效数据,可以接收发送端的输入valid_src。-若valid_dst为1:发送方和接收方都完成了一次握手,valid_dst寄存器和data_dst寄存器中的数据可以更新。

-data_dst: 数据的打拍很好理解,同时满足以下两个条件即可对数据打拍:

当发送端数据准备好(即valid_src有效时)。接收端准备好接受数据时(ready_dst为1)或者是valid_dst寄存器和data_dst寄存器没有有效数据时(valid_dst为0)。提示一下,这里的数据通路如果没有用于控制逻辑是可以使用不带复位端以节省面积的。

-ready_src: 输出给发送端的ready信号,满足以下两个条件之一即有效:

当接受端准备好接受数据时(ready_dst);valid_dst寄存器和data_dst寄存器为空,即没有有效数据时(valid_dst为0)。

简单仿真一下上述模块,波形如下所示:
在这里插入图片描述

二、backward Registered

Backward指的是接收端向输入端发送的ready信号这条路径,虽然只有ready这一个信号,但是我们也不能简单的对其进行打拍处理。因为,如果只对ready信号打拍,而不对valid和data信号进行处理,很容易导致两端握手信号将会无法正确同步,而导致数据丢失,例如下图所示:
在这里插入图片描述
如图所示,由于发送端的ready_src与ready_dst相比存在一个周期的延迟,导致ready_dst变化后,ready_src在一个周期后才相应变化,从而导致了data2丢失,data3重复采样。

因此合适的方法还是在为发送端的信号加一级寄存器。以满足接收端没有ready时发送端发来请求,需要暂存数据的场景,即valid_src & ready_src & ~ready_dst。等接收端准备好接受数据后,会接受到暂存的数据,因此数据不会丢失,也不会重复采样。

backward 打拍的电路结构如下所示:
在这里插入图片描述
verilog代码如下所示:

module backward_buffer(input  wire         clk         ,input  wire         rst_n       ,input  wire         valid_src   ,input  wire [31:0]  data_src    ,output reg          ready_src   ,output wire         valid_dst   ,output wire [31:0]  data_dst    ,input  wire         ready_dst
);reg [31:0] data_r;reg        valid_r;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginvalid_r <= 1'b0;end else if (ready_dst) beginvalid_r <= 1'b0;end else if (valid_src & ready_src & ~ready_dst) beginvalid_r <= 1'b1;endendalways @(posedge clk) beginif (valid_src & ready_src & ~ready_dst) begindata_r    <= data_src;endendalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginready_src   <= 1'b1;end else if (ready_dst) beginready_src   <= 1'b1;end else if (valid_src) beginready_src   <= 1'b0;endend  assign valid_dst = ready_src ? valid_src : valid_r;assign data_dst  = ready_src ? data_src  : data_r;endmodule

解释一下上面的代码:

-valid_r: 用于对发送端的valid_src进行暂存,会在以下情况置1或置0:

当接收端ready_dst信号为1时,置0,此时代表接受端有能力接受数据,因此无需进行暂存。当发送端valid_src信号有效,ready_src有效,代表发送方完成了一次握手,若此时接受端ready_dst无效,则代表此时需要缓存数据(即将valid_r置1),以避免丢失。

-data_r: 和valid_dst的逻辑类似,当满足valid_src & ready_src & ~ready_dst时,暂存发送端输入的数据data_src。

-ready_src:通过以下逻辑控制:

复位值为1,用于在接收端未准备好时,一旦发送端准备好数据,即可暂存data_src。接收端ready_dst有效,则置1。发送端valid_src有效时,置0。

-valid_dst和data_src,这两个信号根据ready_src的值选择输出来自发送端还是暂存寄存器,即:

当ready_src有效时,代表此时接收端或者是暂存寄存器可以接受数据,此时输入接收端的valid和data为发送端的输入信号valid_src和data_src。当ready_src无效时,代表此时暂存寄存器中的数据有效,因此输入接收端的数据为暂存信号valid_r和data_r。

使用上述backward寄存器后,理论上有以下时序图:
在这里插入图片描述
可见在使用了backward寄存器后,数据不会出现丢失的情况。

接下来我们对backward_buffer模块进行仿真验证,波形如下:
在这里插入图片描述
观察波形可以发现,ready_src相对于ready_dst延迟了一拍,并且在数据接收方还未准备好(即ready_src有效,ready_dst无效)但数据发送方发送数据(即valid_src有效)的这种情况下,对数据发送端的data_src和valid_src进行了缓存,因此该模块达成了我们的设计目标。

三、Forward-Backward Registered

Forward-Backward Registered即对valid/data和ready都进行时序优化的寄存器,我们可以使用上面提到的Forward Registered 和Backward Registered拼合在一起即可得到Forward-Backward Registered,只要注意一下两类寄存器之间的摆放顺序即可:由于前向寄存器Forward Registered是对valid和ready进行打拍,而后向寄存器Backward Registered是对ready进行打拍,因此我们要将Forward Registered放在距离接收端近的地方,将Backward Registered放在距离发送端近的地方,如下图所示:
在这里插入图片描述
波形仿真如下:

在这里插入图片描述
观察波形,可见该模块对valid_src、data_src和ready_dst都打了一拍,达成了我们的设计目标!

除了上面的方法之外,我们也可以利用同步fifo来实现发送端和同步端之间的数据传输,利用full信号取反后来作为发送端的ready_src信号,fifo非满即可写入数据,利用empty信号取反,来作为接收端的valid_dst信号,fifo非空即说明其中有数据,可进行读操作。

而这个同步fifo的深度至少要大于2,因为如果fifo深度为1,那么fifo就会要么是“满”要么是“空”,接收端和发送端的传输总是会由于fifo的空满状态而变得断断续续的,影响数据传输效率。

如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven的常用基本命令

Maven是一个Java项目的构建和依赖管理工具&#xff0c;它有一系列命令用于项目的构建、清理、安装、部署等操作。以下是一些Maven的常用命令及其详细解释与举例&#xff1a; 1.mvn clean 功能&#xff1a;清理项目构建过程中生成的中间文件和目标目录&#xff08;target&…

HarmonyOS开发案例:【视频播放器】

介绍 基于video、swiper和slider组件&#xff0c;实现简单的视频播放器&#xff0c;可支持海报轮播、视频播放等功能。 相关概念 [video组件]&#xff1a;视频播放组件。[swiper组件]&#xff1a;滑动容器&#xff0c;提供切换子组件显示的能力。[slider组件]&#xff1a;滑…

秋招之路 面经

这里参考一位很厉害的前辈所分享的他的嵌入式软件工程师秋招之路&#xff0c;自己详细的读了一下他的经历以及他的分享的秋招面试和项目经验的总结。 我的嵌入式软件工程师秋招之路&#xff08;文末送福利&#xff09;_嵌入式软件工程师 刷leetcode-CSDN博客 如何在面试中介绍…

针对窗口数量多导致窗口大小显示受限制的问题,使用滚动条控制窗口

建议&#xff1a;首先观察结果展示&#xff0c;判断是否可以满足你的需求。 目录 1. 问题分析 2. 解决方案 2.1 界面设计 2.2 生成代码 2.3 源码实现 3. 结果展示 1. 问题分析 项目需要显示的窗口数量颇多&#xff0c;主界面中&#xff0c;如果一次性显示全部窗口&#x…

Web3钱包开发获取测试币-Base Sepolia(二)

Web3钱包开发获取测试币-Base Sepolia(二) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b0c0ac86b04a496087471388532bc54a.png) 基于上篇 Web3钱包开发获取测试币-Polygon Mumbai(一) &#xff1a;https://suwu150.blog.csdn.net/article/details/137949473 我…

MyBatis 框架学习(I)

MyBatis 框架学习(I) 文章目录 MyBatis 框架学习(I)1. 介绍2. 准备&测试3. MyBatis 注解基础操作3.1 日志输出3.2 Insert 操作3.3 Delete 操作3.4 Update 操作3.5 Select 操作 总结 1. 介绍 之前我们学习过利用JDBC操作数据库进行项目开发&#xff0c;但我们发现它操作起来…

扫描工具nmap

介绍 说到黑客&#xff0c;知识就是力量。您对目标系统或网络的了解越多&#xff0c;可用的选项就越多。因此&#xff0c;在进行任何利用尝试之前&#xff0c;必须进行适当的枚举。 假设我们获得了一个 IP&#xff08;或多个 IP 地址&#xff09;来执行安全审计。在我们做任何…

究竟该怎么寄快递才能安全无误的送到手中呢?

最近&#xff0c;小编上班了发现有同事在吐槽快递送到手中的时间很晚了&#xff0c;比预计的时间差了很多&#xff0c;并且产品也有不同程度的损坏。这就让我们很是恼火了&#xff0c;但是细细研究后才发现有一部分的原因竟然是我们的原因才导致的寄快递出现了很多纰漏。 首先…

使用JavaScript创建数组,并对其进行冒泡排序

JavaScript创建数组方式 字面量方式&#xff1a;使用方括号 [] 来创建数组&#xff0c;并在方括号内按顺序列出数组元素。 let arr [1, 2, 3, 4, 5]; Array() 构造函数方式&#xff1a;使用 new Array() 构造函数来创建数组&#xff0c;并传入数组元素作为参数。 let arr ne…

如何使用ChatGPT仿写一篇学术论文

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.仿写的目的 2.根据专业方向搜集合适的文献 3.总结想要仿写的文献 4.使用ChatGPT一步一步仿写 5.书籍介绍 AIPaperPass智能论文写作平台 深入地阅读和分析你研究领域的相关文…

汽车IVI中控开发入门及进阶(十六):carplay认证

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿

PLC_博图系列☞P_TRIG&#xff1a;扫描 RLO 的信号上升沿 文章目录 PLC_博图系列☞P_TRIG&#xff1a;扫描 RLO 的信号上升沿背景介绍P_TRIG&#xff1a; 扫描 RLO 的信号上升沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 P_TRIG 背景介绍 这是一…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象&#xff0c;分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点&#xff0c;主要成员是各类 Server&#xff0c;开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外&#xff0c;还…

实现Spring底层机制(阶段1—编写自己的Spring容器,扫描包,得到bean的Class对象)

环境搭建抛出问题 1.环境搭建 1.创建maven项目 2.导入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.ap…

代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

1049.最后一块石头的重量II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 有…

AI-数学-高中-39空间向量-2空间向量法(法向量)

原作者视频&#xff1a;【空间向量】【一数辞典】2空间向量法&#xff08;重要&#xff09;_哔哩哔哩_bilibili 法向量&#xff08;高中阶段所有与面的关系&#xff0c;都可以通过法向量去证明和解答&#xff09;&#xff1a; 是空间解析几何的一个概念&#xff0c;垂直于平面…

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址…

AI时代,操作系统交互的革命性变革

AI时代对操作系统交互的影响 对于2024年的智能手机厂商们来说&#xff0c;在冲击高端市场的路上有一场绝对输不起的硬仗&#xff0c;那就是AI大模型的落地之战。 OpenAI的ChatGPT引爆了全球AIGC&#xff08;生成式人工智能&#xff09;热潮&#xff0c;短短一年时间里&#xff…

新手小白,在数学建模的过程中应该怎么分工?

大家知道&#xff0c;数学建模竞赛是需要一个团队的三个人在三天或四天的时间内&#xff0c;完成模型建立&#xff0c;编程实现和论文写作的任务&#xff0c;对许多第一次参加建模或者建模经验比较欠缺的团队来说&#xff0c;是时间紧任务重的&#xff0c;那么怎么办呢&#xf…

Java学习笔记26(枚举和注解)

1.枚举和注解 1.1 枚举 ​ 1.枚举(enumeration) ​ 2.枚举是一组常量的集合 ​ 3.枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.枚举应用案例 ​ 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读 ​ 2.对枚举对象/属性使用final st…