summaryrefslogtreecommitdiff
path: root/hdl/mem_broadcast.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--hdl/mem_broadcast.sv61
1 files changed, 61 insertions, 0 deletions
diff --git a/hdl/mem_broadcast.sv b/hdl/mem_broadcast.sv
new file mode 100644
index 0000000..720699b
--- /dev/null
+++ b/hdl/mem_broadcast.sv
@@ -0,0 +1,61 @@
1`include "defs.svh"
2
3module mem_broadcast
4 ( input bit clock
5 , input bit reset
6
7 , output bit ram_ready
8 , input bit ram_valid
9 , input ram_read_response_t ram_data
10
11 , input bit print_ready
12 , output bit print_valid
13 , output ram_read_response_t print_data
14
15 , input bit [`NUM_PDPS-1:0] pdp_ready
16 , output bit [`NUM_PDPS-1:0] pdp_valid
17 , output pdp_read_response_t [`NUM_PDPS-1:0] pdp_data
18 );
19
20 bit hold_valid;
21 ram_read_response_t hold_data;
22
23 always @(posedge clock) begin
24 if (reset) begin
25 ram_ready = 0;
26 print_valid = 0;
27 for (int i = 0; i < `NUM_PDPS; ++i)
28 pdp_valid[i] = 0;
29 hold_valid = 0;
30 end else begin
31 if (print_ready) print_valid = 0;
32 for (int i = 0; i < `NUM_PDPS; ++i)
33 if (pdp_ready[i]) pdp_valid[i] = 0;
34
35 if (ram_ready && ram_valid) begin
36 hold_valid = 1;
37 hold_data = ram_data;
38 end
39
40 if (hold_valid) begin
41 if (hold_data.tag == 0) begin
42 if (!print_valid) begin
43 print_valid = 1;
44 print_data = hold_data;
45 hold_valid = 0;
46 end
47 end else begin
48 if (!pdp_valid[ram_data.tag-1]) begin
49 pdp_valid[ram_data.tag-1] = 1;
50 pdp_data[ram_data.tag-1].address = hold_data.address[`PDP_ADDRESS_BITS-1:$clog2(`RAM_LINE_WORDS)];
51 pdp_data[ram_data.tag-1].data = hold_data.data;
52 hold_valid = 0;
53 end
54 end
55 end
56
57 ram_ready = !hold_valid;
58 end
59 end
60
61endmodule