百度网站引流怎么做,优秀设计作品的网站,网站推广国外,商城网站建设明细报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中#xff0c;经常涉及到报文的数据流处理#xff1b;为了防止数据丢失#xff0c;和各模块的流水处理#xff1b;因此需要到反压机制#xff1b; 反压机制目前接触到的有两种#xff1a;一是基… 报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中经常涉及到报文的数据流处理为了防止数据丢失和各模块的流水处理因此需要到反压机制 反压机制目前接触到的有两种一是基于握手valid-ready信号的反压二是基于credits的反压 所谓反压就是能够压住FIFO前级的发送和本级FIFO源头反压若是有多个FIFO的话还会涉及到调度问题 本篇博客重点介绍带存储体FIFO的反压原理和实现
1 带存储体的反压
1.1 原理图
示意图如下基本上涉及数据流的处理会在本级模块前级上放置一个FIFO首先本级模块会进行处理由于比如grant或者某些ctrl信号无法及时处理FIFO无法pop出去就会积压在本模块前级FIFO中最终当累积到某种深度上会向前级模块进行反压不要在发送
1.2 Demo
设计一个并行6输入32bit加法器输出一个带截断的32bit加法结果要求用三级流水设计带反压信号 本Demo的存储体是存储在本级模块后面中前提是前级模块都是能够立即使用的不需要等待什么条件
module pressure_fifo #(parameter FIFO_DATA_WIDTH 32,parameter FIFO_DEPTH 8
)(input wire clk,input wire rst,input wire valid_i,output logic ready_o, //给前级信号的准备信号input wire [32 -1:0] a,b,c,d,e,f//outputinput wire ready_i,output logic [32 -1:0] dout,output logic valid_o
)localparam WATERLINE FIFO_DEPTH - 3; //three levels pipelinelogic handshake;logic handshake_ff1;logic handshake_ff2;logic wr_en;assign handshake ready_o valid_i; //按理说ready_o拉高后前级模块不应该进行发数据在这里就是保险判断即使valid_i有效ready_o未准备好的话会进行丢弃数据always (posedge clk or posedge rst) beginif(rst) beginhandshake_ff1 0;handshake_ff2 0;endelse beginhandshake_ff1 handshake;handshake_ff2 handshake_ff1;endendreg [31 : 0] r1_ab;always (posedge clk or posedge rst) beginif(rst) beginr1_ab 0;endelse if(handshake)beginr1_ab a b;endendreg [31 : 0] r1_cd;always (posedge clk or posedge rst) beginif(rst) beginr1_cd 0;endelse if(handshake)beginr1_cd c d;endendreg [31 : 0] r1_ef;always (posedge clk or posedge rst) beginif(rst) beginr1_ef 0;endelse if(handshake)beginr1_ef e f;endendreg [31 : 0] r2_abcd;always (posedge clk or posedge rst) beginif(rst) beginr2_abcd 0;endelse if(handshake_ff1) beginr2_abcd r1_ab r1_cd;endendreg [31 : 0] r2_ef;always (posedge clk or posedge rst) beginif(rst) beginr2_ef 0;endelse if(handshake_ff1) beginr2_ef r1_ef;endendreg [31 : 0] r3;always (posedge clk or posedge rst) beginif(rst) beginr3 0;endelse if(handshake_ff2) beginr3 r2_ef r2_abcd;endendalways (posedge clk or posedge rst) beginif(rst) beginwr_en 1b0;endelse if(handshake_ff2) beginwr_en 1b1;endelse beginwr_en 1b0;endendalways_ff (posedge clk)beginif(rst)beginready_o 1b0;endelse if(usedw WATERLINE)begin //当使用的深度超过fifo存储体时就要对上级反压ready_o 1b0;endelse beginready_o 1b1;endendassign valid_o ~empty;// 同步FIFO存储体--看用了多少fifo深度3级流水线在反压起作用时会一下子进入3个数据sync_fifo # (.MEM_TYPE (auto ),.READ_MODE (fwft ),.WIDTH (FIFO_DATA_WIDTH),.DEPTH (FIFO_DEPTH ))fifo_inst(.clk (clk ), // input wire.rst_n (rst_n ), // input wire.wren (wr_en ), // input wire.din (r3 ), // input wire [WIDTH-1:0].rden (ready_i ), // input wire.dout (dout ), // output reg [WIDTH-1:0].empty (empty ), // output wire.usedw (usedw ));endmodule
这个比较简单相当于是从入口来我这的每排都有效不要事先在前面进行先存储住比如说另一种情况前级模块给我发过来的数据但是因为其他条件未准备好我无法立即进行使用因此也需要先暂存在本模块最前面的fifo存储体中
基本上划分模块的时候真实应用场景都是采用逐级模块向前反压在这里简单有个概念逐级反压和跨级反压
逐级反压流水线深度好把握也是项目中最经常用到的 跨级反压流水线深度是waterlie3 在途1 waterline1 在途2 waterline2 在途3 (在途means 流水线深度) 【Refer】 1.https://zhuanlan.zhihu.com/p/359330607