一、握手协议概述

大家好,我是老李。做芯片验证十几年了,今天咱们聊聊握手协议。

握手协议,说白了就是两个模块之间怎么「打招呼」。你想想看,数字电路里数据在模块间跑来跑去,总得有个规矩——什么时候发、什么时候收、发完怎么确认。这个规矩,就是握手协议。

1.1 什么是握手协议

握手协议是一种控制信号交互的约定。它定义了两个通信实体之间,数据何时有效、何时被接收、何时可以发送下一笔。

最常见的握手信号就两个:

  • valid(有效信号):发送方告诉接收方「我这边数据准备好了」
  • ready(就绪信号):接收方告诉发送方「我这边可以收了」

当 valid 和 ready 同时为高,数据就成功传输了一笔。就这么简单。

核心要点:握手协议的本质是「双方确认」——发送方不能假设接收方随时能收,接收方也不能假设发送方随时有数据。

1.2 为什么需要握手协议

你可能会问:直接连一根线不就行了?数据来了就收呗。

嗯,这里要注意。实际芯片里,两个模块的工作速度可能不一样。比如一个模块跑 1GHz,另一个只能跑 100MHz。如果高速模块一直往外扔数据,低速模块根本接不住,数据就丢了。

我遇到过这样一个坑:之前做某个 AI 加速芯片,计算单元和存储单元之间没有加握手。结果仿真时一切正常,流片回来一跑,数据时不时就错一位。查了整整两周,才发现是存储单元偶尔忙不过来,计算单元却以为数据已经存进去了。

从那以后,我所有跨时钟域、跨频率的接口,必加握手协议。

握手协议解决了三个核心问题:

  1. 速率匹配:快慢模块之间能协调工作
  2. 数据完整性:确保每一笔数据都被正确接收
  3. 反压机制:接收方忙的时候可以告诉发送方「停一停」

1.3 握手协议在数字电路中的角色

握手协议在数字电路里,就像交通信号灯在城市道路中的作用。没有它,数据流就是一团乱麻。

具体来说,它扮演这几个角色:

角色 说明 我见过的实际场景
数据搬运工 控制数据在模块间有序流动 AXI 总线上的读写通道
流量调节阀 防止数据拥塞和溢出 FIFO 满时的反压信号
同步桥梁 连接不同时钟域的两个模块 异步 FIFO 的握手逻辑
错误防火墙 避免数据丢失或重复 valid-ready 握手机制

我个人习惯把握手协议分成两大类:

  • 两线握手(valid-ready):最常用,适合流水线场景
  • 四线握手(req-ack):适合控制信号,比如跨时钟域传输

你想想看,一个复杂的 SoC 芯片里,可能有上百个模块通过握手协议互相通信。如果其中一个握手逻辑写错了,整个系统都可能跑飞。

小提示:刚开始学握手协议的同学,建议先从 valid-ready 这种最简单的入手。把 valid 和 ready 的时序图画清楚,后面再学复杂的就顺了。

1.4 握手协议的核心知识体系

下面这张图是我自己总结的握手协议知识框架,帮你快速建立全局认知:

握手协议知识体系 握手协议 为什么需要 核心机制 应用场景 速率匹配 数据完整性 反压机制 valid-ready req-ack 握手时序 总线协议 跨时钟域 流水线控制 FIFO 接口

避坑指南:我曾经见过一个项目,工程师觉得握手协议太简单,随手写了个 valid 一直拉高、ready 也一直拉高的「伪握手」。结果模块一忙起来,数据全乱套了。记住:握手协议不是摆设,它是用来解决实际问题的。

好了,这一章就聊到这儿。握手协议看着简单,但里面的门道不少。后面我们会一步步深入,把 valid-ready 的时序、跨时钟域握手、以及怎么验证这些逻辑都讲透。

可可精品资料库