summaryrefslogtreecommitdiff
path: root/hdl
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-03-27 17:00:36 -0700
committerJulian Blake Kongslie2022-03-27 17:00:36 -0700
commiteada089ee9952b7e58a74c120841f7ad537f6329 (patch)
treeaa15ab851d77629a4ce21dc1ad2de2025db43dda /hdl
parentAdd RX/TX/RTS/CTS pin assignments for future RS232 work. (diff)
downloadmultipdp8-eada089ee9952b7e58a74c120841f7ad537f6329.tar.xz
A more-fair memory arbiter that actually works.
Diffstat (limited to 'hdl')
-rw-r--r--hdl/mem_arbiter.sv65
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