diff options
| author | Julian Blake Kongslie | 2022-05-29 16:38:00 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-05-29 16:38:00 -0700 |
| commit | 3e5a998a2cb380d90615b524b5e41c671ab8004d (patch) | |
| tree | e3b69f43b9e64e4f27d4f06b4fb73f952d991d26 /hdl/command_parser.sv | |
| parent | Tweak con script to do CRLF translation on received stream. (diff) | |
| download | multipdp8-3e5a998a2cb380d90615b524b5e41c671ab8004d.tar.xz | |
Add support for bulk memory dumping to command parser.
Diffstat (limited to 'hdl/command_parser.sv')
| -rw-r--r-- | hdl/command_parser.sv | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/hdl/command_parser.sv b/hdl/command_parser.sv index 964ac12..1520db4 100644 --- a/hdl/command_parser.sv +++ b/hdl/command_parser.sv | |||
| @@ -16,19 +16,23 @@ module command_parser | |||
| 16 | , input bit command_ready | 16 | , input bit command_ready |
| 17 | , output bit command_valid | 17 | , output bit command_valid |
| 18 | , output ram_command_t command_data | 18 | , output ram_command_t command_data |
| 19 | |||
| 20 | , input bit loop_ready | ||
| 21 | , output bit loop_valid | ||
| 22 | , output bit loop_data | ||
| 19 | ); | 23 | ); |
| 20 | 24 | ||
| 21 | bit input_byte_valid; | 25 | bit input_byte_valid; |
| 22 | uart_byte_t input_byte; | 26 | uart_byte_t input_byte; |
| 23 | 27 | ||
| 24 | bit [`RAM_ADDRESS_BITS:0] zero_count; | 28 | bit [`RAM_ADDRESS_BITS:0] loop_count; |
| 25 | 29 | ||
| 26 | (* syn_encoding = "one-hot" *) enum int unsigned | 30 | (* syn_encoding = "one-hot" *) enum int unsigned |
| 27 | { READ_COMMAND | 31 | { READ_COMMAND |
| 28 | , READ_ADDRESS | 32 | , READ_ADDRESS |
| 29 | , READ_DATA | 33 | , READ_DATA |
| 30 | , READ_ZERO_COUNT | 34 | , READ_LOOP_COUNT |
| 31 | , ZERO_MEMORY | 35 | , LOOP_MEMORY |
| 32 | } state; | 36 | } state; |
| 33 | 37 | ||
| 34 | always @(posedge clock) begin | 38 | always @(posedge clock) begin |
| @@ -38,9 +42,10 @@ module command_parser | |||
| 38 | for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) | 42 | for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) |
| 39 | command_data.mask[i] = ~0; | 43 | command_data.mask[i] = ~0; |
| 40 | command_data.tag = TAG; | 44 | command_data.tag = TAG; |
| 45 | loop_valid = 0; | ||
| 41 | input_byte_valid = 0; | 46 | input_byte_valid = 0; |
| 42 | input_byte = 0; | 47 | input_byte = 0; |
| 43 | zero_count = 0; | 48 | loop_count = 0; |
| 44 | state = state.first; | 49 | state = state.first; |
| 45 | end else begin | 50 | end else begin |
| 46 | if (echo_ready) echo_valid = 0; | 51 | if (echo_ready) echo_valid = 0; |
| @@ -54,8 +59,11 @@ module command_parser | |||
| 54 | input_byte_valid = 1; | 59 | input_byte_valid = 1; |
| 55 | input_byte = uart_data; | 60 | input_byte = uart_data; |
| 56 | end | 61 | end |
| 62 | if (loop_ready && loop_valid) begin | ||
| 63 | loop_valid = 0; | ||
| 64 | end | ||
| 57 | 65 | ||
| 58 | if (!command_valid) begin | 66 | if (!command_valid && !loop_valid) begin |
| 59 | case (state) | 67 | case (state) |
| 60 | 68 | ||
| 61 | READ_COMMAND: if (input_byte_valid) begin | 69 | READ_COMMAND: if (input_byte_valid) begin |
| @@ -63,18 +71,24 @@ module command_parser | |||
| 63 | 71 | ||
| 64 | "@": begin | 72 | "@": begin |
| 65 | command_data.address = 0; | 73 | command_data.address = 0; |
| 74 | loop_valid = 1; | ||
| 75 | loop_data = 0; | ||
| 66 | state = READ_ADDRESS; | 76 | state = READ_ADDRESS; |
| 67 | end | 77 | end |
| 68 | 78 | ||
| 69 | "?": begin | 79 | "?": begin |
| 70 | command_valid = 1; | 80 | command_valid = 1; |
| 71 | command_data.write = 0; | 81 | command_data.write = 0; |
| 82 | loop_valid = 1; | ||
| 83 | loop_data = 0; | ||
| 72 | end | 84 | end |
| 73 | 85 | ||
| 74 | "=": begin | 86 | "=": begin |
| 75 | command_data.write = 1; | 87 | command_data.write = 1; |
| 76 | for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) | 88 | for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) |
| 77 | command_data.data[i] = 0; | 89 | command_data.data[i] = 0; |
| 90 | loop_valid = 1; | ||
| 91 | loop_data = 0; | ||
| 78 | state = READ_DATA; | 92 | state = READ_DATA; |
| 79 | end | 93 | end |
| 80 | 94 | ||
| @@ -82,8 +96,14 @@ module command_parser | |||
| 82 | command_data.write = 1; | 96 | command_data.write = 1; |
| 83 | for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) | 97 | for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) |
| 84 | command_data.data[i] = 0; | 98 | command_data.data[i] = 0; |
| 85 | zero_count = 0; | 99 | loop_count = 0; |
| 86 | state = READ_ZERO_COUNT; | 100 | state = READ_LOOP_COUNT; |
| 101 | end | ||
| 102 | |||
| 103 | "#": begin | ||
| 104 | command_data.write = 0; | ||
| 105 | loop_count = 0; | ||
| 106 | state = READ_LOOP_COUNT; | ||
| 87 | end | 107 | end |
| 88 | 108 | ||
| 89 | endcase | 109 | endcase |
| @@ -129,27 +149,29 @@ module command_parser | |||
| 129 | input_byte_valid = 0; | 149 | input_byte_valid = 0; |
| 130 | end | 150 | end |
| 131 | 151 | ||
| 132 | READ_ZERO_COUNT: if (input_byte_valid) begin | 152 | READ_LOOP_COUNT: if (input_byte_valid) begin |
| 133 | if (input_byte == ":") begin | 153 | if (input_byte == ":") begin |
| 134 | // ignore | 154 | // ignore |
| 135 | end else if (input_byte >= "0" && input_byte <= "9") begin | 155 | end else if (input_byte >= "0" && input_byte <= "9") begin |
| 136 | zero_count = zero_count << 4; | 156 | loop_count = loop_count << 4; |
| 137 | zero_count[3:0] = input_byte - "0"; | 157 | loop_count[3:0] = input_byte - "0"; |
| 138 | end else if (input_byte >= "a" && input_byte <= "f") begin | 158 | end else if (input_byte >= "a" && input_byte <= "f") begin |
| 139 | zero_count = zero_count << 4; | 159 | loop_count = loop_count << 4; |
| 140 | zero_count[3:0] = input_byte - "a" + 10; | 160 | loop_count[3:0] = input_byte - "a" + 10; |
| 141 | end else if (input_byte >= "A" && input_byte <= "F") begin | 161 | end else if (input_byte >= "A" && input_byte <= "F") begin |
| 142 | zero_count = zero_count << 4; | 162 | loop_count = loop_count << 4; |
| 143 | zero_count[3:0] = input_byte - "A" + 10; | 163 | loop_count[3:0] = input_byte - "A" + 10; |
| 144 | end else begin | 164 | end else begin |
| 145 | state = ZERO_MEMORY; | 165 | loop_valid = 1; |
| 166 | loop_data = 1; | ||
| 167 | state = LOOP_MEMORY; | ||
| 146 | end | 168 | end |
| 147 | input_byte_valid = 0; | 169 | input_byte_valid = 0; |
| 148 | end | 170 | end |
| 149 | 171 | ||
| 150 | `ifdef SLOW_ZEROING | 172 | `ifdef SLOW_LOOPING |
| 151 | ZERO_MEMORY: if (!echo_valid) begin | 173 | LOOP_MEMORY: if (!echo_valid) begin |
| 152 | if (zero_count == 0) begin | 174 | if (loop_count == 0) begin |
| 153 | echo_valid = 1; | 175 | echo_valid = 1; |
| 154 | echo_data = "\n"; | 176 | echo_data = "\n"; |
| 155 | state = state.first; | 177 | state = state.first; |
| @@ -157,17 +179,18 @@ module command_parser | |||
| 157 | echo_valid = 1; | 179 | echo_valid = 1; |
| 158 | echo_data = "."; | 180 | echo_data = "."; |
| 159 | command_valid = 1; | 181 | command_valid = 1; |
| 160 | --zero_count; | 182 | --loop_count; |
| 161 | end | 183 | end |
| 162 | end | 184 | end |
| 163 | `else | 185 | `else |
| 164 | ZERO_MEMORY: begin | 186 | LOOP_MEMORY: begin |
| 165 | if (zero_count == 0) begin | 187 | if (loop_count == 0) begin |
| 166 | state = state.first; | 188 | state = state.first; |
| 167 | end else begin | 189 | end else begin |
| 168 | command_valid = 1; | 190 | command_valid = 1; |
| 169 | if (--zero_count == 0) | 191 | if (--loop_count == 0) begin |
| 170 | state = state.first; | 192 | state = state.first; |
| 193 | end | ||
| 171 | end | 194 | end |
| 172 | end | 195 | end |
| 173 | `endif | 196 | `endif |
