握手信号valid/ready的打拍技巧

2023-11-13

一、前言
  • valid和ready信号,尤其是ready信号的时序一般很差,因为它通常是接收端通过组合逻辑输出的。当流水线的级数较多时,ready反压信号一级一级往前传递,时序将会变得更差。
  • 为了优化时序,通常需要对valid和ready信号进行打拍处理。但是由于握手信号的特点,使得这两个信号直接打拍时会发生协议错误,此时就需要使用一些技巧来解决这个问题。

通常对于握手信号的打拍处理有以下三种方式:

  • Forward Register Slice:仅处理valid和data信号的打拍
  • Backward Register Slice:仅处理ready信号的打拍
  • Full Register Slice:同时处理valid信号与ready信号的打拍
二、Forward Register Slice

传送门:valid-ready握手协议中valid及data信号的打拍技巧

module valid_flop
        (
        CLK,
        RESET,
        VALID_UP,
        READY_UP,
        DATA_UP,
        VALID_DOWN,
        READY_DOWN,
        DATA_DOWN
        );

//-----------------------------------------------------------------------------
parameter WIDTH            = 32                                                 ;

//-----------------------------------------------------------------------------
input                      CLK;
input                      RESET;
input                      VALID_UP;
output                     READY_UP;
input  [WIDTH-1:0]         DATA_UP;
output                     VALID_DOWN;
input                      READY_DOWN;
output [WIDTH-1:0]         DATA_DOWN                                            ;

//-----------------------------------------------------------------------------
wire                       CLK;
wire                       RESET;
wire                       VALID_UP;
wire                       READY_UP;
wire   [WIDTH-1:0]         DATA_UP;
//Down Stream
reg                        VALID_DOWN;
wire                       READY_DOWN;
reg    [WIDTH-1:0]         DATA_DOWN;

//-----------------------------------------------------------------------------
//Valid
always @(posedge CLK)
if (RESET)  VALID_DOWN <= 1'b0;
else        VALID_DOWN <= READY_UP ? VALID_UP : VALID_DOWN;
//Data
always @(posedge CLK)
if (RESET)  DATA_DOWN <= {WIDTH{1'b0}};
else        DATA_DOWN <= (READY_UP && VALID_UP) ? DATA_UP : DATA_DOWN;
//READY with buble collapsing.
assign READY_UP = READY_DOWN || ~VALID_DOWN;
//READY with no buble collapsing.
//assign READY_UP = READY_DOWN;
endmodule

在这里插入图片描述

中心思想:在接收端握手成功之前,发送端要将valid和data一直保持住!为了保证接收端在ready_i(READY_DOWN)信号有效时能够采集到data,data必须提前打拍。data在打拍时,使用的是接收端传递给发送端的ready_o(READY_UP)信号,而为了实现提前打拍,ready_o(READY_UP)的值可以等于ready_i(READY_DOWN)|| ~ (valid_o)VALID_DOWN

三、Backward Register Slice

芯片设计-skid buffer(ready打断) 这篇文章中详细介绍的方案一就是典型的skid buffer处理方式。

// ports
output reg     data_i_ready;
input          data_i_valid;
input [DW-1:0] data_i;

input           data_o_ready;
output          data_o_valid;
output [DW-1:0] data_o;

// signals
wire          buf_valid;
reg  [DW-1:0] buf_data;

// data_i_ready由组合逻辑改为时序逻辑
// assign data_i_ready = ~data_o_valid || data_o_ready;
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n)
        data_i_ready <= 1; //有个buf放在那,因此复位后至少可以收一个数据。
    else if(data_o_ready)
        data_i_ready <= 1;
    else if(data_i_valid)  //在data_o_ready拉低后的那一个周期,如果没有数据过来,表明buf为空,可以进数据,data_i_ready保持为1
        data_i_ready <= 0; //如果有数据过来,buf被占,则不允许再进数据了,data_i_ready拉低。
end

// ************关于buf_valid和buf_data有2种方案
/*
方案1:所有输入端口的数据都会进入buf,但其实只有(!data_o_ready && data_i_valid && data_i_ready)时刻进去才会发挥作用
优点:控制逻辑简单;缺点:功耗有所增加
*/
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) //可能有些控制信号通过本模块的data端口进行传输,因此有必要进行复位。
        buf_data <= 0;
    else if(data_i_ready) //不挑时刻,所有数据都进,但是真正有效的还是(!data_o_ready && data_i_valid && data_i_ready)时刻的数据
        buf_data <= data_i;
end

assign buf_valid = ~data_i_ready;

/*
方案2:只有(!data_o_ready && data_i_valid && data_i_ready)时刻数据才会进入buf
优点:功耗略低;缺点:控制逻辑稍微复杂点
*/
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) 
        buf_data <= 0;
    else if(!data_o_ready && data_i_valid && data_i_ready) //该条件下,将向buf中存入数据
        buf_data <= data_i;
end

// 这段其实等效于assign buf_valid = ~data_i_ready; 写成下面这样更好理解
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) 
        buf_valid <= 0;
    else if(data_o_ready)
        buf_valid <= 0; //当data_o_ready拉高,优先读走buf中的数据。
    else if(!data_o_ready && data_i_valid && data_i_ready) //该条件下,将向buf中存入数据
        buf_valid <= 1; 
end

// out,如果buf中有数据,优先读走buf中的数据
assign data_o_valid = data_i_ready? data_i_valid : buf_valid;
assign data_o       = data_i_ready? data_i       : buf_data;

在这里插入图片描述
在这里插入图片描述

中心思想:在情况1时刻,如果输入端有数据进入,则使用buf对该数据进行暂存。在情况2时刻,如果buf中存有数据,则优先输出buf中的数据。

四、Full Register Slice

https://zhuanlan.zhihu.com/p/212356622 这篇文章中的FIFO处理模式就是Full Register Slice。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

握手信号valid/ready的打拍技巧 的相关文章

  • 错误:“(vlog-2110) 非法引用网络”

    我在 SystemVerilog 中有一个简单的 FIFO 代码 我得到几个vlog 2110 illegal reference to net错误消息 我的错误消息后面是我的代码 错误信息 vlog work 工作 sv stats no
  • 在 Verilog 中生成 For 循环中实例化模块

    我正在尝试使用 Verilog 实例化一些模块generate块 因为我将实例化可变数量的它们 genvar i generate for i 1 i lt 10 i i 1 begin status whatever status clk
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • 使用数据流模型的T触发器

    我正在尝试模拟 t flipflop 的工作 timescale 1ns 1ps module t flipflop input t input clk input clear output q output qbar wire sbar
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • 在逻辑中使用单端端口期待差异对?

    我使用的逻辑被设置为需要一个差分对时钟端口 然而 对于一个特定的应用程序 我只能输入一个单端时钟 由于硬件限制 修改逻辑以接受单端时钟不是一种选择 因为涉及许多文件和代码行 有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 在verilog中将wire值转换为整数

    我想将电线中的数据转换为整数 例如 wire 2 0 w 3 b101 我想要一个将其转换为 5 并将其存储在整数中的方法 我怎样才能以比这更好的方式做到这一点 j 1 for i 0 i lt 2 i i 1 begin a a w i
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何使用 don't cares 参数化 case 语句?

    我有一条称为输入的电线 我想检测前导的数量 我正在尝试创建一个模块 该模块使用下面的 case 语句根据前导零的数量更改输出数据 然而 输入的大小是可参数化的 如果 X 是固定值 4 我将创建一个 case 语句 case input 4
  • 我们可以在 C 或 SystemVerilog 中使用 ifdef MACROS 中的条件吗?

    我想要那样的东西 ifdef N O gt N I define GREATER 1 else define LESSER 1 endif 但做不到 有什么解决方案或阅读吗 我很努力地想要做到这一点 但是却做不到 Verilog 不提供这样
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • 系统 verilog 中没有类型的输入

    我在一个系统 verilog 代码的输入和输出的示例中遇到过module没有说明它们的类型 例如logic wire module mat to stream input 2 0 2 0 2 0 a b input newdata inpu

随机推荐

  • 一问解读OpenCV的计算机视觉中视频处理

    微信公众号 小白图像与视觉 关于技术 关注yysilence00 有问题或建议 请公众号留言 了解OpenCV的计算机视觉 OpenCV Python教程 在本OpenCV Python教程中 我们将介绍在Python中使用OpenCV进行
  • Linux 内核 MIPI LCD 驱动移植

    实验原理 DSI Display Serial Interface 是有 MIPI联盟定义的一组通信协议的一部分 MIPI DSI主机控制器是一个数字核心 实现 MIPI DSI 规范中定义的所有协议功能 它提供了系统和MIPI D PHY
  • Flutter Text 下面有两个默认的下划线,和设置划掉效果

    Text的decoration默认是TextDecoration none 不知道什么原因 有时候定义的Text下面会出现两个下划线 如下图 此时要去掉下面的下划线只需要在style下面的TextStyle增加属性decoration Te
  • CPU : 什么是双核处理器

    CPU 什么是双核处理器 双核处理器 Dual Core Processor 双核处理器是指在一个处理器上集成两个运算核心 从而提高计算能力 双核 的概念最早是由IBM HP Sun等支持RISC架构的高端服务器厂商提出的 主要运用于服务器
  • JavaDoc注释的使用跟导出JavaDoc文档

    1 Javadoc是什么 JavaDoc是Sun公司提供一种从程序源代码中抽取类 方法 成员等注释形成一个和源代码配套的API帮助文档技术 但是需要在编写程序时以一套特定的标签作注释 在程序编写完成 后 通过Javadoc就可以同时形成程序
  • Docker数据持久化

    v 持久化 三种 默认的 volumes 占用一部分宿主机的资源 最常用的方式 bind mounts 不同的数据结构不通不可移植 不能写在dockerfile中 比较常用 tmpfs 挂载到内存当中 一般都不会用 docker run i
  • 调研-笔记-基于生成对抗网络的恶意域名训练数据生成

    DGA 域名字符生成模型 域名字符分析 问题 理论上 GAN 中的生成器和判别器部分采用任意可微函数都能表示 因此其主要用于连续数据的处理 如图像生成 视频检测等 13 基于文本的离散数据处理一直是深度神经网络研究的难点之一 本文基于字符串
  • 有源低通滤波器设计

    本文主要记录本人最近项目使用的低通滤波器 对滤波器性能要求是 通频带内增益约11dB 对22HZ以上的频率尽可能滤除 特别是50HZ的工频信号 要求衰减到 50dB或更小 由于巴特沃斯滤波器的特点是通频带的频率响应曲线最平滑 所以选择了巴特
  • WPF--关于控件输入数值验证

    1 XAML代码
  • 开发一个APP多少钱?

    开发一个APP多少钱 开发一个APP要多少钱 相信不光是客户有这个疑问 就算是一般的程序员也想知道答案 很多程序员想在业余时间接外包挣外快 但是他们常常不知道该如何定价 如何有说服力的要价 这是因为没有一套好的计算APP开发成本的方法 由于
  • 浅析ms17_010(永恒之蓝)漏洞利用过程及防护措施

    一 永恒之蓝 Wannacry 漏洞简介 1 一种 蠕虫式 的勒索病毒软件 利用windows的SMB漏洞传播 可以获取System最高权限 2 主要对windows服务器 主机有较大影响 黑客利用病毒对电脑重要文件进行加密 索要高比特币
  • 仓库管理系统c#语言代码,C#仓库管理系统+完整源代码

    Name MineFrame File MineFrame cs Description 此类用于仓库管理系统主界面的操作管理 Author XXX DateTime 2008年6月17日 using System using System
  • Node.js中设置时区的方法

    process env TZ Asia Shanghai 转载于 https www cnblogs com luluzero p 6339304 html
  • input选择保存的文件夹路径

    input添加这两个属性directory nwdirectory
  • stl_set

    begin 返回指向第一个元素的 迭代器 clear 清除所有元素 size 集合中元素的数目 count 返回某个值元素的个数 empty 如果集合为空 返回true 真 end 返回指向最后一个元素之后的迭代器 不是最后一个元素器 in
  • vue 省市区三级联动选择 pc端项目插件element-china-area-data(非常推荐)

    使用步骤 1 npm install element china area data S 2 import provinceAndCityData regionData provinceAndCityDataPlus regionDataP
  • 解决挂载ext4格式文件系统错误 JBD2: Unrecognised features on journal问题

    1 mount demo img mnt dmesg 报如下错误 1479130 280508 JBD2 Unrecognised features on journal 1479130 280512 EXT4 fs loop1 error
  • python 如果你的年龄大于18_python基础

    在python是空格是很重要的比如 如果在print前面加一个空格就会报错 在python中你必须顶格写 if 要判断的条件 条件成立时要执行的事情 图1 在图1中要判断的条件是年龄是不是大于18岁 大于18岁就可以去酒吧了 else语句配
  • Qt实现简单的显示网页(QtWebkit、QtWebEngine、QAxWidget)

    首先先说说QtWebkit QtWebEngine QAxWidget三种方式显示网页的应用场景 QtWebkit 在Qt5 6以前 都是使用QtWebkit组件 但Qt5 6以后 移除了QtWebkit这个组件 QtWebEngine Q
  • 握手信号valid/ready的打拍技巧

    一 前言 valid和ready信号 尤其是ready信号的时序一般很差 因为它通常是接收端通过组合逻辑输出的 当流水线的级数较多时 ready反压信号一级一级往前传递 时序将会变得更差 为了优化时序 通常需要对valid和ready信号进