Entity: prim_generic_flash_bank
- File: prim_generic_flash_bank.sv
Diagram
Description
Copyright lowRISC contributors. Licensed under the Apache License, Version 2.0, see LICENSE for details. SPDX-License-Identifier: Apache-2.0
Emulate a single generic flash bank
Generics
| Generic name | Type | Value | Description |
|---|---|---|---|
| InfosPerBank | int | 1 | info pages per bank |
| InfoTypes | int | 1 | different info types |
| InfoTypesWidth | int | 1 | different info types |
| PagesPerBank | int | 256 | data pages per bank |
| WordsPerPage | int | 256 | words per page |
| DataWidth | int | 32 | bits per word |
| MetaDataWidth | int | 12 | this is a temporary parameter to work around ECC issues |
| PageW | int | $clog2(PagesPerBank) | Derived parameters |
| WordW | int | $clog2(WordsPerPage) | |
| AddrW | int | PageW + WordW |
Ports
| Port name | Direction | Type | Description |
|---|---|---|---|
| clk_i | input | ||
| rst_ni | input | ||
| rd_i | input | ||
| prog_i | input | ||
| prog_last_i | input | ||
| prog_type_i | input | the generic model does not make use of program types | |
| pg_erase_i | input | ||
| bk_erase_i | input | ||
| erase_suspend_req_i | input | ||
| he_i | input | ||
| addr_i | input | [AddrW-1:0] | |
| part_i | input | ||
| info_sel_i | input | [InfoTypesWidth-1:0] | |
| prog_data_i | input | [DataWidth-1:0] | |
| ack_o | output | ||
| done_o | output | ||
| rd_data_o | output | [DataWidth-1:0] | |
| init_i | input | ||
| init_busy_o | output | ||
| flash_power_ready_h_i | input | ||
| flash_power_down_h_i | input |
Signals
| Name | Type | Description |
|---|---|---|
| st_q | state_e | |
| st_d | state_e | |
| time_cnt | logic [31:0] | |
| index_cnt | logic [31:0] | |
| time_cnt_inc | logic | |
| time_cnt_clr | logic | |
| time_cnt_set1 | logic | |
| index_cnt_inc | logic | |
| index_cnt_clr | logic | |
| index_limit_q | logic [31:0] | |
| index_limit_d | logic [31:0] | |
| time_limit_q | logic [31:0] | |
| time_limit_d | logic [31:0] | |
| prog_pend_q | logic | |
| prog_pend_d | logic | |
| mem_req | logic | |
| mem_wr | logic | |
| mem_wdata | logic [DataWidth-1:0] | |
| mem_addr | logic [AddrW-1:0] | |
| mem_part | flash_ctrl_pkg::flash_part_e | |
| mem_info_sel | logic [InfoTypesWidth-1:0] | |
| cmd_d | cmd_payload_t | |
| cmd_q | cmd_payload_t | |
| cmd_valid | logic | |
| pop_cmd | logic | |
| mem_rd_q | logic | |
| mem_rd_d | logic | |
| wvalid | logic | for read transactions, in order to reduce latency, the command fifo is popped early (before done_o). This is to ensure that when the current transaction is complete, during the same cycle a new read can be issued. As a result, the command is popped immediately after the read is issued, rather than waiting for the read to be completed. The same restrictions are not necessary for program / erase, which do not have the same performance requirements. when the flash is going through init, do not accept any transactions |
| ack | logic | |
| rd_req | logic | |
| prog_req | logic | |
| pg_erase_req | logic | |
| bk_erase_req | logic | |
| rd_data_q | logic [DataWidth-1:0] | latch read data from emulated memories the cycle after a read |
| rd_data_d | logic [DataWidth-1:0] | latch read data from emulated memories the cycle after a read |
| rd_part_q | flash_ctrl_pkg::flash_part_e | latch partiton being read since the command fifo is popped early |
| info_sel_q | logic [InfoTypesWidth-1:0] | |
| rd_data_main | logic [DataWidth-1:0] | |
| rd_data_info | logic [DataWidth-1:0] | |
| rd_nom_data_main | logic [MemWidth-1:0] | |
| rd_meta_data_main | logic [MetaDataWidth-1:0] | |
| rd_nom_data_info | logic [InfoTypes-1:0][MemWidth-1:0] | |
| rd_meta_data_info | logic [InfoTypes-1:0][MetaDataWidth-1:0] | |
| unused_prog_type | flash_ctrl_pkg::flash_prog_e | |
| unused_he | logic |
Constants
| Name | Type | Value | Description |
|---|---|---|---|
| PageW | int | $clog2(PagesPerBank) | Derived parameters |
| WordW | int | $clog2(WordsPerPage) | |
| AddrW | int | PageW + WordW | |
| ReadCycles | int | 1 | Emulated flash macro values |
| ProgCycles | int | 50 | |
| PgEraseCycles | int | 200 | |
| BkEraseCycles | int | 2000 | |
| InitCycles | int | 100 | |
| WordsPerBank | int | PagesPerBank * WordsPerPage | Locally derived values |
| WordsPerInfoBank | int | InfosPerBank * WordsPerPage | |
| InfoAddrW | int | $clog2(WordsPerInfoBank) | |
| MemWidth | int | DataWidth - MetaDataWidth | always_comb |
Types
| Name | Type | Description |
|---|---|---|
| state_e | enum logic [2:0] { StReset = 'h0, StInit = 'h1, StIdle = 'h2, StRead = 'h3, StProg = 'h4, StErase = 'h5 } |
|
| cmd_payload_t | struct packed { logic rd; logic prog; logic prog_last; flash_ctrl_pkg::flash_prog_e prog_type; logic pg_erase; logic bk_erase; logic [AddrW-1:0] addr; flash_ctrl_pkg::flash_part_e part; logic [InfoTypesWidth-1:0] info_sel; logic [DataWidth-1:0] prog_data; } |
insert a fifo here to break the large fanout from inputs to memories on reads |
Processes
- unnamed: ( @(posedge clk_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_i or negedge rst_ni) )
Type: always_ff
Description
prog_pend_q is necessary to emulate flash behavior that a bit written to 0 cannot be written back to 1 without an erase
- unnamed: ( )
Type: always_comb
Instantiations
- u_mem_meta: prim_ram_1p