Skip to content

Commit bfc2c20

Browse files
author
marqs
committed
try fixing rare issue of LM emif IF getting stuck
1 parent a3c06df commit bfc2c20

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

rtl/linebuf_top.v

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ wire [191:0] linebuf_wrdata = {emif_rd_rdata[23:0], emif_rd_rdata[55:32], emif_r
186186
wire [9:0] linebuf_wraddr = {blocks_copied + (line_id ? 0 : 320)};
187187
wire [19:0] emif_rd_block_addr = {ypos_lb_next, blocks_copied};
188188
reg line_id_brclk_sync1_reg, line_id_brclk_sync2_reg, line_id_brclk_sync3_reg;
189+
wire line_id_change = (line_id_brclk_sync2_reg != line_id_brclk_sync3_reg);
190+
reg [1:0] emif_rd_timeout;
189191

190192

191193
linebuf_double linebuf_rgb (
@@ -205,23 +207,29 @@ always @(posedge emif_br_clk or posedge emif_br_reset) begin
205207
if (emif_br_reset) begin
206208
emif_rd_read <= 1'b0;
207209
emif_rd_burstcount <= 1'b0;
210+
emif_rd_timeout <= 2'h0;
208211
end else begin
209212
if (emif_rd_burstcount > 0) begin // always finish read first, make sure doesn't last longer than line length
210213
if (emif_rd_readdatavalid) begin
211214
blocks_copied <= blocks_copied + 1'b1;
212215
emif_rd_burstcount <= emif_rd_burstcount - 1'b1;
216+
end else if (line_id_change) begin
217+
emif_rd_timeout <= emif_rd_timeout + 1'b1;
218+
if (emif_rd_timeout == 2'h3)
219+
emif_rd_burstcount <= 0;
213220
end
214221
if (!emif_rd_waitrequest)
215222
emif_rd_read <= 1'b0;
216223
`ifdef DEBUG
217-
emif_rd_line_missed <= (line_id_brclk_sync2_reg != line_id_brclk_sync3_reg);
224+
emif_rd_line_missed <= line_id_change;
218225
`endif
219-
end else if (line_id_brclk_sync2_reg != line_id_brclk_sync3_reg) begin
226+
end else if (line_id_change) begin
220227
blocks_copied <= 0;
221228
end else if (lb_enable & (blocks_copied < blocks_per_line)) begin
222229
emif_rd_read <= 1'b1;
223230
emif_rd_burstcount <= ((blocks_per_line-blocks_copied) > EMIF_RD_MAXBURST) ? EMIF_RD_MAXBURST : (blocks_per_line-blocks_copied);
224231
emif_rd_addr <= {3'b001, emif_rd_block_addr, 5'h0};
232+
emif_rd_timeout <= 2'h0;
225233
end
226234

227235
line_id_brclk_sync1_reg <= line_id;

0 commit comments

Comments
 (0)