学习valid/ready协议

文章讨论了在模块级流水线中使用Valid/Ready协议时如何避免死锁问题。作者指出,Valid和Ready信号不应相互依赖,否则可能导致数据气泡或死锁。通过示例代码解释了当后级Ready信号能反压时,如何正确控制数据寄存器,以消除data_out_vld的无效气泡,但同时指出该版本的代码仍存在data_out气泡的问题。
摘要由CSDN通过智能技术生成

如何写控制逻辑(三):模块级流水和valid/ready协议 - 知乎 (zhihu.com)

1、我没能理解valid/ready不能相互依赖是针对两端的sender/receiver的,中间级即使依赖了(如上valid依赖ready)也不过是ready before valid,产生气泡,但不会死锁;
2、误解了

data_out_vld <= ( data_in_rdy && DataInVld ) ? DataInVld : data_out_vld; 
注:这样data_out_vld恒等于1;

可以等于为

data_out_vld <= data_in_rdy ? DataInVld : data_out_vld;

也即没有正确理解因为后级的ready要反压,所以它就需要有能力控制寄存器在后级ready=0时可以将寄存器停下,注意是具有反压能力的ready而不是握手成功( data_in_rdy && DataInVld )。

//----------------------Version 5: Wrong--------------------------------------------------
always @ *
begin
    data_in_rdy = DataOutRdy;
end

always @( posedge Clk or negedge Rstn )
begin
    if( ~Rstn )
        data_out <= 'h0;
    else if( Clear )
        data_out <= 'h0;
    else if( data_in_rdy && DataInVld )//backpressure:data_in_rdy &&
        data_out <= DataIn << 1 + DataIn;
end

always @( posedge Clk or negedge Rstn )
begin
    if( ~Rstn )
        data_out_vld <= 'h0;
    else if( Clear )
        data_out_vld <= 'h0;
    else if( DataInVld )
        data_out_vld <= 'h1;
    else if( DataOutRdy && data_out_vld )
        data_out_vld <= 'h0;
end
//------------------------------------------------------------------------------------

 这堆代码错误原因,虽然会挤掉data_out_vld 气泡,但是data_out 气泡无效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值