summaryrefslogtreecommitdiff
path: root/rtl/gfx
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-06-01 14:55:11 -0600
committerAlejandro Soto <alejandro@34project.org>2024-06-01 15:10:06 -0600
commit8fb28df31fcee15c82a57ed3988e8eb0f23a32b6 (patch)
tree6249df65aa75e5f33cd0c35add513748fe829476 /rtl/gfx
parent41a944b7577833e7dad6f2bee74ccc0082cc5717 (diff)
rtl/gfx: fix bugs found in gfx_shader_bind testbench
Diffstat (limited to '')
-rw-r--r--rtl/gfx/gfx_shader_front.sv12
1 files changed, 9 insertions, 3 deletions
diff --git a/rtl/gfx/gfx_shader_front.sv b/rtl/gfx/gfx_shader_front.sv
index 543b534..31dc5b4 100644
--- a/rtl/gfx/gfx_shader_front.sv
+++ b/rtl/gfx/gfx_shader_front.sv
@@ -269,7 +269,8 @@ import gfx::*;
if_beats #($bits(icache_line_tag)) pending_in(), pending_out();
- logic accessed_write, accessed_write_enable, burst, fetch_done, hit_write,
+ logic access_lost_1, access_lost_2, access_lost_3, access_lost_4, accessed_4,
+ accessed_write, accessed_write_enable, burst, fetch_done, hit_write,
in_flush, hit_commit, hit_write_enable, retry_4, retry_5, rollback,
tag_hit, valid_1, valid_2, valid_3, valid_4, valid_5, valid_write,
valid_write_enable;
@@ -349,7 +350,7 @@ import gfx::*;
valid_4 <= valid_3;
valid_5 <= valid_4;
- burst <= valid_3 & ~tag_hit & ~read.accessed & (~read.valid | read.hit);
+ burst <= valid_3 & ~read.accessed & ~access_lost_3 & (~read.valid | (read.hit & ~tag_hit));
end
always_ff @(posedge clk) begin
@@ -409,21 +410,26 @@ import gfx::*;
cache[hit_write_line].hit <= hit_write;
read_addr_1 <= read_addr;
+ access_lost_1 <= rollback | (fetch_done & ~hit_commit & pending_out.rx.valid);
read_hold <= cache[read_addr_1.line_tag.line];
read_addr_2 <= read_addr_1;
+ access_lost_2 <= access_lost_1;
read <= read_hold;
read_addr_3 <= read_addr_2;
+ access_lost_3 <= access_lost_2;
data_4 <= data_3[read_addr_3.word_num[2]];
retry_4 <= ~tag_hit | ~read.valid;
+ accessed_4 <= read.accessed;
hit_commit <= valid_3 & tag_hit & read.valid;
read_addr_4 <= read_addr_3;
+ access_lost_4 <= access_lost_3;
data_5 <= data_4[read_addr_4.word_num[1]];
retry_5 <= retry_4;
- rollback <= burst & (~request_valid | ~pending_in.tx.valid);
+ rollback <= ~access_lost_4 & ~accessed_4 & (~request_valid | ~pending_in.tx.valid);
read_addr_5 <= read_addr_4;
insn <= data_5[read_addr_5.word_num[0]];