blob: 126d202383827d5667778dd982cd9481cda4d3c5 [file] [log] [blame]
package flash_ctrl
import chisel3._
import merl.uit.tilelink.{TLConfiguration, TLSocket1_N, TL_D2H, TL_H2D, TL_RegAdapter}
class FlashCtrlRegTop(implicit val conf: TLConfiguration) extends Module {
val io = IO(new Bundle {
val tl_i = Flipped(new TL_H2D())
val tl_o = new TL_D2H()
// For window ports
val tl_win_o = new TL_H2D()
val tl_win_i = Flipped(new TL_D2H())
// To hardware peripheral logic
val reg2hw = new FlashCtrlReg2Hw
val hw2reg = new FlashCtrlHw2Reg
})
val AW = 8
val DW = 32
val DBW = DW/8
val reg_we = Wire(Bool())
val reg_re = Wire(Bool())
val reg_addr = Wire(UInt(AW.W))
val reg_wdata = Wire(UInt(DW.W))
val reg_be = Wire(UInt(DBW.W))
val reg_rdata = Wire(UInt(DW.W))
val reg_error = Wire(Bool())
val addrmiss, wr_err = Wire(Bool())
val reg_rdata_next = Wire(UInt(DW.W))
val tl_reg_h2d = new TL_H2D()
val tl_reg_d2h = new TL_D2H()
// Creating bundles of TL-UL interfaces to connect with the 1:N Socket
val tl_socket_h2d = Wire(Vec(2, new TL_H2D))
val tl_socket_d2h = Wire(Vec(2, new TL_D2H))
val reg_steer = Wire(UInt(2.W)) // used for steering the host request to a specific device in the 1:N Socket
// the last port of the 1:N socket is connected with this bundle which is later passed as input to the TL_Register Adapter
tl_reg_h2d <> tl_socket_h2d(1)
// the response of device from the last port of 1:N socket is being driven by the tl_reg_d2h bundle which is coming as output from the TL_Register Adapter.
tl_socket_d2h(1) <> tl_reg_d2h
// for window the first port of 1:N socket is connected with the tl_win_o to route the host's request
io.tl_win_o <> tl_socket_h2d(0)
// the response from the window is provided to the first port of the 1:N socket through the tl_socket_d2h(0) port.
tl_socket_d2h(0) <> io.tl_win_i
// Creating the actual 1:N Socket
val tlul_1_N_socket = Module(new TLSocket1_N(2))
tlul_1_N_socket.io.tl_h_i <> io.tl_i
io.tl_o <> tlul_1_N_socket.io.tl_h_o
tl_socket_h2d <> tlul_1_N_socket.io.tl_d_o
tlul_1_N_socket.io.tl_d_i <> tl_socket_d2h
tlul_1_N_socket.io.dev_sel := reg_steer
// Creating steering logic
reg_steer := 1.U
when(io.tl_i.a_address(AW-1,0) >= 168.U && io.tl_i.a_address(AW-1,0) < 172.U) {
reg_steer := 0.U
}
// Creating TL_Register Adapter to cater the request of host on the last port for communicating with the registers inside this module
val tlul_reg_adapter = Module(new TL_RegAdapter(AW, DW)())
tlul_reg_adapter.io.tl_i <> tl_reg_h2d
tl_reg_d2h <> tlul_reg_adapter.io.tl_o
reg_we := tlul_reg_adapter.io.we_o
reg_re := tlul_reg_adapter.io.re_o
reg_addr := tlul_reg_adapter.io.addr_o
reg_wdata := tlul_reg_adapter.io.wdata_o
reg_be := tlul_reg_adapter.io.be_o
tlul_reg_adapter.io.rdata_i := reg_rdata
tlul_reg_adapter.io.error_i := reg_error
reg_rdata := reg_rdata_next
reg_error := addrmiss | wr_err
// Defining software related signals that will be connected with the flip flops for each register bit field.
// INTR_STATE Register
val intr_state_rd_full_qs, intr_state_rd_full_wd, intr_state_rd_full_we = Wire(Bool())
val intr_state_op_done_qs, intr_state_op_done_wd, intr_state_op_done_we = Wire(Bool())
val intr_state_op_error_qs, intr_state_op_error_wd, intr_state_op_error_we = Wire(Bool())
// INTR_ENABLE Register
val intr_enable_rd_full_qs, intr_enable_rd_full_wd, intr_enable_rd_full_we = Wire(Bool())
val intr_enable_op_done_qs, intr_enable_op_done_wd, intr_enable_op_done_we = Wire(Bool())
val intr_enable_op_error_qs, intr_enable_op_error_wd, intr_enable_op_error_we = Wire(Bool())
// INTR_TEST Register
val intr_test_rd_full_wd, intr_test_rd_full_we = Wire(Bool())
val intr_test_op_done_wd, intr_test_op_done_we = Wire(Bool())
val intr_test_op_error_wd, intr_test_op_error_we = Wire(Bool())
// CTRL_RREGWEN Register
val ctrl_regwe_qs, ctrl_regwe_re = Wire(Bool())
// CONTROL Register
val control_start_qs, control_start_wd, control_start_we = Wire(Bool())
val control_op_qs, control_op_wd = Wire(UInt(2.W))
val control_op_we = Wire(Bool())
val control_prog_sel_qs, control_prog_sel_wd, control_prog_sel_we = Wire(Bool())
val control_num_qs, control_num_wd = Wire(UInt(12.W))
val control_num_we = Wire(Bool())
// ADDR Register
val addr_qs, addr_wd = Wire(UInt(32.W))
val addr_we = Wire(Bool())
}