如何写控制逻辑(三):模块级流水和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 版权协议,转载请附上原文出处链接和本声明。