From eada089ee9952b7e58a74c120841f7ad537f6329 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sun, 27 Mar 2022 17:00:36 -0700 Subject: A more-fair memory arbiter that actually works. --- hdl/mem_arbiter.sv | 65 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 31 deletions(-) (limited to 'hdl/mem_arbiter.sv') diff --git a/hdl/mem_arbiter.sv b/hdl/mem_arbiter.sv index c34faa8..a48f96d 100644 --- a/hdl/mem_arbiter.sv +++ b/hdl/mem_arbiter.sv @@ -32,47 +32,50 @@ module mem_arbiter hold_valid[i] = 0; selector = 0; end else begin - automatic bit ram_was_valid = ram_valid; - if (ram_ready) ram_valid = 0; - if (command_ready && command_valid) begin - hold_valid[0] = 1; - hold_data[0] = command_data; - hold_data[0].tag = 0; - end - for (int i = 0; i < `NUM_PDPS; ++i) begin - if (pdp_ready[i] && pdp_valid[i]) begin - hold_valid[i+1] = 1; - hold_data[i+1].address[`RAM_ADDRESS_BITS-1:`PDP_ADDRESS_BITS] = i; - hold_data[i+1].address[`PDP_ADDRESS_BITS-1:$clog2(`RAM_LINE_WORDS)] = pdp_data[i].address; - hold_data[i+1].write = pdp_data[i].write; - hold_data[i+1].data = pdp_data[i].data; - hold_data[i+1].mask = pdp_data[i].mask; - hold_data[i+1].tag = i+1; + if (hold_valid == 0) begin + if (command_ready && command_valid) begin + hold_valid[0] = 1; + hold_data[0] = command_data; + hold_data[0].tag = 0; + end + for (int i = 0; i < `NUM_PDPS; ++i) begin + if (pdp_ready[i] && pdp_valid[i]) begin + hold_valid[i+1] = 1; + hold_data[i+1].address[`RAM_ADDRESS_BITS-1:`PDP_ADDRESS_BITS] = i; + hold_data[i+1].address[`PDP_ADDRESS_BITS-1:$clog2(`RAM_LINE_WORDS)] = pdp_data[i].address; + hold_data[i+1].write = pdp_data[i].write; + hold_data[i+1].data = pdp_data[i].data; + hold_data[i+1].mask = pdp_data[i].mask; + hold_data[i+1].tag = i+1; + end end end - for (int i = 0; i < `NUM_PDPS+1; ++i) begin - automatic int j = selector + i; - if (j > `NUM_PDPS) j = j - (`NUM_PDPS+1); - if (!ram_valid && hold_valid[j]) begin - ram_valid = 1; - ram_data = hold_data[j]; - hold_valid[j] = 0; + if (hold_valid != 0) begin + automatic bit ram_was_valid = ram_valid; + for (int i = 0; i < `NUM_PDPS+1; ++i) begin + automatic int j = selector + i; + if (j > `NUM_PDPS) j = j - (`NUM_PDPS+1); + if (!ram_valid && hold_valid[j]) begin + ram_valid = 1; + ram_data = hold_data[j]; + hold_valid[j] = 0; + end + end + if (ram_valid && !ram_was_valid) begin + if (selector == `NUM_PDPS) + selector = 0; + else + ++selector; end end - if (ram_valid && !ram_was_valid) begin - if (selector == `NUM_PDPS) - selector = 0; - else - ++selector; - end - command_ready = !hold_valid[0]; + command_ready = hold_valid == 0; for (int i = 0; i < `NUM_PDPS; ++i) - pdp_ready[i] = !hold_valid[i+1]; + pdp_ready[i] = hold_valid == 0; end end -- cgit v1.2.3