握手协议打拍

在芯片中常常用到握手协议中vaild或者ready延迟过大,此时需要对握手协议进行打拍。但打拍不能简单的拿寄存器打一拍。

前向打拍

如果对valid和数据打拍,那么就是前向打拍

复制代码
module cmm_streamPipeForward(
input clk,
input rst_n,
input slv_rvalid,
output slv_ready,
input [1:0] data,

output mst_valid,
output [1:0] mst_data,
input  mst_ready);

reg pipe_valid;
reg [1:0] pipe_data;

always@(posedge clk or negedge rst_n)
  begin
  if(~rst_n)
    begin
    pipe_valid <= 1'b0;
    pipe_data  <= 2'b0;
    end
  else
    begin
    if(slv_ready)
      begin
      pipe_valid <= slv_valid;
      pipe_data <= slv_data;
      end
    end
  end


assign mst_valid = pipe_valid;
assign mst_data = pipe_data;
assign slv_ready = pipe_valid ? mst_ready :1'b1;



endmodule 

后向打拍

后向打拍主要针对ready打拍。因为ready打拍,延迟一拍,所以内部也要缓存一笔数据。

复制代码
module cmm_straemPipeBackward(
  input  clk,
  input rst_n,
  input slv_valid,
  output slv_ready,
  input [1:0] data,
  output mst_valid,
  output [1:0] mst_data,
  input  mst_ready
);

reg pipe_ready;
reg pipe_data

always@(posedge clk or negedge rst_n)
  begin
  if(!rst_n)
    begin
    pipe_ready <=1'b1;
    pipe_data <=2'b0;
    end
  else
   begin
   if(slv_valid)
     begin
     pipe_ready <= 1'b0; 
     end
   if(mst_ready)
     begin
     pipe_ready <= 1'b1;
     end
    
   if(slv_ready)
     begin
     pipe_data <=slv_data;
     end
   end
  end


assign slv_ready = pipe_ready;
assign mst_valid = slv_valid ||(!pipe_ready);
assign mst_data = pipe_data;




endmodule

如果双边都要打拍,那么就需要加一个前向然后再加一个后向,组合起来。

相关推荐
源远流长jerry2 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
虾..2 小时前
UDP协议
网络·网络协议·udp
w-w0w-w3 小时前
Unix网络编程
服务器·网络·unix
未知鱼3 小时前
Python安全开发之子域名扫描器(含详细注释)
网络·python·安全·web安全·网络安全
寂柒3 小时前
序列化与反序列化
linux·网络
志栋智能4 小时前
超自动化巡检:应对复杂IT环境的必然选择
运维·网络·安全·web安全·自动化
上海云盾-小余5 小时前
云主机安全加固:从系统、网络到应用的零信任配置
网络·安全·php
QCzblack6 小时前
见面考复现
网络
Eric.Lee20217 小时前
查看ubuntu机器正在使用的网络端口
网络·ubuntu·php
Zero-Talent7 小时前
TCP/IP协议
运维·服务器·网络