【芯片前端】保持代码手感——一对多的握手拆分模块

前言

最近还是在写spec文档,一天不写代码保持手感的大业就不能停止。

这篇是握手拆分的模块,一般来说握手拆分有两种情况,一种是所有下游ready同时拉起了才向上握手,另外一种是下游可以分先后接收数据,每一路都接收完成后向上握手。本篇文章实现的是第二种形式。

欢迎下载测试:verilog_cbb: 个人常用cbb for verilog

接口

接口的形式是比较简单的,上游是一路握手,下游是多路握手。

实现

整体代码的实现思路其实也不难,就是使用一个history寄存器记录对下游握手的情况。当对下游只剩一路没有握手且当拍对应的out_ready置起,那么就可以对上游握手了。

module hand_split #(
	parameter CHANNEL = 2
)(
	input  clk,
	input  rst_n,
	
	input  in_valid,
	output in_ready,
	
	output [CHANNEL -1:0]out_valid,
	input  [CHANNEL -1:0]out_ready
);

//in out hand_en
wire 			   in_hand_en  = in_valid  & in_ready;
wire [CHANNEL -1:0]out_hand_en = out_valid & out_ready;

//history hand record
reg  [CHANNEL -1:0]history_q;
wire [CHANNEL -1:0]history_d;
wire 			   history_en;

assign history_en = (|out_hand_en) || in_hand_en;
assign history_d  = in_hand_en ? {CHANNEL{1'b0}} : history_q | (out_valid & out_ready);
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)  		history_q <= {CHANNEL{1'b0}};
	else if(history_en) history_q <= history_d;
end

//out valid
assign out_valid = {CHANNEL{in_valid}} & (~history_q);

//in_ready
assign in_ready  =  ((history_q | out_ready) == {CHANNEL{1'b1}});

endmodule

 波形

通过auto_verification打出波形验证功能:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值