summaryrefslogtreecommitdiff
path: root/hdl/core.sv
diff options
context:
space:
mode:
authorJulian Blake Kongslie2021-05-16 13:40:27 -0700
committerJulian Blake Kongslie2021-05-16 13:40:27 -0700
commit56eb00d755a3ff2647d635ea9d9ea2e1dd9e15c8 (patch)
tree6efa48d7eff48b17066fb82642ccb4bff6f3b008 /hdl/core.sv
parentAdd a few more binaries to play with. (diff)
downloadnoncpu-56eb00d755a3ff2647d635ea9d9ea2e1dd9e15c8.tar.xz
Work in progress from May 9
Diffstat (limited to '')
-rw-r--r--hdl/core.sv80
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;
20mem 20mem
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