|
@@ -427,20 +427,26 @@ module abcbus (
|
|
|
end // else: !if(~rst_n)
|
|
|
|
|
|
// Memory read latency counter
|
|
|
- reg [15:0] memrd_latency_ctr = 'b0;
|
|
|
- reg [15:0] memrd_latency_max = 'b0;
|
|
|
+ reg [7:0] memrd_latency_ctr = 'b0;
|
|
|
+ reg [7:0] memrd_latency_max = 'b0;
|
|
|
+ reg memrd_latency_err = 1'b0;
|
|
|
|
|
|
- wire [15:0] memrd_latency_ctr_next = memrd_latency_ctr + 1'b1;
|
|
|
+ wire [7:0] memrd_latency_ctr_next = memrd_latency_ctr + 1'b1;
|
|
|
|
|
|
always @(posedge sdram_clk)
|
|
|
begin
|
|
|
- if (abc_do_memrd)
|
|
|
+ if (abc_do_memrd & ~sdram_ready)
|
|
|
begin
|
|
|
memrd_latency_ctr <= memrd_latency_ctr_next;
|
|
|
if (memrd_latency_max == memrd_latency_ctr)
|
|
|
memrd_latency_max <= memrd_latency_ctr_next;
|
|
|
+
|
|
|
+ // If abc_xmemrd goes away, then we missed our time
|
|
|
+ // window... this is bad.
|
|
|
+ if (~abc_xmemrd)
|
|
|
+ memrd_latency_err <= 1'b1;
|
|
|
end // else: !if(~abc_do_memrd)
|
|
|
- else
|
|
|
+ else if (~abc_do_memrd)
|
|
|
begin
|
|
|
memrd_latency_ctr <= 'b0;
|
|
|
end
|
|
@@ -538,7 +544,7 @@ module abcbus (
|
|
|
5'b00011: cpu_rdata = { 28'b0, abc_resin, abc_nmi, abc_int, abc_wait };
|
|
|
5'b00100: cpu_rdata = { 21'b0, reg_out_addr, reg_out_data };
|
|
|
5'b00101: cpu_rdata = { 14'b0, inp_en, reg_inp_data[1], reg_inp_data[0] };
|
|
|
- 5'b00111: cpu_rdata = { 16'b0, memrd_latency_max };
|
|
|
+ 5'b00111: cpu_rdata = { 23'b0, memrd_latency_err, memrd_latency_max };
|
|
|
default: cpu_rdata = 32'bx;
|
|
|
endcase // casez (cpu_addr[5:2])
|
|
|
|