Fix some timing bugs in the CPU and add debug outputs
This commit is contained in:
50
CPU.sv
50
CPU.sv
@ -7,7 +7,21 @@ module CPU(
|
|||||||
|
|
||||||
// TODO: Replace with Input/Output module
|
// TODO: Replace with Input/Output module
|
||||||
input var logic[7:0] cpuin,
|
input var logic[7:0] cpuin,
|
||||||
output var logic[7:0] cpuout
|
output var logic[7:0] cpuout,
|
||||||
|
|
||||||
|
// Debug Outputs
|
||||||
|
output var logic dbg_fetch,
|
||||||
|
output var logic dbg_decode,
|
||||||
|
output var logic dbg_execute,
|
||||||
|
output var logic dbg_writeback,
|
||||||
|
output var logic[7:0] dbg_pcout,
|
||||||
|
output var logic[7:0] dbg_romout,
|
||||||
|
output var logic[7:0] dbg_savebus,
|
||||||
|
output var logic[7:0] dbg_loadbus,
|
||||||
|
output var logic[7:0] dbg_jumptarget,
|
||||||
|
output var logic[7:0] dbg_aluopA,
|
||||||
|
output var logic[7:0] dbg_aluopB,
|
||||||
|
output var logic[7:0] dbg_aluresult
|
||||||
);
|
);
|
||||||
|
|
||||||
// Decoder
|
// Decoder
|
||||||
@ -82,7 +96,7 @@ RegisterFile regs(
|
|||||||
// Arithmetic and Logical Unit
|
// Arithmetic and Logical Unit
|
||||||
var logic[7:0] alu_result;
|
var logic[7:0] alu_result;
|
||||||
ALU alu(
|
ALU alu(
|
||||||
.clock(execute), // WARNING: Phase 3 - Execute
|
// .clock(execute), // WARNING: Phase 3 - Execute // TODO
|
||||||
.opcode(ctrl_aluopc),
|
.opcode(ctrl_aluopc),
|
||||||
.operandA(regs_aluopA),
|
.operandA(regs_aluopA),
|
||||||
.operandB(regs_aluopB),
|
.operandB(regs_aluopB),
|
||||||
@ -92,7 +106,7 @@ ALU alu(
|
|||||||
// Conditional Unit
|
// Conditional Unit
|
||||||
var logic cond_result;
|
var logic cond_result;
|
||||||
ConditionalUnit cond(
|
ConditionalUnit cond(
|
||||||
.clock(execute), // WARNING: Phase 3 - Execute
|
// .clock(execute), // WARNING: Phase 3 - Execute // TODO
|
||||||
.opcode(ctrl_condopc),
|
.opcode(ctrl_condopc),
|
||||||
.operand(regs_aluresult),
|
.operand(regs_aluresult),
|
||||||
.result(cond_result)
|
.result(cond_result)
|
||||||
@ -103,14 +117,25 @@ assign pc_set = cond_result && ctrl_pcset;
|
|||||||
assign pc_in = regs_jumptarget;
|
assign pc_in = regs_jumptarget;
|
||||||
assign regs_set = ctrl_regsset && (ctrl_arg0 != 3'b110);
|
assign regs_set = ctrl_regsset && (ctrl_arg0 != 3'b110);
|
||||||
|
|
||||||
|
// FIXME: ALU writeback doesn't work:
|
||||||
|
// - Execute clocks the ALU
|
||||||
|
// - Execute connects alu_result to regs_savebus.
|
||||||
|
// This has to happen after the ALU was clocked.
|
||||||
|
// Remove the ALU/Cond clock entirely (for now)?
|
||||||
// TODO: Should add this to the Controller probably?
|
// TODO: Should add this to the Controller probably?
|
||||||
// Or a new module, like "BusController"? Or just "Bus"?
|
// Or a new module, like "BusController"? Or just "Bus"?
|
||||||
always @(execute) case (ctrl_opcode)
|
always @(execute) case (ctrl_opcode) // WARNING: Phase 3 - Execute ("Execute" currently means "BusControl")
|
||||||
|
2'b00: begin
|
||||||
|
// Load constant
|
||||||
|
cpuout = 8'b00000000;
|
||||||
|
regs_savebus = ctrl_arg;
|
||||||
|
end
|
||||||
2'b01: begin
|
2'b01: begin
|
||||||
|
// Save ALU result
|
||||||
cpuout = 8'b00000000;
|
cpuout = 8'b00000000;
|
||||||
regs_savebus = alu_result;
|
regs_savebus = alu_result;
|
||||||
end
|
end
|
||||||
2'b11: if (ctrl_arg0 == 3'b110) begin
|
2'b10: if (ctrl_arg0 == 3'b110) begin
|
||||||
// Write to output
|
// Write to output
|
||||||
cpuout = regs_loadbus;
|
cpuout = regs_loadbus;
|
||||||
regs_savebus = 8'b00000000;
|
regs_savebus = 8'b00000000;
|
||||||
@ -124,9 +149,24 @@ always @(execute) case (ctrl_opcode)
|
|||||||
regs_savebus = regs_loadbus;
|
regs_savebus = regs_loadbus;
|
||||||
end
|
end
|
||||||
default: begin
|
default: begin
|
||||||
|
// Conditional jump
|
||||||
cpuout = 8'b00000000;
|
cpuout = 8'b00000000;
|
||||||
regs_savebus = 8'b00000000;
|
regs_savebus = 8'b00000000;
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
|
|
||||||
|
// Debug outputs
|
||||||
|
assign dbg_fetch = fetch;
|
||||||
|
assign dbg_decode = decode;
|
||||||
|
assign dbg_execute = execute;
|
||||||
|
assign dbg_writeback = writeback;
|
||||||
|
assign dbg_pcout = pc_out;
|
||||||
|
assign dbg_romout = rom_data;
|
||||||
|
assign dbg_savebus = regs_savebus;
|
||||||
|
assign dbg_loadbus = regs_loadbus;
|
||||||
|
assign dbg_jumptarget = regs_jumptarget;
|
||||||
|
assign dbg_aluopA = regs_aluopA;
|
||||||
|
assign dbg_aluopB = regs_aluopB;
|
||||||
|
assign dbg_aluresult = regs_aluresult;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
Reference in New Issue
Block a user