quasar/src/main/scala/lsu/lsu.scala

324 lines
20 KiB
Scala
Raw Normal View History

2020-09-04 14:51:29 +08:00
package lsu
2020-12-09 12:34:03 +08:00
2020-10-22 17:52:47 +08:00
import lib._
import chisel3._
import chisel3.util._
import include._
2020-12-09 12:34:03 +08:00
import mem._
2020-09-04 14:51:29 +08:00
2020-12-09 12:34:03 +08:00
class lsu extends Module with RequireAsyncReset with param with lib {
2020-10-22 17:52:47 +08:00
val io = IO (new Bundle {
val clk_override = Input(Bool())
2020-12-07 15:27:31 +08:00
val lsu_dma = new lsu_dma
val lsu_pic = new lsu_pic
val lsu_exu = new lsu_exu
val lsu_dec = new lsu_dec
2020-12-09 12:34:03 +08:00
val dccm = Flipped(new mem_lsu)
2020-12-07 15:27:31 +08:00
val lsu_tlu = new lsu_tlu
2020-12-09 12:34:03 +08:00
val axi = new axi_channels(LSU_BUS_TAG)
2020-12-07 15:27:31 +08:00
2020-10-22 17:52:47 +08:00
val dec_tlu_flush_lower_r = Input(Bool())
val dec_tlu_i0_kill_writeb_r = Input(Bool())
val dec_tlu_force_halt = Input(Bool())
2020-12-09 12:34:03 +08:00
2020-10-22 17:52:47 +08:00
val dec_tlu_core_ecc_disable = Input(Bool())
val dec_lsu_offset_d = Input(UInt(12.W))
2020-12-09 12:34:03 +08:00
val lsu_p = Flipped(Valid(new lsu_pkt_t()))
val trigger_pkt_any = Input(Vec(4, new trigger_pkt_t()))
2020-10-22 17:52:47 +08:00
val dec_lsu_valid_raw_d = Input(Bool())
val dec_tlu_mrac_ff = Input(UInt(32.W))
//Outputs
2020-11-18 18:42:14 +08:00
val lsu_result_m = Output(UInt(32.W))
val lsu_result_corr_r = Output(UInt(32.W))
2020-10-22 17:52:47 +08:00
val lsu_load_stall_any = Output(Bool())
val lsu_store_stall_any = Output(Bool())
val lsu_fastint_stall_any = Output(Bool())
val lsu_idle_any = Output(Bool())
2020-11-18 18:42:14 +08:00
val lsu_fir_addr = Output(UInt(31.W))
2020-10-22 17:52:47 +08:00
val lsu_fir_error = Output(UInt(2.W))
val lsu_single_ecc_error_incr = Output(Bool())
2020-12-09 12:34:03 +08:00
val lsu_error_pkt_r = Valid(new lsu_error_pkt_t())
2020-10-22 17:52:47 +08:00
val lsu_pmu_misaligned_m = Output(Bool())
val lsu_trigger_match_m = Output(UInt(4.W))
val lsu_bus_clk_en = Input(Bool())
val scan_mode = Input(Bool())
val free_clk = Input(Clock())
})
val dma_dccm_wdata = WireInit(0.U(64.W))
val dma_dccm_wdata_lo = WireInit(0.U(32.W))
val dma_dccm_wdata_hi = WireInit(0.U(32.W))
2020-11-18 18:42:14 +08:00
val dma_mem_tag_m = WireInit(0.U(3.W))
2020-10-22 17:52:47 +08:00
val lsu_raw_fwd_lo_r = WireInit(0.U(1.W))
val lsu_raw_fwd_hi_r = WireInit(0.U(1.W))
2020-12-09 12:34:03 +08:00
val lsu_lsc_ctl = Module(new lsu_lsc_ctl())
2020-11-18 18:42:14 +08:00
io.lsu_result_m := lsu_lsc_ctl.io.lsu_result_m
io.lsu_result_corr_r := lsu_lsc_ctl.io.lsu_result_corr_r
2020-12-09 12:34:03 +08:00
val dccm_ctl = Module(new lsu_dccm_ctl())
val stbuf = Module(new lsu_stbuf())
val ecc = Module(new lsu_ecc())
val trigger = Module(new lsu_trigger())
val clkdomain = Module(new lsu_clkdomain())
val bus_intf = Module(new lsu_bus_intf())
2020-10-22 17:52:47 +08:00
val lsu_raw_fwd_lo_m = stbuf.io.stbuf_fwdbyteen_lo_m.orR
val lsu_raw_fwd_hi_m = stbuf.io.stbuf_fwdbyteen_hi_m.orR
// block stores in decode - for either bus or stbuf reasons
io.lsu_store_stall_any := stbuf.io.lsu_stbuf_full_any | bus_intf.io.lsu_bus_buffer_full_any | dccm_ctl.io.ld_single_ecc_error_r_ff
io.lsu_load_stall_any := bus_intf.io.lsu_bus_buffer_full_any | dccm_ctl.io.ld_single_ecc_error_r_ff
io.lsu_fastint_stall_any := dccm_ctl.io.ld_single_ecc_error_r // Stall the fastint in decode-1 stage
// Ready to accept dma trxns
// There can't be any inpipe forwarding from non-dma packet to dma packet since they can be flushed so we can't have st in r when dma is in m
2020-12-07 15:27:31 +08:00
val dma_mem_tag_d = io.lsu_dma.dma_mem_tag
2020-11-23 17:53:08 +08:00
val ldst_nodma_mtor = lsu_lsc_ctl.io.lsu_pkt_m.valid & !lsu_lsc_ctl.io.lsu_pkt_m.bits.dma & (lsu_lsc_ctl.io.addr_in_dccm_m | lsu_lsc_ctl.io.addr_in_pic_m) & lsu_lsc_ctl.io.lsu_pkt_m.bits.store
2020-12-07 15:27:31 +08:00
io.lsu_dma.dccm_ready := !(io.dec_lsu_valid_raw_d | ldst_nodma_mtor | dccm_ctl.io.ld_single_ecc_error_r_ff)
val dma_dccm_wen = io.lsu_dma.dma_lsc_ctl.dma_dccm_req & io.lsu_dma.dma_lsc_ctl.dma_mem_write & lsu_lsc_ctl.io.addr_in_dccm_d
val dma_pic_wen = io.lsu_dma.dma_lsc_ctl.dma_dccm_req & io.lsu_dma.dma_lsc_ctl.dma_mem_write & lsu_lsc_ctl.io.addr_in_pic_d
dma_dccm_wdata := io.lsu_dma.dma_lsc_ctl.dma_mem_wdata >> Cat(io.lsu_dma.dma_lsc_ctl.dma_mem_addr(2,0), 0.U(3.W)) // Shift the dma data to lower bits to make it consistent to lsu stores
2020-10-22 17:52:47 +08:00
dma_dccm_wdata_hi := dma_dccm_wdata(63,32)
dma_dccm_wdata_lo := dma_dccm_wdata(31,0)
val flush_m_up = io.dec_tlu_flush_lower_r
val flush_r = io.dec_tlu_i0_kill_writeb_r
// lsu halt idle. This is used for entering the halt mode. Also, DMA accesses are allowed during fence.
// Indicates non-idle if there is a instruction valid in d-r or read/write buffers are non-empty since they can come with error
// Store buffer now have only non-dma dccm stores
// stbuf_empty not needed since it has only dccm stores
2020-11-23 17:53:08 +08:00
io.lsu_idle_any := !((lsu_lsc_ctl.io.lsu_pkt_m.valid & !lsu_lsc_ctl.io.lsu_pkt_m.bits.dma) | (lsu_lsc_ctl.io.lsu_pkt_r.valid & !lsu_lsc_ctl.io.lsu_pkt_r.bits.dma)) & bus_intf.io.lsu_bus_buffer_empty_any & bus_intf.io.lsu_bus_idle_any
2020-10-22 17:52:47 +08:00
// Instantiate the store buffer
2020-11-23 17:53:08 +08:00
val store_stbuf_reqvld_r = lsu_lsc_ctl.io.lsu_pkt_r.valid & lsu_lsc_ctl.io.lsu_pkt_r.bits.store & lsu_lsc_ctl.io.addr_in_dccm_r & !flush_r & !lsu_lsc_ctl.io.lsu_pkt_r.bits.dma
2020-10-22 17:52:47 +08:00
// Disable Forwarding for now
2020-11-23 17:53:08 +08:00
val lsu_cmpen_m = lsu_lsc_ctl.io.lsu_pkt_m.valid & (lsu_lsc_ctl.io.lsu_pkt_m.bits.load | lsu_lsc_ctl.io.lsu_pkt_m.bits.store) & (lsu_lsc_ctl.io.addr_in_dccm_m | lsu_lsc_ctl.io.addr_in_pic_m)
2020-10-22 17:52:47 +08:00
// Bus signals
2020-11-23 17:53:08 +08:00
val lsu_busreq_m = lsu_lsc_ctl.io.lsu_pkt_m.valid & ((lsu_lsc_ctl.io.lsu_pkt_m.bits.load | lsu_lsc_ctl.io.lsu_pkt_m.bits.store) & lsu_lsc_ctl.io.addr_external_m) & !flush_m_up & !lsu_lsc_ctl.io.lsu_exc_m & !lsu_lsc_ctl.io.lsu_pkt_m.bits.fast_int
2020-10-22 17:52:47 +08:00
// PMU signals
2020-11-23 17:53:08 +08:00
io.lsu_pmu_misaligned_m := lsu_lsc_ctl.io.lsu_pkt_m.valid & ((lsu_lsc_ctl.io.lsu_pkt_m.bits.half & lsu_lsc_ctl.io.lsu_addr_m(0)) | (lsu_lsc_ctl.io.lsu_pkt_m.bits.word & lsu_lsc_ctl.io.lsu_addr_m(1,0).orR))
2020-12-07 15:27:31 +08:00
io.lsu_tlu.lsu_pmu_load_external_m := lsu_lsc_ctl.io.lsu_pkt_m.valid & lsu_lsc_ctl.io.lsu_pkt_m.bits.load & lsu_lsc_ctl.io.addr_external_m
io.lsu_tlu.lsu_pmu_store_external_m := lsu_lsc_ctl.io.lsu_pkt_m.valid & lsu_lsc_ctl.io.lsu_pkt_m.bits.store & lsu_lsc_ctl.io.addr_external_m
2020-10-22 17:52:47 +08:00
//LSU_LSC_Control
//Inputs
lsu_lsc_ctl.io.lsu_c1_m_clk := clkdomain.io.lsu_c1_m_clk
lsu_lsc_ctl.io.lsu_c1_r_clk := clkdomain.io.lsu_c1_r_clk
lsu_lsc_ctl.io.lsu_c2_m_clk := clkdomain.io.lsu_c2_m_clk
lsu_lsc_ctl.io.lsu_c2_r_clk := clkdomain.io.lsu_c2_r_clk
lsu_lsc_ctl.io.lsu_store_c1_m_clk := clkdomain.io.lsu_store_c1_m_clk
lsu_lsc_ctl.io.lsu_ld_data_r := dccm_ctl.io.lsu_ld_data_r
lsu_lsc_ctl.io.lsu_ld_data_corr_r := dccm_ctl.io.lsu_ld_data_corr_r
lsu_lsc_ctl.io.lsu_single_ecc_error_r := ecc.io.lsu_single_ecc_error_r
lsu_lsc_ctl.io.lsu_double_ecc_error_r := ecc.io.lsu_double_ecc_error_r
lsu_lsc_ctl.io.lsu_ld_data_m := dccm_ctl.io.lsu_ld_data_m
lsu_lsc_ctl.io.lsu_single_ecc_error_m := ecc.io.lsu_single_ecc_error_m
lsu_lsc_ctl.io.lsu_double_ecc_error_m := ecc.io.lsu_double_ecc_error_m
lsu_lsc_ctl.io.flush_m_up := flush_m_up
lsu_lsc_ctl.io.flush_r := flush_r
2020-12-07 15:27:31 +08:00
lsu_lsc_ctl.io.lsu_exu <> io.lsu_exu
2020-11-23 17:53:08 +08:00
lsu_lsc_ctl.io.lsu_p <> io.lsu_p
2020-10-22 17:52:47 +08:00
lsu_lsc_ctl.io.dec_lsu_valid_raw_d := io.dec_lsu_valid_raw_d
lsu_lsc_ctl.io.dec_lsu_offset_d := io.dec_lsu_offset_d
lsu_lsc_ctl.io.picm_mask_data_m := dccm_ctl.io.picm_mask_data_m
lsu_lsc_ctl.io.bus_read_data_m := bus_intf.io.bus_read_data_m
2020-12-07 15:27:31 +08:00
lsu_lsc_ctl.io.dma_lsc_ctl <> io.lsu_dma.dma_lsc_ctl
2020-10-22 17:52:47 +08:00
lsu_lsc_ctl.io.dec_tlu_mrac_ff := io.dec_tlu_mrac_ff
lsu_lsc_ctl.io.scan_mode := io.scan_mode
//Outputs
io.lsu_single_ecc_error_incr := lsu_lsc_ctl.io.lsu_single_ecc_error_incr
2020-11-23 17:53:08 +08:00
io.lsu_error_pkt_r <> lsu_lsc_ctl.io.lsu_error_pkt_r
io.lsu_fir_addr <> lsu_lsc_ctl.io.lsu_fir_addr
io.lsu_fir_error <> lsu_lsc_ctl.io.lsu_fir_error
2020-10-22 17:52:47 +08:00
// DCCM Control
//Inputs
dccm_ctl.io.lsu_c2_m_clk := clkdomain.io.lsu_c2_m_clk
2020-11-30 13:21:58 +08:00
dccm_ctl.io.lsu_c2_r_clk := clkdomain.io.lsu_c2_r_clk
dccm_ctl.io.lsu_free_c2_clk := clkdomain.io.lsu_free_c2_clk
dccm_ctl.io.lsu_c1_r_clk := clkdomain.io.lsu_c1_r_clk
2020-11-27 19:33:17 +08:00
dccm_ctl.io.lsu_store_c1_r_clk := clkdomain.io.lsu_store_c1_r_clk
2020-11-23 17:53:08 +08:00
dccm_ctl.io.lsu_pkt_d <> lsu_lsc_ctl.io.lsu_pkt_d
dccm_ctl.io.lsu_pkt_m <> lsu_lsc_ctl.io.lsu_pkt_m
dccm_ctl.io.lsu_pkt_r <> lsu_lsc_ctl.io.lsu_pkt_r
2020-10-22 17:52:47 +08:00
dccm_ctl.io.addr_in_dccm_d := lsu_lsc_ctl.io.addr_in_dccm_d
dccm_ctl.io.addr_in_dccm_m := lsu_lsc_ctl.io.addr_in_dccm_m
dccm_ctl.io.addr_in_dccm_r := lsu_lsc_ctl.io.addr_in_dccm_r
dccm_ctl.io.addr_in_pic_d := lsu_lsc_ctl.io.addr_in_pic_d
dccm_ctl.io.addr_in_pic_m := lsu_lsc_ctl.io.addr_in_pic_m
dccm_ctl.io.addr_in_pic_r := lsu_lsc_ctl.io.addr_in_pic_r
dccm_ctl.io.lsu_raw_fwd_lo_r := lsu_raw_fwd_lo_r
dccm_ctl.io.lsu_raw_fwd_hi_r := lsu_raw_fwd_hi_r
dccm_ctl.io.lsu_commit_r := lsu_lsc_ctl.io.lsu_commit_r
dccm_ctl.io.lsu_addr_d := lsu_lsc_ctl.io.lsu_addr_d
dccm_ctl.io.lsu_addr_m := lsu_lsc_ctl.io.lsu_addr_m
dccm_ctl.io.lsu_addr_r := lsu_lsc_ctl.io.lsu_addr_r
dccm_ctl.io.end_addr_d := lsu_lsc_ctl.io.end_addr_d
dccm_ctl.io.end_addr_m := lsu_lsc_ctl.io.end_addr_m
dccm_ctl.io.end_addr_r := lsu_lsc_ctl.io.end_addr_r
dccm_ctl.io.stbuf_reqvld_any := stbuf.io.stbuf_reqvld_any
dccm_ctl.io.stbuf_addr_any := stbuf.io.stbuf_addr_any
dccm_ctl.io.stbuf_data_any := stbuf.io.stbuf_data_any
dccm_ctl.io.stbuf_ecc_any := ecc.io.stbuf_ecc_any
dccm_ctl.io.stbuf_fwddata_hi_m := stbuf.io.stbuf_fwddata_hi_m
dccm_ctl.io.stbuf_fwddata_lo_m := stbuf.io.stbuf_fwddata_lo_m
dccm_ctl.io.stbuf_fwdbyteen_lo_m := stbuf.io.stbuf_fwdbyteen_lo_m
dccm_ctl.io.stbuf_fwdbyteen_hi_m := stbuf.io.stbuf_fwdbyteen_hi_m
dccm_ctl.io.lsu_double_ecc_error_r := ecc.io.lsu_double_ecc_error_r
dccm_ctl.io.single_ecc_error_hi_r := ecc.io.single_ecc_error_hi_r
dccm_ctl.io.single_ecc_error_lo_r := ecc.io.single_ecc_error_lo_r
dccm_ctl.io.sec_data_hi_r := ecc.io.sec_data_hi_r
dccm_ctl.io.sec_data_lo_r := ecc.io.sec_data_lo_r
dccm_ctl.io.sec_data_hi_r_ff := ecc.io.sec_data_hi_r_ff
dccm_ctl.io.sec_data_lo_r_ff := ecc.io.sec_data_lo_r_ff
dccm_ctl.io.sec_data_ecc_hi_r_ff := ecc.io.sec_data_ecc_hi_r_ff
dccm_ctl.io.sec_data_ecc_lo_r_ff := ecc.io.sec_data_ecc_lo_r_ff
dccm_ctl.io.lsu_double_ecc_error_m := ecc.io.lsu_double_ecc_error_m
dccm_ctl.io.sec_data_hi_m := ecc.io.sec_data_hi_m
dccm_ctl.io.sec_data_lo_m := ecc.io.sec_data_lo_m
dccm_ctl.io.store_data_m := lsu_lsc_ctl.io.store_data_m
dccm_ctl.io.dma_dccm_wen := dma_dccm_wen
dccm_ctl.io.dma_pic_wen := dma_pic_wen
dccm_ctl.io.dma_mem_tag_m := dma_mem_tag_m
dccm_ctl.io.dma_dccm_wdata_lo := dma_dccm_wdata_lo
dccm_ctl.io.dma_dccm_wdata_hi := dma_dccm_wdata_hi
dccm_ctl.io.dma_dccm_wdata_ecc_hi := ecc.io.dma_dccm_wdata_ecc_hi
dccm_ctl.io.dma_dccm_wdata_ecc_lo := ecc.io.dma_dccm_wdata_ecc_lo
dccm_ctl.io.scan_mode := io.scan_mode
//Outputs
2020-12-07 15:27:31 +08:00
io.lsu_dma.dma_dccm_ctl <> dccm_ctl.io.dma_dccm_ctl
2020-12-09 12:34:03 +08:00
io.dccm <> dccm_ctl.io.dccm
2020-12-07 15:27:31 +08:00
io.lsu_pic <> dccm_ctl.io.lsu_pic
2020-10-22 17:52:47 +08:00
//Store Buffer
//Inputs
stbuf.io.lsu_c1_m_clk := clkdomain.io.lsu_c1_m_clk
2020-12-16 13:39:45 +08:00
stbuf.io.lsu_c1_r_clk := clkdomain.io.lsu_c1_r_clk
2020-10-22 17:52:47 +08:00
stbuf.io.lsu_stbuf_c1_clk := clkdomain.io.lsu_stbuf_c1_clk
stbuf.io.lsu_free_c2_clk := clkdomain.io.lsu_free_c2_clk
2020-11-23 17:53:08 +08:00
stbuf.io.lsu_pkt_m <> lsu_lsc_ctl.io.lsu_pkt_m
stbuf.io.lsu_pkt_r <> lsu_lsc_ctl.io.lsu_pkt_r
2020-10-22 17:52:47 +08:00
stbuf.io.store_stbuf_reqvld_r := store_stbuf_reqvld_r
stbuf.io.lsu_commit_r := lsu_lsc_ctl.io.lsu_commit_r
stbuf.io.dec_lsu_valid_raw_d := io.dec_lsu_valid_raw_d
stbuf.io.store_data_hi_r := dccm_ctl.io.store_data_hi_r
stbuf.io.store_data_lo_r := dccm_ctl.io.store_data_lo_r
stbuf.io.store_datafn_hi_r := dccm_ctl.io.store_datafn_hi_r
stbuf.io.store_datafn_lo_r := dccm_ctl.io.store_datafn_lo_r
stbuf.io.lsu_stbuf_commit_any := dccm_ctl.io.lsu_stbuf_commit_any
stbuf.io.lsu_addr_d := lsu_lsc_ctl.io.lsu_addr_d
stbuf.io.lsu_addr_m := lsu_lsc_ctl.io.lsu_addr_m
stbuf.io.lsu_addr_r := lsu_lsc_ctl.io.lsu_addr_r
stbuf.io.end_addr_d := lsu_lsc_ctl.io.end_addr_d
stbuf.io.end_addr_m := lsu_lsc_ctl.io.end_addr_m
stbuf.io.end_addr_r := lsu_lsc_ctl.io.end_addr_r
stbuf.io.addr_in_dccm_m := lsu_lsc_ctl.io.addr_in_dccm_m
stbuf.io.addr_in_dccm_r := lsu_lsc_ctl.io.addr_in_dccm_r
stbuf.io.lsu_cmpen_m := lsu_cmpen_m
stbuf.io.scan_mode := io.scan_mode
// ECC
//Inputs
ecc.io.lsu_c2_r_clk := clkdomain.io.lsu_c2_r_clk
2020-11-23 17:53:08 +08:00
ecc.io.lsu_pkt_m <> lsu_lsc_ctl.io.lsu_pkt_m
ecc.io.lsu_pkt_r <> lsu_lsc_ctl.io.lsu_pkt_r
2020-10-22 17:52:47 +08:00
ecc.io.stbuf_data_any := stbuf.io.stbuf_data_any
ecc.io.dec_tlu_core_ecc_disable := io.dec_tlu_core_ecc_disable
ecc.io.lsu_dccm_rden_r := dccm_ctl.io.lsu_dccm_rden_r
ecc.io.addr_in_dccm_r := lsu_lsc_ctl.io.addr_in_dccm_r
ecc.io.lsu_addr_r := lsu_lsc_ctl.io.lsu_addr_r
ecc.io.end_addr_r := lsu_lsc_ctl.io.end_addr_r
ecc.io.lsu_addr_m := lsu_lsc_ctl.io.lsu_addr_m
ecc.io.end_addr_m := lsu_lsc_ctl.io.end_addr_m
ecc.io.dccm_rdata_hi_r := dccm_ctl.io.dccm_rdata_hi_r
ecc.io.dccm_rdata_lo_r := dccm_ctl.io.dccm_rdata_lo_r
ecc.io.dccm_rdata_hi_m := dccm_ctl.io.dccm_rdata_hi_m
ecc.io.dccm_rdata_lo_m := dccm_ctl.io.dccm_rdata_lo_m
ecc.io.dccm_data_ecc_hi_r := dccm_ctl.io.dccm_data_ecc_hi_r
ecc.io.dccm_data_ecc_lo_r := dccm_ctl.io.dccm_data_ecc_lo_r
ecc.io.dccm_data_ecc_hi_m := dccm_ctl.io.dccm_data_ecc_hi_m
ecc.io.dccm_data_ecc_lo_m := dccm_ctl.io.dccm_data_ecc_lo_m
ecc.io.ld_single_ecc_error_r := dccm_ctl.io.ld_single_ecc_error_r
ecc.io.ld_single_ecc_error_r_ff := dccm_ctl.io.ld_single_ecc_error_r_ff
ecc.io.lsu_dccm_rden_m := dccm_ctl.io.lsu_dccm_rden_m
ecc.io.addr_in_dccm_m := lsu_lsc_ctl.io.addr_in_dccm_m
ecc.io.dma_dccm_wen := dma_dccm_wen
ecc.io.dma_dccm_wdata_lo := dma_dccm_wdata_lo
ecc.io.dma_dccm_wdata_hi := dma_dccm_wdata_hi
ecc.io.scan_mode := io.scan_mode
//Trigger
//Inputs
2020-11-23 17:53:08 +08:00
trigger.io.trigger_pkt_any <> io.trigger_pkt_any
trigger.io.lsu_pkt_m <> lsu_lsc_ctl.io.lsu_pkt_m
2020-10-22 17:52:47 +08:00
trigger.io.lsu_addr_m := lsu_lsc_ctl.io.lsu_addr_m
trigger.io.store_data_m := lsu_lsc_ctl.io.store_data_m
//Outputs
io.lsu_trigger_match_m :=trigger.io.lsu_trigger_match_m
//Clock Domain
//Inputs
clkdomain.io.free_clk := io.free_clk
clkdomain.io.clk_override := io.clk_override
clkdomain.io.addr_in_dccm_m := lsu_lsc_ctl.io.addr_in_dccm_m
2020-12-07 15:27:31 +08:00
clkdomain.io.dma_dccm_req := io.lsu_dma.dma_lsc_ctl.dma_dccm_req
2020-10-22 17:52:47 +08:00
clkdomain.io.ldst_stbuf_reqvld_r := stbuf.io.ldst_stbuf_reqvld_r
clkdomain.io.stbuf_reqvld_any := stbuf.io.stbuf_reqvld_any
clkdomain.io.stbuf_reqvld_flushed_any := stbuf.io.stbuf_reqvld_flushed_any
clkdomain.io.lsu_busreq_r := bus_intf.io.lsu_busreq_r
clkdomain.io.lsu_bus_buffer_pend_any := bus_intf.io.lsu_bus_buffer_pend_any
clkdomain.io.lsu_bus_buffer_empty_any := bus_intf.io.lsu_bus_buffer_empty_any
clkdomain.io.lsu_stbuf_empty_any := stbuf.io.lsu_stbuf_empty_any
clkdomain.io.lsu_bus_clk_en := io.lsu_bus_clk_en
clkdomain.io.lsu_p := io.lsu_p
2020-11-23 17:53:08 +08:00
clkdomain.io.lsu_pkt_d <> lsu_lsc_ctl.io.lsu_pkt_d
clkdomain.io.lsu_pkt_m <> lsu_lsc_ctl.io.lsu_pkt_m
clkdomain.io.lsu_pkt_r <> lsu_lsc_ctl.io.lsu_pkt_r
2020-10-22 17:52:47 +08:00
clkdomain.io.scan_mode := io.scan_mode
//Bus Interface
//Inputs
bus_intf.io.scan_mode := io.scan_mode
2020-12-07 15:27:31 +08:00
io.lsu_dec.tlu_busbuff <> bus_intf.io.tlu_busbuff
2020-10-22 17:52:47 +08:00
bus_intf.io.lsu_c1_m_clk := clkdomain.io.lsu_c1_m_clk
bus_intf.io.lsu_c1_r_clk := clkdomain.io.lsu_c1_r_clk
bus_intf.io.lsu_c2_r_clk := clkdomain.io.lsu_c2_r_clk
bus_intf.io.lsu_bus_ibuf_c1_clk := clkdomain.io.lsu_bus_ibuf_c1_clk
bus_intf.io.lsu_bus_obuf_c1_clk := clkdomain.io.lsu_bus_obuf_c1_clk
bus_intf.io.lsu_bus_buf_c1_clk := clkdomain.io.lsu_bus_buf_c1_clk
bus_intf.io.lsu_free_c2_clk := clkdomain.io.lsu_free_c2_clk
bus_intf.io.free_clk := io.free_clk
bus_intf.io.lsu_busm_clk := clkdomain.io.lsu_busm_clk
bus_intf.io.dec_lsu_valid_raw_d := io.dec_lsu_valid_raw_d
bus_intf.io.lsu_busreq_m := lsu_busreq_m
bus_intf.io.lsu_addr_d := lsu_lsc_ctl.io.lsu_addr_d
bus_intf.io.lsu_addr_m := lsu_lsc_ctl.io.lsu_addr_m
bus_intf.io.lsu_addr_r := lsu_lsc_ctl.io.lsu_addr_r
bus_intf.io.end_addr_d := lsu_lsc_ctl.io.end_addr_d
bus_intf.io.end_addr_m := lsu_lsc_ctl.io.end_addr_m
bus_intf.io.end_addr_r := lsu_lsc_ctl.io.end_addr_r
2020-11-18 18:42:14 +08:00
bus_intf.io.store_data_r := dccm_ctl.io.store_data_r
bus_intf.io.lsu_pkt_m <> lsu_lsc_ctl.io.lsu_pkt_m
bus_intf.io.lsu_pkt_r <> lsu_lsc_ctl.io.lsu_pkt_r
2020-10-22 17:52:47 +08:00
bus_intf.io.dec_tlu_force_halt := io.dec_tlu_force_halt
bus_intf.io.lsu_commit_r := lsu_lsc_ctl.io.lsu_commit_r
bus_intf.io.is_sideeffects_m := lsu_lsc_ctl.io.is_sideeffects_m
bus_intf.io.flush_m_up := flush_m_up
bus_intf.io.flush_r := flush_r
//Outputs
2020-12-07 15:27:31 +08:00
io.lsu_dec.dctl_busbuff <> bus_intf.io.dctl_busbuff
io.axi <> bus_intf.io.axi
2020-10-22 17:52:47 +08:00
bus_intf.io.lsu_bus_clk_en := io.lsu_bus_clk_en
withClock(clkdomain.io.lsu_c1_m_clk){dma_mem_tag_m := RegNext(dma_mem_tag_d,0.U)}
withClock(clkdomain.io.lsu_c2_r_clk){lsu_raw_fwd_hi_r := RegNext(lsu_raw_fwd_hi_m,0.U)}
withClock(clkdomain.io.lsu_c2_r_clk){lsu_raw_fwd_lo_r := RegNext(lsu_raw_fwd_lo_m,0.U)}
}
2020-12-09 12:34:03 +08:00
object lsu_top extends App {
println((new chisel3.stage.ChiselStage).emitVerilog(new lsu()))
}