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) begin
      if (!rst_n) begin
          valid_dst   <= 1'b0;
      end else if (ready_src) begin
          valid_dst   <= valid_src;
      end
   end    
   
   always @(posedge clk) begin  
      if (valid_src & ready_src) begin
          data_dst    <= data_src;
      end
   end
   
   assign 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) begin
        if (!rst_n) begin
            valid_r <= 1'b0;
        end else if (ready_dst) begin
            valid_r <= 1'b0;
        end else if (valid_src & ready_src & ~ready_dst) begin
            valid_r <= 1'b1;
        end
    end


    always @(posedge clk) begin
        if (valid_src & ready_src & ~ready_dst) begin
            data_r    <= data_src;
        end
    end


    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            ready_src   <= 1'b1;
        end else if (ready_dst) begin
            ready_src   <= 1'b1;
        end else if (valid_src) begin
            ready_src   <= 1'b0;
        end
    end  

    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验证的学习资料和书籍等着你呢~欢迎您的关注!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全的守护者:防火墙的五个主要功能解析

防火墙是一种网络安全设备&#xff0c;用于保护计算机网络免受未经授权的访问、攻击和恶意软件的侵害。它通过监控、过滤和控制网络流量&#xff0c;实施安全策略&#xff0c;防止不安全的数据包进入或离开受保护的网络。 防火墙的五个主要功能&#xff1a; 1. 访问控制&#…

Web入门-Tomecat

黑马程序员JavaWeb开发教程 文章目录 一、简介1、Web服务器2、Tomcat 二、基本使用三、入门程序解析 一、简介 1、Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发部署Web项目&#xff0c;对外提供网上信息浏览服务 2、Tomcat 概念&#xff1a;Tomcat是Apach…

(回溯)记忆化搜索和dp

动态规划的核心就是 状态的定义和状态的转移 灵神 的 回溯改递归思路 首先很多动态规划问题都可以采用 回溯 的思想 回溯主要思想就是把 一个大问题分解成小问题 比如 采用子集类回溯问题中的核心思想-> 选或不选 或者 选哪个 记忆化搜索之后 我们可以发现 每个新节点依…

深度图转点云

一、理论分析 二、其他分析 1、相机内参 相机内参主要是四个参数fx,fy,u0,v0。要明白相机内参就是相机内部参数&#xff0c;是参考像素坐标系而言&#xff0c;有了这个前提&#xff0c;这四个参数也就很好理解了。 &#xff08;1&#xff09;首先&#xff0c;。其中F是相机的…

sora related

官方https://openai.com/research/video-generation-models-as-world-simulators 概述&#xff1a; sora可以生成变长的、不同分辨率的最长可到1分钟的视频&#xff1b;整体流程是 v i d e o c o m p r e s s i o n n e r w o r k ( v i d e o → l a t e n t ) p a t c h i…

HarmonyOS ArkUI实战开发-NAPI数据类型

在前两篇文章里笔者简单介绍了 NAPI 工程结构以及生成的 cpp 源码部分&#xff0c;其中 JS 应用层传递过来的数据被封装在了 napi_value 中&#xff0c;使用前先要转换成对应的 C/C 数据类型&#xff0c;C/C 端的数据也要转换成 napi_value 数据类型传递给 JS 应用层&#xff0…

大模型改变了NLP的游戏规则了吗

NLP已经死了吗&#xff1f; 自从 ChatGPT 横空出世以来&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09; 研究领域就出现了一种消极的声音&#xff0c;认为大模型技术导致 NLP “死了”。在某乎上就有一条热门问答&#xff0c;大…

mac上VMware fusion net模式无法正常使用的问题

更新时间&#xff1a;2024年04月22日21:39:04 1. 问题 环境&#xff1a; intel芯片的macbook pro VMware fusion 13.5.1 无法将“Ethernet0”连接到虚拟网络“/dev/vmnet8”。在这里显示这个之后&#xff0c;应该是vmnet8的网段发生了冲突&#xff0c;所以导致无法正常使用…

一篇文章带您了解操作系统的体系结构

操作系统的体系结构有哪些&#xff1f; 我们可以利用时钟中断实现计时功能。 原语是一种特殊的程序&#xff0c;具有原子性。也就是说&#xff0c;这段程序的运行必须一气呵成&#xff0c;不能中断。 内核是操作系统最基本&#xff0c;最核心的部分。 实现操作系统内核功能的…

Opencv Python图像处理笔记一:图像、窗口基本操作

文章目录 前言一、输入输出1.1 图片读取显示保存1.2 视频读取保存1.3 文件读取保存 二、GUI2.1 窗口2.2 轨迹条2.3 画图2.4 鼠标回调 三、图像入门操作3.1 颜色空间转化3.2 通道分离合并3.3 添加边框3.4 算数操作 四、二值化4.1 普通4.2 自适应4.3 Otsu 参考 前言 随着人工智能…

PS入门|蒙版到底是个什么样的功能?看完就明白了

前言 前段时间一直说蒙版蒙版什么的&#xff0c;很多小伙伴估计都听得一头雾水。 抠个图要加蒙版&#xff0c;调个色要加蒙版。 小白感觉这个蒙版就像调味剂一样&#xff0c;啥都需要加一个蒙版。 动不动就加个蒙版&#xff0c;究竟是干啥用的&#xff1f; 今天咱们就深入来…

【深度学习-第5篇】使用Python快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例(使用pytorch框架)

在之前的文章中介绍了CNN的图解入门&#xff0c;CNN的MATLAB分类实现&#xff0c;CNN的MATLAB回归实现。 卷积神经网络(Convolutional Neural Networ&#xff0c;简称CNN)是一种广泛应用于图像识别领域的深度学习算法。它通过模拟人类视觉系统的层次结构&#xff0c;可以自动提…

【linux】软件工具安装 + vim 和 gcc 使用(上)

目录 1. linux 安装软件途径 2. rzsz 命令 3. vim 和 gcc 使用 a. vim的基本概念 b. 命令模式下的指令 c. 底行模式下的指令 1. linux 安装软件途径 源代码安装rpm安装 -- linux安装包yum安装&#xff08;最好&#xff0c;可以解决安装源&#xff0c;安装版本&#xff0…

实战 | 无视杀软使用远控工具进行横向移动Tips

实战 | 无视杀软使用远控工具进行横向移动Tips。 在有杀软拦截&#xff0c;CS无法上线的情况下&#xff0c;经常用到todesk和向日葵这两个远控工具进行横向移动。不过这两个工具现在好像不怎么好用了。不过无所谓&#xff0c;用其他的就是了&#xff0c;听说最近GotoHTTP很火&…

手拉手安装Kafka2.13发送和消费消息

Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft&#xff0c;两种方式只能选择其中一种启动&#xff0c;不能同时使用。 Kafka下载https://downloads.apache.org/kafka/3.7.0/kafka_2.…

四川易点慧电子商务抖音小店:安全正规,购物新选择

在当今互联网高速发展的时代&#xff0c;电子商务已经成为人们日常购物的重要组成部分。四川易点慧电子商务抖音小店作为新兴的电商平台&#xff0c;凭借其安全正规的经营理念和便捷高效的购物体验&#xff0c;正逐渐赢得消费者的信赖和喜爱。 一、平台背景实力雄厚 四川易点慧…

【Linux系统化学习】线程控制

目录 前言 POSIX线程库 线程控制 创建线程 线程终止 pthread_exit()函数 pthread_cancel()函数&#xff08;会在下面线程等待部分详解&#xff09; 线程等待 pthread_join()函数 获取线程退出码 分离线程 线程取消(pthread_cancel()函数&#xff09; 线程ID及进程…

Scikit-Learn支持向量机分类

Scikit-Learn 支持向量机分类 1、支持向量机&#xff08;SVM&#xff09;1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数1.4、支持向量机分类的优缺点 2、Scikit-Learn支持向量机分类2.1、Scikit-Learn支持向量机分类API2.2、支持向量机分类初体验&#xff08;手写数字识别&#…

【工具-PyCharm】

工具-PyCharm ■ PyCharm-简介■ PyCharm-安装■ PyCharm-使用■ 修改主题■ 设置字体■ 代码模板■ 解释器配置■ 文件默认编码■ 快捷键■ 折叠■ 移动■ 注释■ 编辑■ 删除■ 查看■ 缩进■ 替换 ■ PyCharm-简介 官方下载地址 Professional&#xff1a;专业版&#xff0…

头脑风暴法的四个原则,设计师必看!

俗话说 “三个臭皮匠超越诸葛亮”&#xff0c;这在工作场景中也是如此。最常见的工作场景是会议。会议的目的很多&#xff0c;如工作报告、产品宣传等。头脑风暴是一种工作会议。其目的是集思广益&#xff0c;充分发挥团队的智慧。有效的头脑风暴不仅考验组织者的会议控制能力&…