| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| // | |
| // Flash Phy Erase Module | |
| // Translates the controller's req/ack interface to the interface expected by the flash wrapper | |
| // Longer term the controller protocol can be changed to match. | |
| module flash_phy_erase import flash_phy_pkg::*; ( | |
| input clk_i, | |
| input rst_ni, | |
| // interface with controller | |
| input pg_erase_req_i, | |
| input bk_erase_req_i, | |
| output logic ack_o, | |
| // interface with flash | |
| output logic pg_erase_req_o, | |
| output logic bk_erase_req_o, | |
| input ack_i, | |
| input done_i | |
| ); | |
| typedef enum logic { | |
| StEraseIdle, | |
| StEraseBusy | |
| } erase_state_e; | |
| erase_state_e state_d, state_q; | |
| logic req_valid; | |
| always_ff @(posedge clk_i or negedge rst_ni) begin | |
| if (!rst_ni) begin | |
| state_q <= StEraseIdle; | |
| end else begin | |
| state_q <= state_d; | |
| end | |
| end | |
| always_comb begin | |
| req_valid = 1'b0; | |
| ack_o = 1'b0; | |
| state_d = state_q; | |
| unique case (state_q) | |
| StEraseIdle: begin | |
| req_valid = 1'b1; | |
| if ((pg_erase_req_o || bk_erase_req_o) && ack_i) begin | |
| state_d = StEraseBusy; | |
| end | |
| end | |
| StEraseBusy: begin | |
| if (done_i) begin | |
| ack_o = 1'b1; | |
| state_d = StEraseIdle; | |
| end | |
| end | |
| default:; | |
| endcase // unique case (state_q) | |
| end | |
| assign pg_erase_req_o = pg_erase_req_i & req_valid; | |
| assign bk_erase_req_o = bk_erase_req_i & req_valid; | |
| endmodule |