在芯片中常常用到握手协议中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