diff options
| author | Julian Blake Kongslie | 2022-03-27 17:00:36 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-03-27 17:00:36 -0700 |
| commit | eada089ee9952b7e58a74c120841f7ad537f6329 (patch) | |
| tree | aa15ab851d77629a4ce21dc1ad2de2025db43dda /hdl | |
| parent | Add RX/TX/RTS/CTS pin assignments for future RS232 work. (diff) | |
| download | multipdp8-eada089ee9952b7e58a74c120841f7ad537f6329.tar.xz | |
A more-fair memory arbiter that actually works.
Diffstat (limited to 'hdl')
| -rw-r--r-- | hdl/mem_arbiter.sv | 65 |
1 files changed, 34 insertions, 31 deletions
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 | |||
| 32 | hold_valid[i] = 0; | 32 | hold_valid[i] = 0; |
| 33 | selector = 0; | 33 | selector = 0; |
| 34 | end else begin | 34 | end else begin |
| 35 | automatic bit ram_was_valid = ram_valid; | ||
| 36 | |||
| 37 | if (ram_ready) ram_valid = 0; | 35 | if (ram_ready) ram_valid = 0; |
| 38 | 36 | ||
| 39 | if (command_ready && command_valid) begin | 37 | if (hold_valid == 0) begin |
| 40 | hold_valid[0] = 1; | 38 | if (command_ready && command_valid) begin |
| 41 | hold_data[0] = command_data; | 39 | hold_valid[0] = 1; |
| 42 | hold_data[0].tag = 0; | 40 | hold_data[0] = command_data; |
| 43 | end | 41 | hold_data[0].tag = 0; |
| 44 | for (int i = 0; i < `NUM_PDPS; ++i) begin | 42 | end |
| 45 | if (pdp_ready[i] && pdp_valid[i]) begin | 43 | for (int i = 0; i < `NUM_PDPS; ++i) begin |
| 46 | hold_valid[i+1] = 1; | 44 | if (pdp_ready[i] && pdp_valid[i]) begin |
| 47 | hold_data[i+1].address[`RAM_ADDRESS_BITS-1:`PDP_ADDRESS_BITS] = i; | 45 | hold_valid[i+1] = 1; |
| 48 | hold_data[i+1].address[`PDP_ADDRESS_BITS-1:$clog2(`RAM_LINE_WORDS)] = pdp_data[i].address; | 46 | hold_data[i+1].address[`RAM_ADDRESS_BITS-1:`PDP_ADDRESS_BITS] = i; |
| 49 | hold_data[i+1].write = pdp_data[i].write; | 47 | hold_data[i+1].address[`PDP_ADDRESS_BITS-1:$clog2(`RAM_LINE_WORDS)] = pdp_data[i].address; |
| 50 | hold_data[i+1].data = pdp_data[i].data; | 48 | hold_data[i+1].write = pdp_data[i].write; |
| 51 | hold_data[i+1].mask = pdp_data[i].mask; | 49 | hold_data[i+1].data = pdp_data[i].data; |
| 52 | hold_data[i+1].tag = i+1; | 50 | hold_data[i+1].mask = pdp_data[i].mask; |
| 51 | hold_data[i+1].tag = i+1; | ||
| 52 | end | ||
| 53 | end | 53 | end |
| 54 | end | 54 | end |
| 55 | 55 | ||
| 56 | for (int i = 0; i < `NUM_PDPS+1; ++i) begin | 56 | if (hold_valid != 0) begin |
| 57 | automatic int j = selector + i; | 57 | automatic bit ram_was_valid = ram_valid; |
| 58 | if (j > `NUM_PDPS) j = j - (`NUM_PDPS+1); | 58 | for (int i = 0; i < `NUM_PDPS+1; ++i) begin |
| 59 | if (!ram_valid && hold_valid[j]) begin | 59 | automatic int j = selector + i; |
| 60 | ram_valid = 1; | 60 | if (j > `NUM_PDPS) j = j - (`NUM_PDPS+1); |
| 61 | ram_data = hold_data[j]; | 61 | if (!ram_valid && hold_valid[j]) begin |
| 62 | hold_valid[j] = 0; | 62 | ram_valid = 1; |
| 63 | ram_data = hold_data[j]; | ||
| 64 | hold_valid[j] = 0; | ||
| 65 | end | ||
| 66 | end | ||
| 67 | if (ram_valid && !ram_was_valid) begin | ||
| 68 | if (selector == `NUM_PDPS) | ||
| 69 | selector = 0; | ||
| 70 | else | ||
| 71 | ++selector; | ||
| 63 | end | 72 | end |
| 64 | end | 73 | end |
| 65 | 74 | ||
| 66 | if (ram_valid && !ram_was_valid) begin | ||
| 67 | if (selector == `NUM_PDPS) | ||
| 68 | selector = 0; | ||
| 69 | else | ||
| 70 | ++selector; | ||
| 71 | end | ||
| 72 | 75 | ||
| 73 | command_ready = !hold_valid[0]; | 76 | command_ready = hold_valid == 0; |
| 74 | for (int i = 0; i < `NUM_PDPS; ++i) | 77 | for (int i = 0; i < `NUM_PDPS; ++i) |
| 75 | pdp_ready[i] = !hold_valid[i+1]; | 78 | pdp_ready[i] = hold_valid == 0; |
| 76 | end | 79 | end |
| 77 | end | 80 | end |
| 78 | 81 | ||
