diff options
Diffstat (limited to 'hdl/core.sv')
| -rw-r--r-- | hdl/core.sv | 80 |
1 files changed, 44 insertions, 36 deletions
diff --git a/hdl/core.sv b/hdl/core.sv index 7edf523..12b5459 100644 --- a/hdl/core.sv +++ b/hdl/core.sv | |||
| @@ -20,7 +20,7 @@ bit [DATA_BITS-1:0] mem_read_data; | |||
| 20 | mem | 20 | mem |
| 21 | #( .ADDR_BITS(ADDR_BITS) | 21 | #( .ADDR_BITS(ADDR_BITS) |
| 22 | , .DATA_BITS(DATA_BITS) | 22 | , .DATA_BITS(DATA_BITS) |
| 23 | , .INIT_FILE("build/mem/hello.hex") | 23 | , .INIT_FILE("mem/focal69.loaded.hex") |
| 24 | ) | 24 | ) |
| 25 | memory | 25 | memory |
| 26 | ( .clk(clk) | 26 | ( .clk(clk) |
| @@ -95,7 +95,7 @@ always_ff @(posedge clk) begin | |||
| 95 | tx_data = 0; | 95 | tx_data = 0; |
| 96 | pc = 'o200; | 96 | pc = 'o200; |
| 97 | acc = 0; | 97 | acc = 0; |
| 98 | link = 0; | 98 | link = 1; |
| 99 | kbd_valid = 0; | 99 | kbd_valid = 0; |
| 100 | state = state.first; | 100 | state = state.first; |
| 101 | end else begin | 101 | end else begin |
| @@ -123,23 +123,26 @@ always_ff @(posedge clk) begin | |||
| 123 | if (`lag(mem_read_valid)) begin | 123 | if (`lag(mem_read_valid)) begin |
| 124 | state = FETCH; | 124 | state = FETCH; |
| 125 | {opcode, operand} = `lag(mem_read_data); | 125 | {opcode, operand} = `lag(mem_read_data); |
| 126 | //$display("%d decode %x: %b %b", $time, pc-1, opcode, operand); | 126 | // $display("%o: decode %o %o", pc-1, opcode, operand); |
| 127 | // // verilator lint_off WIDTH | ||
| 128 | // $display("%o %b %o 0000", 14'(pc-1), link, acc); | ||
| 129 | // // verilator lint_on WIDTH | ||
| 127 | {i, z, wip} = operand; | 130 | {i, z, wip} = operand; |
| 128 | if (z) | 131 | if (z) |
| 129 | address = {page, wip}; | 132 | address = {page, wip}; |
| 130 | else | 133 | else |
| 131 | address = {5'b0, wip}; | 134 | address = {5'b0, wip}; |
| 132 | case (opcode) | 135 | case (opcode) |
| 133 | 'b000, 'b001, 'b010: state = i ? INDIRECT : AGEN; | 136 | 'o0, 'o1, 'o2: state = i ? INDIRECT : AGEN; |
| 134 | 'b011, 'b100: state = i ? INDIRECT : EXEC; | 137 | 'o3, 'o4: state = i ? INDIRECT : EXEC; |
| 135 | 'b101: begin | 138 | 'o5: begin |
| 136 | if (i) begin | 139 | if (i) begin |
| 137 | state = INDIRECT; | 140 | state = INDIRECT; |
| 138 | end else begin | 141 | end else begin |
| 139 | pc = address; | 142 | pc = address; |
| 140 | end | 143 | end |
| 141 | end | 144 | end |
| 142 | 'b111: begin | 145 | 'o7: begin |
| 143 | casez (operand) | 146 | casez (operand) |
| 144 | 'b0????????: begin | 147 | 'b0????????: begin |
| 145 | automatic bit cla, cll, cma, cml, rar, ral, bsw, iac; | 148 | automatic bit cla, cll, cma, cml, rar, ral, bsw, iac; |
| @@ -170,7 +173,7 @@ always_ff @(posedge clk) begin | |||
| 170 | if (skip) pc++; | 173 | if (skip) pc++; |
| 171 | if (cla) acc = 0; | 174 | if (cla) acc = 0; |
| 172 | if (osr) begin | 175 | if (osr) begin |
| 173 | $display("unsupported front panel switch test"); | 176 | $display("%o: unsupported front panel switch test", pc); |
| 174 | $finish; | 177 | $finish; |
| 175 | end | 178 | end |
| 176 | if (hlt) state = HALT; | 179 | if (hlt) state = HALT; |
| @@ -186,53 +189,58 @@ always_ff @(posedge clk) begin | |||
| 186 | if (skip && (spa || sna || szl)) pc++; | 189 | if (skip && (spa || sna || szl)) pc++; |
| 187 | if (cla) acc = 0; | 190 | if (cla) acc = 0; |
| 188 | if (osr) begin | 191 | if (osr) begin |
| 189 | $display("unsupported front panel switch test"); | 192 | $display("%o: unsupported front panel switch test", pc); |
| 190 | $finish; | 193 | $finish; |
| 191 | end | 194 | end |
| 192 | if (hlt) state = HALT; | 195 | if (hlt) state = HALT; |
| 193 | end | 196 | end |
| 194 | default: begin | 197 | default: begin |
| 195 | $display("%d decoded unknown opcode %x: %b %b", $time, pc-1, opcode, operand); | 198 | $display("%o: decoded unknown opcode %o %o", pc-1, opcode, operand); |
| 196 | $finish; | 199 | $finish; |
| 197 | end | 200 | end |
| 198 | endcase | 201 | endcase |
| 199 | end | 202 | end |
| 200 | 'b110: begin | 203 | 'o6: begin |
| 201 | case (operand[8:3]) | 204 | case (operand[8:3]) |
| 202 | 'b000011: begin | 205 | 'o00: begin |
| 203 | case (operand[2:0]) | 206 | case (operand[2:0]) |
| 204 | 'b001: if (kbd_valid) pc++; | 207 | 'o0, 'o1: ; |
| 205 | 'b110: begin | 208 | default: $display("%o: unsupported 600%o op", pc-1, operand[2:0]); |
| 209 | endcase | ||
| 210 | end | ||
| 211 | 'o03: begin | ||
| 212 | case (operand[2:0]) | ||
| 213 | 'o1: if (kbd_valid) pc++; | ||
| 214 | 'o6: begin | ||
| 206 | acc = kbd_data; | 215 | acc = kbd_data; |
| 207 | kbd_valid = 0; | 216 | kbd_valid = 0; |
| 208 | end | 217 | end |
| 209 | default: begin | 218 | default: begin |
| 210 | $display("unsupported keyboard op %b", operand[2:0]); | 219 | $display("%o: unsupported keyboard op %o", pc-1, operand[2:0]); |
| 211 | $finish; | 220 | $finish; |
| 212 | end | 221 | end |
| 213 | endcase | 222 | endcase |
| 214 | end | 223 | end |
| 215 | 'b000100: begin | 224 | 'o04: begin |
| 216 | case (operand[2:0]) | 225 | case (operand[2:0]) |
| 217 | 'b001: if (!tx_valid) pc++; | 226 | 'o1: if (!tx_valid) pc++; |
| 218 | 'b110: begin | 227 | 'o6: begin |
| 219 | tx_valid = 1; | 228 | tx_valid = 1; |
| 220 | tx_data = {1'b0, acc[6:0]}; | 229 | tx_data = {1'b0, acc[6:0]}; |
| 221 | end | 230 | end |
| 222 | default: begin | 231 | default: begin |
| 223 | $display("unsupported tty op %b", operand[2:0]); | 232 | $display("%o: unsupported tty op %o", pc-1, operand[2:0]); |
| 224 | $finish; | 233 | $finish; |
| 225 | end | 234 | end |
| 226 | endcase | 235 | endcase |
| 227 | end | 236 | end |
| 228 | default: begin | 237 | default: begin |
| 229 | $display("unsupported device %b", operand[8:3]); | 238 | $display("%o: unsupported device %o (operation %o)", pc-1, operand[8:3], operand[2:0]); |
| 230 | $finish; | ||
| 231 | end | 239 | end |
| 232 | endcase | 240 | endcase |
| 233 | end | 241 | end |
| 234 | default: begin | 242 | default: begin |
| 235 | $display("%d decoded unknown opcode %x: %b %b", $time, pc-1, opcode, operand); | 243 | $display("%o: decoded unknown opcode %o %o", pc-1, opcode, operand); |
| 236 | $finish; | 244 | $finish; |
| 237 | end | 245 | end |
| 238 | endcase | 246 | endcase |
| @@ -259,9 +267,9 @@ always_ff @(posedge clk) begin | |||
| 259 | end else begin | 267 | end else begin |
| 260 | address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)}; | 268 | address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)}; |
| 261 | case (opcode) | 269 | case (opcode) |
| 262 | 'b000, 'b001, 'b010: state = AGEN; | 270 | 'o0, 'o1, 'o2: state = AGEN; |
| 263 | 'b011, 'b100: state = EXEC; | 271 | 'o3, 'o4: state = EXEC; |
| 264 | 'b101: begin | 272 | 'o5: begin |
| 265 | pc = address; | 273 | pc = address; |
| 266 | state = FETCH; | 274 | state = FETCH; |
| 267 | end | 275 | end |
| @@ -275,15 +283,15 @@ always_ff @(posedge clk) begin | |||
| 275 | mem_write = 1; | 283 | mem_write = 1; |
| 276 | mem_write_data = address[DATA_BITS-1:0]; | 284 | mem_write_data = address[DATA_BITS-1:0]; |
| 277 | case (opcode) | 285 | case (opcode) |
| 278 | 'b000, 'b001, 'b010: state = `lag(mem_ready) ? AGEN : PREINC; | 286 | 'o0, 'o1, 'o2: state = `lag(mem_ready) ? AGEN : PREINC; |
| 279 | 'b011, 'b100, 'b101: state = `lag(mem_ready) ? EXEC : PREINC; | 287 | 'o3, 'o4, 'o5: state = `lag(mem_ready) ? EXEC : PREINC; |
| 280 | endcase | 288 | endcase |
| 281 | end | 289 | end |
| 282 | 290 | ||
| 283 | AGEN: begin | 291 | AGEN: begin |
| 284 | mem_valid = 1; | 292 | mem_valid = 1; |
| 285 | case (opcode) | 293 | case (opcode) |
| 286 | 'b000, 'b001, 'b010: mem_write = 0; | 294 | 'o0, 'o1, 'o2: mem_write = 0; |
| 287 | endcase | 295 | endcase |
| 288 | mem_address = address; | 296 | mem_address = address; |
| 289 | state = `lag(mem_ready) ? EXEC : AGEN; | 297 | state = `lag(mem_ready) ? EXEC : AGEN; |
| @@ -298,14 +306,14 @@ always_ff @(posedge clk) begin | |||
| 298 | stall = 1; | 306 | stall = 1; |
| 299 | end | 307 | end |
| 300 | case (opcode) | 308 | case (opcode) |
| 301 | 'b000, 'b001, 'b010: if (! `lag(mem_read_valid)) stall = 1; | 309 | 'o0, 'o1, 'o2: if (! `lag(mem_read_valid)) stall = 1; |
| 302 | endcase | 310 | endcase |
| 303 | if (! stall) begin | 311 | if (! stall) begin |
| 304 | state = FETCH; | 312 | state = FETCH; |
| 305 | case (opcode) | 313 | case (opcode) |
| 306 | 'b000: acc &= `lag(mem_read_data); | 314 | 'o0: acc &= `lag(mem_read_data); |
| 307 | 'b001: {link, acc} += {1'b0, `lag(mem_read_data)}; | 315 | 'o1: {link, acc} += {1'b0, `lag(mem_read_data)}; |
| 308 | 'b010: begin | 316 | 'o2: begin |
| 309 | mem_valid = 1; | 317 | mem_valid = 1; |
| 310 | mem_address = address; | 318 | mem_address = address; |
| 311 | mem_write = 1; | 319 | mem_write = 1; |
| @@ -313,7 +321,7 @@ always_ff @(posedge clk) begin | |||
| 313 | if (mem_write_data == 0) ++pc; | 321 | if (mem_write_data == 0) ++pc; |
| 314 | state = MEMWAIT; | 322 | state = MEMWAIT; |
| 315 | end | 323 | end |
| 316 | 'b011: begin | 324 | 'o3: begin |
| 317 | mem_valid = 1; | 325 | mem_valid = 1; |
| 318 | mem_address = address; | 326 | mem_address = address; |
| 319 | mem_write = 1; | 327 | mem_write = 1; |
| @@ -321,7 +329,7 @@ always_ff @(posedge clk) begin | |||
| 321 | acc = 0; | 329 | acc = 0; |
| 322 | state = MEMWAIT; | 330 | state = MEMWAIT; |
| 323 | end | 331 | end |
| 324 | 'b100: begin | 332 | 'o4: begin |
| 325 | mem_valid = 1; | 333 | mem_valid = 1; |
| 326 | mem_address = address; | 334 | mem_address = address; |
| 327 | mem_write = 1; | 335 | mem_write = 1; |
| @@ -329,7 +337,7 @@ always_ff @(posedge clk) begin | |||
| 329 | pc = address + 1; | 337 | pc = address + 1; |
| 330 | state = MEMWAIT; | 338 | state = MEMWAIT; |
| 331 | end | 339 | end |
| 332 | 'b101: pc = address; | 340 | 'o5: pc = address; |
| 333 | endcase | 341 | endcase |
| 334 | end | 342 | end |
| 335 | end | 343 | end |
| @@ -337,7 +345,7 @@ always_ff @(posedge clk) begin | |||
| 337 | MEMWAIT: state = `lag(mem_ready) ? FETCH : MEMWAIT; | 345 | MEMWAIT: state = `lag(mem_ready) ? FETCH : MEMWAIT; |
| 338 | 346 | ||
| 339 | HALT: begin | 347 | HALT: begin |
| 340 | $display("%d halt state reached", $time); | 348 | $display("\nhalt state reached"); |
| 341 | $finish; | 349 | $finish; |
| 342 | end | 350 | end |
| 343 | endcase | 351 | endcase |
