前言
【芯片前端】保持代码手感——同步FIFO
写完同步fifo的文章后,想起了刚开始的一个错误写法:我做了一个计数器用来算fifo_cnt,就是winc有效就加1,rinc有效就减1;
思路
以前遇到这种问题我都是这样写的:
reg [DP_WD -1:] fifo_cnt; wire fifo_cnt_en = winc | rinc; wire [DP_WD -1:] fifo_cnt_d = (winc&rinc) ? fifo_cnt : winc ? fifo_cnt + 1 : rinc ? fifo_cnt - 1 : fifo_cnt; always @(posedge clk or negedge rst_n)begin if(~rst_n) fifo_cnt<= 0; else if(fifo_cnt_en) fifo_cnt<= fifo_cnt_d; end
后来我发现逻辑可以简化:
reg [DP_WD -1:] fifo_cnt; wire fifo_cnt_en = winc ^ rinc; wire [DP_WD -1:] fifo_cnt_d = winc ? fifo_cnt + 1 : fifo_cnt - 1; always @(posedge clk or negedge rst_n)begin if(~rst_n) fifo_cnt<= 0; else if(fifo_cnt_en) fifo_cnt<= fifo_cnt_d; end
代价就是,fifo_cnt_d这个信号基本就不能用了,没法在当拍做其他逻辑o(╥﹏╥)o