Skip to content

Commit a3216f3

Browse files
updated amo controller and amo control unit
1 parent 121decc commit a3216f3

3 files changed

Lines changed: 53 additions & 24 deletions

File tree

source_code/rv32a/rv32a_enabled.sv

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module rv32a_enabled(
22
input CLK,
33
input nRST,
44
input logic amo_en, mem_ready,
5-
input logic [3:0] alu_op, //need to change to type
5+
input logic [4:0] alu_op, //need to change to type
66
input logic [31:0] mem_output, rs2_data,
77
output logic stall_amo_en, read_mem_en, write_mem_en,
88
output logic [31:0] mem_input, writeback_data
@@ -18,10 +18,12 @@ module rv32a_enabled(
1818

1919
amo_fsm_state_t current_state, next_state;
2020

21+
logic complete;
22+
2123
// Sequential logic for state register
2224
always_ff @(posedge CLK, negedge nRST) begin
2325
if (!nRST)
24-
current_state <= AMO_FSM_READ;
26+
current_state <= AMO_FSM_IDLE;
2527
else
2628
current_state <= next_state;
2729
end
@@ -30,26 +32,20 @@ module rv32a_enabled(
3032
always_comb begin
3133
next_state = current_state;
3234
stall_amo_en = 1'b0; // Default to no stall
33-
read_mem_en = 1'b0;
34-
write_mem_en = 1'b0;
35-
// output port signal will need to be routed to caches and dealt with, look below for that
3635

37-
casez (current_state)
38-
IDLE: begin
36+
case (current_state)
37+
AMO_FSM_IDLE: begin
3938
//control unit signal rolled over through to mem stage rv32a_amo
40-
next_state = (amo_en) ? AMO_FSM_READ : IDLE;
39+
next_state = (amo_en && !complete) ? AMO_FSM_READ : AMO_FSM_IDLE;
4140

42-
stall_amo_en = amo_en;
41+
stall_amo_en = amo_en && !complete;
4342
end
4443

4544
AMO_FSM_READ: begin
4645
//wait for memory response
4746
next_state = (mem_ready) ? AMO_FSM_MODIFY : AMO_FSM_READ;
4847

4948
stall_amo_en = 1'b1; //start the ALU and stall pipeline
50-
51-
// read from cache here
52-
read_mem_en = 1'b1;
5349
end
5450

5551
AMO_FSM_MODIFY: begin
@@ -61,19 +57,18 @@ module rv32a_enabled(
6157

6258
AMO_FSM_WRITE: begin
6359
//wait for memory response
64-
next_state = (mem_ready) ? AMO_FSM_MODIFY : AMO_FSM_READ;
60+
next_state = (mem_ready) ? AMO_FSM_IDLE : AMO_FSM_WRITE;
6561

6662
// keep pipeline stalled
67-
stall_amo_en = !mem_ready;
68-
69-
// write back to cache here
70-
write_mem_en = 1'b1;
63+
stall_amo_en = 1'b1;
7164
end
7265
endcase
7366
end
7467

68+
logic [31:0] amo_reg;
69+
7570
rv32a_alu AMO_ALU (
76-
.portA(mem_output),
71+
.portA(amo_reg),
7772
.portB(rs2_data),
7873
.alu_op(alu_op), //need to change to type
7974
//.negative,
@@ -82,20 +77,54 @@ module rv32a_enabled(
8277
.output_port(mem_input)
8378
);
8479

85-
logic [31:0] amo_reg;
86-
8780
assign writeback_data = amo_reg;
8881

8982
always_ff @(posedge CLK, negedge nRST) begin
9083
if (!nRST) begin
9184
amo_reg <= '0;
9285
end
93-
else if (amo_en & mem_ready) begin
86+
else if ((current_state == AMO_FSM_READ) & mem_ready) begin
9487
amo_reg <= mem_output;
9588
end
9689
else begin
9790
amo_reg <= amo_reg;
9891
end
9992
end
10093

94+
always_ff @(posedge CLK, negedge nRST) begin
95+
if (!nRST) begin
96+
complete <= 0;
97+
end
98+
else if ((current_state == AMO_FSM_WRITE) && mem_ready) begin
99+
complete <= 1;
100+
end
101+
else if (!amo_en) begin
102+
complete <= 0;
103+
end
104+
else complete <= complete;
105+
end
106+
107+
//read & write enable logic registered to remove circular loop that formed somehow
108+
always_ff @(posedge CLK, negedge nRST) begin
109+
if (!nRST) begin
110+
read_mem_en <= 1'b0;
111+
write_mem_en <= 1'b0;
112+
end else begin
113+
read_mem_en <= (next_state == AMO_FSM_READ);
114+
write_mem_en <= (next_state == AMO_FSM_WRITE);
115+
end
116+
end
117+
/*
118+
always_ff @(posedge CLK, negedge nRST) begin
119+
$display("t=%0t state=%0d amo_en=%b mem_ready=%b stall=%b read_en=%b write_en=%b complete=%b",
120+
$time,
121+
current_state,
122+
amo_en,
123+
mem_ready,
124+
stall_amo_en,
125+
read_mem_en,
126+
write_mem_en,
127+
complete);
128+
end*/
129+
101130
endmodule

source_code/rv32a/rv32a_wrapper.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module rv32a_wrapper(
55
input nRST,
66
input logic amo_en,
77
input logic mem_ready,
8-
input logic [3:0] alu_op,
8+
input logic [4:0] alu_op,
99
input logic [31:0] mem_output, rs2_data,
1010
output logic stall_amo_en,
1111
output logic read_mem_en,

source_code/standard_core/control_unit.sv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ module control_unit (
8989
(instr_i.funct3 == SLLI || instr_i.funct3 == SRI));
9090

9191
// Assign branch and load type
92-
assign cu_if.load_type = rv32a_lr ? LW : load_t'(instr_i.funct3);
92+
assign cu_if.load_type = (rv32a_lr || rv32a_amo) ? LW : load_t'(instr_i.funct3);
9393
assign cu_if.branch_type = branch_t'(instr_sb.funct3);
9494

9595
// Assign memory read/write enables
@@ -304,7 +304,7 @@ module control_unit (
304304
assign rv32a_lr = rv32a_claim && cu_if.rv32a_control.op == AMO_LR;
305305
assign rv32a_sc = rv32a_claim && cu_if.rv32a_control.op == AMO_SC;
306306
assign rv32a_amo = rv32a_claim && ~(rv32a_lr || rv32a_sc);
307-
assign cu_if.reserve = rv32a_lr || rv32a_sc || rv32a_amo;
307+
assign cu_if.reserve = rv32a_lr || rv32a_sc;
308308
assign cu_if.exclusive = rv32a_amo;
309309
`else
310310
assign cu_if.rv32a_control = {1'b0, rv32a_op_e'(0)};

0 commit comments

Comments
 (0)