diff --git a/hw/rtl/cache/VX_tag_access.v b/hw/rtl/cache/VX_tag_access.v index 2745cffc..fe87f0f6 100644 --- a/hw/rtl/cache/VX_tag_access.v +++ b/hw/rtl/cache/VX_tag_access.v @@ -112,23 +112,24 @@ module VX_tag_access #( assign use_invalidate = valid_in && is_snp_in && tags_match - && (use_read_dirty || snp_invalidate_in) // block is dirty or should invalidate + && (use_read_dirty || snp_invalidate_in) && !force_miss_in && !stall; - assign miss_out = core_req_miss; - assign dirty_out = valid_in && use_read_valid && use_read_dirty; + assign miss_out = core_req_miss; + + assign dirty_out = valid_in && use_read_valid && use_read_dirty + && !(is_fill_in && tags_match); // disable writeback for redundant fills assign readtag_out = use_read_tag; - assign writeen_out = (use_do_write || use_do_fill); + assign writeen_out = (use_do_write || use_do_fill); `ifdef DBG_PRINT_CACHE_TAG always @(posedge clk) begin if (valid_in && !stall) begin if (use_do_fill && tags_match) begin $display("%t: warning: redundant fill - addr=%0h", $time, `LINE_TO_BYTE_ADDR(addr_in, BANK_ID)); - assert(0); - end + end if (use_do_fill) begin $display("%t: cache%0d:%0d tag-fill: addr=%0h, blk_addr=%0d, tag_id=%0h, old_tag_id=%0h", $time, CACHE_ID, BANK_ID, `LINE_TO_BYTE_ADDR(addr_in, BANK_ID), addrline, addrtag, qual_read_tag); end else if (tags_match) begin