可以先配合异步FIFO基础知识食用,
Part.1
第一块Binary Logic:判断二进制Pointer什么时候+1,生成ptr_bin_next信号,assign wptr_bin_next = wptr_bin + (winc & (!wfull));
Part.2
第二块Gray Logic:由Binary Pointer生成Gary Pointer,其实这里根据经典AFIFO论文[1]里应该是用新的wptr_bin_next生成wptr_gray_next,这样wptr_bin和wptr_gray可以同步更新。(这里为了Pass牛客网的测试案例,需要将wptr_bin_next改为 wptr_bin生成,这样格雷码指针会比二进制指针慢一拍),assign wptr_gray_next = wptr_bin_next ^ (wptr_bin_next >> 1);
新态逻辑写完后赋值给Reg变量
{wptr_bin,wptr_gray} <= {wptr_bin_next, wptr_gray_next};
Part.3
第三块Empty Logic:将wptr_gray在read时钟域打2拍,做空判断,assign rempty = rptr_gray == wptr_gray_rr2;
Part.4
第四块Full Logic:将rptr_gray在write时钟域打2拍,做满判断,assign wfull = wptr_gray == {~rptr_gray_wr2[ADDR_WIDTH:ADDR_WIDTH-1], rptr_gray_wr2[ADDR_WIDTH-2:0]};
Part.5
第五块Full Logic:例化RAM,addr为ptr_bin次高位到最低位,最后添加一点点细节,形成完整代码