You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The various flow arbiter implementations have the following logic ostensibly to make an individual bit in push_ready not depend on its own push_valid.
for (genvar i = 0; i < NumFlows; i++) begin : gen_push_ready
always_comb begin
push_ready[i] = pop_ready;
for (int j = 0; j < NumFlows; j++) begin
if (i != j) begin
push_ready[i] &= !grant[j];
end
end
end
end
However, this doesn’t actually accomplish it’s stated goal, since the grant[j] might depend on push_valid[i] even if i != j. Besides this, it creates a lot of additional logic that causes timing issues. The proper way to fix this is to create internal versions of the base arbiter modules that expose a “can_grant” signal for which can_grant[i] is true if no higher priority request is asserted. The request, grant, and can_grant signals should meet the invariant grant == (request & can_grant).
The text was updated successfully, but these errors were encountered:
The various flow arbiter implementations have the following logic ostensibly to make an individual bit in push_ready not depend on its own push_valid.
However, this doesn’t actually accomplish it’s stated goal, since the grant[j] might depend on push_valid[i] even if i != j. Besides this, it creates a lot of additional logic that causes timing issues. The proper way to fix this is to create internal versions of the base arbiter modules that expose a “can_grant” signal for which can_grant[i] is true if no higher priority request is asserted. The request, grant, and can_grant signals should meet the invariant grant == (request & can_grant).
The text was updated successfully, but these errors were encountered: