Basic addi works

This commit is contained in:
2024-07-10 15:58:01 +08:00
parent 07e6545d2a
commit 4b5dc5dc1b
14 changed files with 221 additions and 159 deletions

File diff suppressed because one or more lines are too long

View File

@@ -13,8 +13,14 @@ module test_cpu ();
CPU cpu(
.hardware_clk(sim_clk),
.reset(reset),
.hardware_reset(reset),
.clock_locked(clk_locked),
.bcd_control(bcd_control)
);
initial begin
reset = 1;
#30;
reset = 0;
end
endmodule

View File

@@ -1,7 +1,7 @@
`timescale 1ns / 1ps
module CPU (
input hardware_clk,
input reset,
input hardware_reset,
output clock_locked,
output [11:0] bcd_control
);
@@ -14,9 +14,12 @@ module CPU (
.locked(clock_locked)
);
wire reset;
assign reset = hardware_reset || ~clock_locked;
// Out of IF
wire IF_fetched_instruction;
wire IF_PC_plus_4;
wire [31:0] IF_fetched_instruction;
wire [31:0] IF_PC_plus_4;
// Out of ID
wire [1:0] ID_PC_jump;
@@ -89,6 +92,7 @@ module CPU (
InstFetch instruction_fetch (
.clk(clk),
.reset(reset),
.branch_target(EX_branch_target),
.jump_target(ID_jump_target),
.jump_register_target(ID_jump_register_target),
@@ -101,12 +105,13 @@ module CPU (
InstDecode instruction_decode (
.clk(clk),
.reset(reset),
.prev_fetched_instruction(IF_fetched_instruction),
.prev_PC_plus_4(IF_PC_plus_4),
.IFIDSrc(hazard_IFID_source),
.WB_write_enable(WB_write_enable),
.WB_write_address(WB_write_address),
.WB_write_data(WB_write_data),
.WB_write_enable(WB_register_write),
.WB_write_address(WB_register_write_address),
.WB_write_data(WB_register_write_data),
.PC_jump(ID_PC_jump),
.jump_target(ID_jump_target),
.jump_register_target(ID_jump_register_target),
@@ -131,6 +136,7 @@ module CPU (
Execution execution (
.clk(clk),
.reset(reset),
.prev_is_branch(ID_is_branch),
.prev_WB_source(ID_WB_source),
.prev_memory_write(ID_memory_write),
@@ -166,6 +172,7 @@ module CPU (
MemoryAccess memory_access (
.clk(clk),
.reset(reset),
.prev_register_write(EX_register_write),
.prev_WB_source(EX_WB_source),
.prev_memory_write(EX_memory_write),
@@ -190,6 +197,7 @@ module CPU (
WriteBack write_back (
.clk(clk),
.reset(reset),
.prev_register_write(MEM_register_write),
.prev_WB_source(MEM_WB_source),
.prev_memory_read_data(MEM_memory_read_data),
@@ -202,6 +210,7 @@ module CPU (
DataMemory data_memory (
.clk(clk),
.reset(reset),
.address(MEM_data_memory_address),
.write_enable(MEM_data_memory_write),
.write_data(MEM_data_memory_write_data),

View File

@@ -2,6 +2,7 @@
module DataMemory (
input clk,
input reset,
input [31:0] address,
input write_enable,
input [31:0] write_data,
@@ -15,10 +16,24 @@ module DataMemory (
assign bcd_hardwire = memory_data[START_ADDRESS+4];
integer i;
initial begin
for (i = START_ADDRESS; i < MEM_SIZE + START_ADDRESS; i = i + 1) begin
memory_data[i] <= 32'h00000000;
end
end
always @(posedge clk) begin
if (reset) begin
for (i = START_ADDRESS; i < MEM_SIZE + START_ADDRESS; i = i + 1) begin
memory_data[i] <= 32'h00000000;
end
end else begin
if (write_enable) begin
memory_data[address] <= write_data;
end
read_data <= memory_data[address];
end
end
endmodule

View File

@@ -1,6 +1,7 @@
`timescale 1ns / 1ps
module Execution (
input clk,
input reset,
// From prev stage
input prev_is_branch,
input prev_WB_source,
@@ -96,7 +97,7 @@ module Execution (
assign rt_address = EX_rt_address;
always @(posedge clk) begin
if (IDEXSrc == 1'b1) begin
if (IDEXSrc == 1'b1 || reset == 1'b1) begin
EX_register_write <= 1'b0;
EX_WB_source <= 1'b0;
EX_memory_write <= 1'b0;

View File

@@ -1,6 +1,7 @@
`timescale 1ns / 1ps
module InstDecode (
input clk,
input reset,
// From prev stage
input [31:0] prev_fetched_instruction,
input [31:0] prev_PC_plus_4,
@@ -65,7 +66,7 @@ module InstDecode (
// Signals to connect from control unit to register file and immediate extend unit
wire write_ra;
wire ra_addr_source;
wire extendop;
wire [1:0] extendop;
ControlUnit control_unit (
.opcode(opcode),
@@ -93,6 +94,7 @@ module InstDecode (
RegisterFile register_file (
.clk(clk),
.reset(reset),
.read_addr1(rs),
.read_addr2(rt),
.write_enable(WB_write_enable),
@@ -115,6 +117,10 @@ module InstDecode (
);
always @(posedge clk) begin
if (reset) begin
IFID_instruction <= 32'h00000000;
IFID_PC_plus_4 <= 32'h00000000;
end else begin
case (IFIDSrc)
2'b00: begin
IFID_instruction <= prev_fetched_instruction;
@@ -134,5 +140,6 @@ module InstDecode (
end
endcase
end
end
endmodule

View File

@@ -1,6 +1,7 @@
`timescale 1ns / 1ps
module InstFetch (
input clk,
input reset,
input [31:0] branch_target,
input [31:0] jump_target,
input [31:0] jump_register_target,
@@ -17,10 +18,14 @@ module InstFetch (
.instruction(fetched_instruction)
);
wire adder_out;
wire [31:0] adder_out;
assign adder_out = PC + 4;
assign PC_plus_4 = adder_out;
always @(posedge clk) begin
if (reset) begin
PC <= 32'h00000000;
end else begin
if (need_stall) begin
PC <= PC;
end else begin
@@ -36,4 +41,5 @@ module InstFetch (
end
end
end
end
endmodule

View File

@@ -8,7 +8,7 @@ module InstructionMemory (
always @(*) begin
case (address[31:2])
20'd0: instruction <= 32'h20210001;
20'd1: instruction <= 32'h08000000;
20'd10: instruction <= 32'h08000000;
default: instruction <= 32'h00000000;
endcase
end

View File

@@ -1,6 +1,7 @@
`timescale 1ns / 1ps
module MemoryAccess (
input clk,
input reset,
// From prev stage
input prev_register_write,
input prev_WB_source,
@@ -61,6 +62,15 @@ module MemoryAccess (
assign register_write_destination = MEM_register_write_destination;
always @(posedge clk) begin
if (reset) begin
MEM_register_write <= 1'b0;
MEM_WB_source <= 1'b0;
MEM_memory_write <= 1'b0;
MEM_ALU_result <= 32'h00000000;
MEM_memory_write_data <= 32'h00000000;
MEM_register_write_destination <= 5'b00000;
MEM_rt_address <= 5'b00000;
end else begin
MEM_register_write <= prev_register_write;
MEM_WB_source <= prev_WB_source;
MEM_memory_write <= prev_memory_write;
@@ -69,4 +79,5 @@ module MemoryAccess (
MEM_register_write_destination <= prev_register_write_destination;
MEM_rt_address <= prev_rt_address;
end
end
endmodule

View File

@@ -2,6 +2,7 @@
module RegisterFile (
input clk,
input reset,
input [4:0] read_addr1,
input [4:0] read_addr2,
input write_enable,
@@ -14,7 +15,8 @@ module RegisterFile (
output [31:0] read_output2
);
reg [31:0] registers[31:1];
reg [31:0] registers[1:31];
integer i;
assign read_output1 = (read_addr1 == 5'b00000) ? 32'h00000000 :
(read_addr1 == write_ra_addr) ? write_ra_data :
@@ -24,7 +26,18 @@ module RegisterFile (
(read_addr2 == write_ra_addr) ? write_ra_data :
(read_addr2 == write_addr) ? write_data : registers[read_addr2];
initial begin
for (i = 1; i < 32; i = i + 1) begin
registers[i] <= 32'h00000000;
end
end
always @(posedge clk) begin
if (reset) begin
for (i = 1; i < 32; i = i + 1) begin
registers[i] <= 32'h00000000;
end
end else begin
if (write_addr == write_ra_addr) begin
if (write_ra) begin
registers[write_ra_addr] <= write_ra_data;
@@ -42,5 +55,6 @@ module RegisterFile (
end
end
end
end
endmodule

View File

@@ -1,6 +1,7 @@
`timescale 1ns / 1ps
module WriteBack (
input clk,
input reset,
// From prev stage
input prev_register_write,
input prev_WB_source,
@@ -24,10 +25,18 @@ module WriteBack (
assign register_write_addr = WB_register_write_destination;
always @(posedge clk) begin
if (reset) begin
WB_register_write <= 1'b0;
WB_WB_source <= 1'b0;
WB_memory_read_data <= 32'h00000000;
WB_ALU_result <= 32'h00000000;
WB_register_write_destination <= 5'b00000;
end else begin
WB_register_write <= prev_register_write;
WB_WB_source <= prev_WB_source;
WB_memory_read_data <= prev_memory_read_data;
WB_ALU_result <= prev_ALU_result;
WB_register_write_destination <= prev_register_write_destination;
end
end
endmodule

View File

@@ -60,7 +60,7 @@
<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>
<Option Name="EnableBDX" Val="FALSE"/>
<Option Name="FeatureSet" Val="FeatureSet_Classic"/>
<Option Name="WTXSimLaunchSim" Val="17"/>
<Option Name="WTXSimLaunchSim" Val="68"/>
<Option Name="WTModelSimLaunchSim" Val="0"/>
<Option Name="WTQuestaLaunchSim" Val="0"/>
<Option Name="WTIesLaunchSim" Val="0"/>