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 | |
| 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 '')
| -rw-r--r-- | hdl/command_parser.sv | 67 | ||||
| -rw-r--r-- | hdl/result_printer.sv | 37 | ||||
| -rw-r--r-- | hdl/top.sv | 12 |
3 files changed, 85 insertions, 31 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 |
diff --git a/hdl/result_printer.sv b/hdl/result_printer.sv index 6e1bd53..322fac0 100644 --- a/hdl/result_printer.sv +++ b/hdl/result_printer.sv | |||
| @@ -11,15 +11,21 @@ module result_printer | |||
| 11 | , input bit echo_ready | 11 | , input bit echo_ready |
| 12 | , output bit echo_valid | 12 | , output bit echo_valid |
| 13 | , output uart_byte_t echo_data | 13 | , output uart_byte_t echo_data |
| 14 | |||
| 15 | , output bit loop_ready | ||
| 16 | , input bit loop_valid | ||
| 17 | , input bit loop_data | ||
| 14 | ); | 18 | ); |
| 15 | 19 | ||
| 16 | bit hold_valid; | 20 | bit hold_valid; |
| 17 | ram_read_response_t hold; | 21 | ram_read_response_t hold; |
| 22 | bit loop; | ||
| 18 | ram_byte_count_t byte_count; | 23 | ram_byte_count_t byte_count; |
| 19 | ram_word_count_t word_count; | 24 | ram_word_count_t word_count; |
| 20 | 25 | ||
| 21 | (* syn_encoding = "one-hot" *) enum int unsigned | 26 | (* syn_encoding = "one-hot" *) enum int unsigned |
| 22 | { HIGH_NIBBLE | 27 | { EQUALS_SIGN |
| 28 | , HIGH_NIBBLE | ||
| 23 | , LOW_NIBBLE | 29 | , LOW_NIBBLE |
| 24 | , WORD_SEPARATOR | 30 | , WORD_SEPARATOR |
| 25 | } state; | 31 | } state; |
| @@ -29,12 +35,16 @@ module result_printer | |||
| 29 | result_ready = 0; | 35 | result_ready = 0; |
| 30 | echo_valid = 0; | 36 | echo_valid = 0; |
| 31 | echo_data = 0; | 37 | echo_data = 0; |
| 38 | loop_ready = 0; | ||
| 32 | hold_valid = 0; | 39 | hold_valid = 0; |
| 40 | loop = 0; | ||
| 33 | byte_count = 0; | 41 | byte_count = 0; |
| 34 | word_count = 0; | 42 | word_count = 0; |
| 35 | state = state.first; | 43 | state = state.first; |
| 36 | end else begin | 44 | end else begin |
| 37 | if (echo_ready) echo_valid = 0; | 45 | if (echo_ready) echo_valid = 0; |
| 46 | if (loop_ready && loop_valid) | ||
| 47 | loop = loop_data; | ||
| 38 | if (result_ready && result_valid) begin | 48 | if (result_ready && result_valid) begin |
| 39 | hold_valid = 1; | 49 | hold_valid = 1; |
| 40 | hold = result_data; | 50 | hold = result_data; |
| @@ -48,35 +58,44 @@ module result_printer | |||
| 48 | automatic ram_word_t w = hold.data[word_count-1]; | 58 | automatic ram_word_t w = hold.data[word_count-1]; |
| 49 | automatic ram_byte_t b = w[byte_count-1]; | 59 | automatic ram_byte_t b = w[byte_count-1]; |
| 50 | echo_valid = 1; | 60 | echo_valid = 1; |
| 61 | if (state == EQUALS_SIGN && !loop) | ||
| 62 | state = state.next; | ||
| 51 | case (state) | 63 | case (state) |
| 64 | EQUALS_SIGN: echo_data = "="; | ||
| 52 | HIGH_NIBBLE: echo_data = b[7:4]; | 65 | HIGH_NIBBLE: echo_data = b[7:4]; |
| 53 | LOW_NIBBLE: echo_data = b[3:0]; | 66 | LOW_NIBBLE: echo_data = b[3:0]; |
| 54 | WORD_SEPARATOR: echo_data = ":"; | 67 | WORD_SEPARATOR: echo_data = ":"; |
| 55 | endcase | 68 | endcase |
| 56 | if (state != WORD_SEPARATOR) begin | 69 | if (state == HIGH_NIBBLE || state == LOW_NIBBLE) begin |
| 57 | if (echo_data < 10) | 70 | if (echo_data < 10) |
| 58 | echo_data = echo_data + "0"; | 71 | echo_data = echo_data + "0"; |
| 59 | else | 72 | else |
| 60 | echo_data = echo_data + "A" - 10; | 73 | echo_data = echo_data + "A" - 10; |
| 61 | end | 74 | end |
| 62 | state = state.next; | 75 | if (state == LOW_NIBBLE) begin |
| 63 | if (state == WORD_SEPARATOR && (byte_count != 1 || word_count == 1)) | 76 | if (byte_count == 1) begin |
| 64 | state = state.next; | ||
| 65 | if (state == state.first) begin | ||
| 66 | byte_count = byte_count - 1; | ||
| 67 | if (byte_count == 0) begin | ||
| 68 | byte_count = `RAM_WORD_BYTES; | 77 | byte_count = `RAM_WORD_BYTES; |
| 69 | word_count = word_count - 1; | 78 | word_count = word_count - 1; |
| 79 | state = state.next; | ||
| 80 | end else begin | ||
| 81 | byte_count = byte_count - 1; | ||
| 82 | state = HIGH_NIBBLE; | ||
| 70 | end | 83 | end |
| 84 | end else begin | ||
| 85 | state = state.next; | ||
| 71 | end | 86 | end |
| 72 | end else begin | 87 | end else begin |
| 73 | echo_valid = 1; | 88 | echo_valid = 1; |
| 74 | echo_data = "\n"; | 89 | if (loop && hold.address[3:0] != 'hf) |
| 90 | echo_data = " "; | ||
| 91 | else | ||
| 92 | echo_data = "\n"; | ||
| 75 | hold_valid = 0; | 93 | hold_valid = 0; |
| 76 | end | 94 | end |
| 77 | end | 95 | end |
| 78 | 96 | ||
| 79 | result_ready = !hold_valid; | 97 | result_ready = !hold_valid; |
| 98 | loop_ready = 1; | ||
| 80 | end | 99 | end |
| 81 | end | 100 | end |
| 82 | 101 | ||
| @@ -169,6 +169,10 @@ module top | |||
| 169 | bit print_valid; | 169 | bit print_valid; |
| 170 | ram_read_response_t print_data; | 170 | ram_read_response_t print_data; |
| 171 | 171 | ||
| 172 | bit loop_ready; | ||
| 173 | bit loop_valid; | ||
| 174 | bit loop_data; | ||
| 175 | |||
| 172 | bit [`NUM_PDPS-1:0] pdp_command_ready; | 176 | bit [`NUM_PDPS-1:0] pdp_command_ready; |
| 173 | bit [`NUM_PDPS-1:0] pdp_command_valid; | 177 | bit [`NUM_PDPS-1:0] pdp_command_valid; |
| 174 | pdp_command_t [`NUM_PDPS-1:0] pdp_command_data; | 178 | pdp_command_t [`NUM_PDPS-1:0] pdp_command_data; |
| @@ -245,6 +249,10 @@ module top | |||
| 245 | , .command_ready(command_ready) | 249 | , .command_ready(command_ready) |
| 246 | , .command_valid(command_valid) | 250 | , .command_valid(command_valid) |
| 247 | , .command_data(command_data) | 251 | , .command_data(command_data) |
| 252 | |||
| 253 | , .loop_ready(loop_ready) | ||
| 254 | , .loop_valid(loop_valid) | ||
| 255 | , .loop_data(loop_data) | ||
| 248 | ); | 256 | ); |
| 249 | 257 | ||
| 250 | mem_arbiter memarb | 258 | mem_arbiter memarb |
| @@ -316,6 +324,10 @@ module top | |||
| 316 | , .echo_ready(ram_echo_in1_ready) | 324 | , .echo_ready(ram_echo_in1_ready) |
| 317 | , .echo_valid(ram_echo_in1_valid) | 325 | , .echo_valid(ram_echo_in1_valid) |
| 318 | , .echo_data(ram_echo_in1_data) | 326 | , .echo_data(ram_echo_in1_data) |
| 327 | |||
| 328 | , .loop_ready(loop_ready) | ||
| 329 | , .loop_valid(loop_valid) | ||
| 330 | , .loop_data(loop_data) | ||
| 319 | ); | 331 | ); |
| 320 | 332 | ||
| 321 | bit slow_clock; | 333 | bit slow_clock; |
