diff --git a/hw/rtl/core/VX_scoreboard.sv b/hw/rtl/core/VX_scoreboard.sv index 7888788f..f4b5f55b 100644 --- a/hw/rtl/core/VX_scoreboard.sv +++ b/hw/rtl/core/VX_scoreboard.sv @@ -262,6 +262,13 @@ module VX_scoreboard import VX_gpu_pkg::*; #( $time, CORE_ID, wis_to_wid(ibuffer_if[i].data.wis, i)) ) + wire tensor_issue_fire; + wire tensor_writeback_fire; + // 'tensor' bit is only contained in the ghost commit/writebacks + // generated by the tensor unit + assign tensor_issue_fire = ibuffer_if[i].valid && ibuffer_if[i].ready && hgmma_start; + assign tensor_writeback_fire = writeback_fire && writeback_if[i].data.tensor; + always @(posedge clk) begin if (reset) begin inuse_regs <= '0; @@ -274,11 +281,13 @@ module VX_scoreboard import VX_gpu_pkg::*; #( inuse_regs[ibuffer_if[i].data.wis][ibuffer_if[i].data.rd] <= 1; end `ifdef EXT_T_HOPPER - if (writeback_fire && writeback_if[i].data.tensor) begin - inflight_tensor[writeback_if[i].data.wis] <= - inflight_tensor[writeback_if[i].data.wis] - INFLT_WIDTH'(1); - end - if (ibuffer_if[i].valid && ibuffer_if[i].ready && hgmma_start) begin + if (tensor_writeback_fire) begin + // ensure no race condition + if (!tensor_issue_fire) begin + inflight_tensor[writeback_if[i].data.wis] <= + inflight_tensor[writeback_if[i].data.wis] - INFLT_WIDTH'(1); + end + end else if (tensor_issue_fire) begin inflight_tensor[ibuffer_if[i].data.wis] <= inflight_tensor[ibuffer_if[i].data.wis] + INFLT_WIDTH'(1); end