@@ -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+
101130endmodule
0 commit comments