学习valid/ready协议

  • Post author:
  • Post category:其他



如何写控制逻辑(三):模块级流水和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 气泡无效。



版权声明:本文为qq_40502147原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。