axi to ahb update
This commit is contained in:
parent
ea912f6dee
commit
cd13b88467
|
@ -21,7 +21,9 @@
|
|||
"class":"firrtl.transforms.CombinationalPath",
|
||||
"sink":"~axi4_to_ahb|axi4_to_ahb>io_axi_wready",
|
||||
"sources":[
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_arvalid"
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_arvalid",
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_bready",
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_rready"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -33,13 +35,6 @@
|
|||
"~axi4_to_ahb|axi4_to_ahb>io_axi_rready"
|
||||
]
|
||||
},
|
||||
{
|
||||
"class":"firrtl.transforms.CombinationalPath",
|
||||
"sink":"~axi4_to_ahb|axi4_to_ahb>io_axi_awready",
|
||||
"sources":[
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_arvalid"
|
||||
]
|
||||
},
|
||||
{
|
||||
"class":"firrtl.transforms.CombinationalPath",
|
||||
"sink":"~axi4_to_ahb|axi4_to_ahb>io_ahb_haddr",
|
||||
|
@ -60,6 +55,24 @@
|
|||
"~axi4_to_ahb|axi4_to_ahb>io_axi_rready"
|
||||
]
|
||||
},
|
||||
{
|
||||
"class":"firrtl.transforms.CombinationalPath",
|
||||
"sink":"~axi4_to_ahb|axi4_to_ahb>io_axi_awready",
|
||||
"sources":[
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_arvalid",
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_bready",
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_rready"
|
||||
]
|
||||
},
|
||||
{
|
||||
"class":"firrtl.transforms.CombinationalPath",
|
||||
"sink":"~axi4_to_ahb|axi4_to_ahb>io_axi_arready",
|
||||
"sources":[
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_arvalid",
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_bready",
|
||||
"~axi4_to_ahb|axi4_to_ahb>io_axi_rready"
|
||||
]
|
||||
},
|
||||
{
|
||||
"class":"firrtl.transforms.CombinationalPath",
|
||||
"sink":"~axi4_to_ahb|axi4_to_ahb>io_axi_rvalid",
|
||||
|
|
1864
axi4_to_ahb.fir
1864
axi4_to_ahb.fir
File diff suppressed because it is too large
Load Diff
919
axi4_to_ahb.v
919
axi4_to_ahb.v
File diff suppressed because it is too large
Load Diff
|
@ -57,9 +57,17 @@ class axi4_to_ahb_IO extends Bundle with Config {
|
|||
|
||||
class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config {
|
||||
val io = IO(new axi4_to_ahb_IO)
|
||||
val buf_rst = WireInit(Bool(), init = false.B)
|
||||
val buf_state_en = WireInit(Bool(), init = false.B)
|
||||
val ahbm_clk = Wire(Clock())
|
||||
val ahbm_addr_clk = Wire(Clock())
|
||||
val ahbm_data_clk = Wire(Clock())
|
||||
val idle :: cmd_rd :: cmd_wr :: data_rd :: data_wr :: done :: stream_rd :: stream_err_rd :: Nil = Enum(8)
|
||||
val buf_state = WireInit(idle)
|
||||
val buf_nxtstate = WireInit(idle)
|
||||
buf_state := withClock(ahbm_clk) {
|
||||
RegNext(Mux(buf_state_en.asBool(),buf_nxtstate,buf_state) & !buf_rst, 0.U)
|
||||
}
|
||||
//logic signals
|
||||
val slave_valid = WireInit(Bool(), init = false.B)
|
||||
val slave_ready = WireInit(Bool(), init = false.B)
|
||||
|
@ -99,7 +107,7 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
val buf_data = WireInit(0.U(64.W)) // [63:0]
|
||||
val buf_tag = WireInit(0.U(TAG.W)) // [TAG-1:0]
|
||||
//Miscellaneous signals
|
||||
val buf_rst = WireInit(Bool(), init = false.B)
|
||||
// val buf_rst = WireInit(Bool(), init = false.B)
|
||||
val buf_tag_in = WireInit(0.U(TAG.W)) // [TAG-1:0]
|
||||
val buf_addr_in = WireInit(0.U(32.W)) // [31:0]
|
||||
val buf_byteen_in = WireInit(0.U(8.W)) // [7:0]
|
||||
|
@ -108,7 +116,7 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
val buf_aligned_in = WireInit(Bool(), init = false.B)
|
||||
val buf_size_in = WireInit(0.U(3.W)) // [2:0]
|
||||
|
||||
val buf_state_en = WireInit(Bool(), init = false.B)
|
||||
// val buf_state_en = WireInit(Bool(), init = false.B)
|
||||
val buf_wr_en = WireInit(Bool(), init = false.B)
|
||||
val buf_data_wr_en = WireInit(Bool(), init = false.B)
|
||||
val slvbuf_error_en = WireInit(Bool(), init = false.B)
|
||||
|
@ -149,9 +157,9 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
val ahbm_data_clken = WireInit(Bool(), init = false.B)
|
||||
val buf_clk = Wire(Clock())
|
||||
//val slvbuf_clk = Wire(Clock())
|
||||
val ahbm_clk = Wire(Clock())
|
||||
val ahbm_addr_clk = Wire(Clock())
|
||||
val ahbm_data_clk = Wire(Clock())
|
||||
// val ahbm_clk = Wire(Clock())
|
||||
// val ahbm_addr_clk = Wire(Clock())
|
||||
// val ahbm_data_clk = Wire(Clock())
|
||||
|
||||
def get_write_size(byteen: UInt) = {
|
||||
|
||||
|
@ -217,10 +225,10 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
|
||||
//State machine
|
||||
io.ahb_htrans := 0.U
|
||||
//master_ready := 0.U
|
||||
master_ready := 1.U
|
||||
buf_state_en := false.B
|
||||
buf_nxtstate := idle
|
||||
buf_wr_en := 0.U
|
||||
//buf_wr_en := 0.U
|
||||
buf_data_wr_en := 0.U
|
||||
slvbuf_error_in := 0.U
|
||||
slvbuf_error_en := 0.U
|
||||
|
@ -236,11 +244,11 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
|
||||
switch(buf_state) {
|
||||
is(idle) {
|
||||
val master_ready = 1.U
|
||||
// master_ready := 1.U
|
||||
buf_write_in := (master_opc(2, 1) === "b01".U)
|
||||
val buf_nxtstate = Mux(buf_write_in.asBool(), cmd_wr, cmd_rd)
|
||||
buf_state_en := master_valid & master_ready
|
||||
buf_wr_en := buf_state_en
|
||||
buf_nxtstate := Mux(buf_write_in.asBool(), cmd_wr, cmd_rd)
|
||||
buf_state_en := master_valid & 1.U
|
||||
// buf_wr_en := buf_state_en
|
||||
buf_data_wr_en := buf_state_en & (buf_nxtstate === cmd_wr)
|
||||
buf_cmd_byte_ptr_en := buf_state_en
|
||||
// ---------------------FROM FUNCTION CHECK LATER
|
||||
|
@ -251,21 +259,21 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
}
|
||||
|
||||
is(cmd_rd) {
|
||||
val buf_nxtstate = Mux((master_valid & (master_opc(2, 0) === "b000".U)).asBool(), stream_rd, data_rd)
|
||||
buf_nxtstate := Mux((master_valid & (master_opc(2, 0) === "b000".U)).asBool(), stream_rd, data_rd)
|
||||
buf_state_en := ahb_hready_q & (ahb_htrans_q(1, 0) =/= "b0".U) & !ahb_hwrite_q
|
||||
cmd_done := buf_state_en & !master_valid
|
||||
slvbuf_wr_en := buf_state_en
|
||||
val master_ready = (ahb_hready_q & (ahb_htrans_q(1, 0) =/= "b0".U) & !ahb_hwrite_q) & (buf_nxtstate === stream_rd) ////////////TBD////////
|
||||
buf_wr_en := master_ready
|
||||
master_ready := (ahb_hready_q & (ahb_htrans_q(1, 0) =/= "b0".U) & !ahb_hwrite_q) & (Mux((master_valid & (master_opc(2, 0) === "b000".U)).asBool(), stream_rd, data_rd) === stream_rd) ////////////TBD////////
|
||||
// buf_wr_en := master_ready
|
||||
bypass_en := master_ready & master_valid
|
||||
buf_cmd_byte_ptr := Mux(bypass_en.asBool(), master_addr(2, 0), buf_addr(2, 0))
|
||||
io.ahb_htrans := "b10".U & (Fill(2, (!buf_state_en | bypass_en)))
|
||||
}
|
||||
|
||||
is(stream_rd) {
|
||||
val master_ready = (ahb_hready_q & !ahb_hresp_q) & !(master_valid & master_opc(2, 1) === "b01".U)
|
||||
buf_wr_en := (master_valid & master_ready & (master_opc(2, 0) === "b000".U)) // update the fifo if we are streaming the read commands
|
||||
val buf_nxtstate = Mux(ahb_hresp_q.asBool(), stream_err_rd, Mux(buf_wr_en.asBool(), stream_rd, data_rd)) // assuming that the master accpets the slave response right away.
|
||||
master_ready := (ahb_hready_q & !ahb_hresp_q) & !(master_valid & master_opc(2, 1) === "b01".U)
|
||||
// buf_wr_en := (master_valid & master_ready & (master_opc(2, 0) === "b000".U)) // update the fifo if we are streaming the read commands
|
||||
buf_nxtstate := Mux(ahb_hresp_q.asBool(), stream_err_rd, Mux((master_valid & master_ready & (master_opc(2, 0) === "b000".U)).asBool(), stream_rd, data_rd)) // assuming that the master accpets the slave response right away.
|
||||
buf_state_en := (ahb_hready_q | ahb_hresp_q)
|
||||
buf_data_wr_en := buf_state_en
|
||||
slvbuf_error_in := ahb_hresp_q
|
||||
|
@ -275,7 +283,7 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
bypass_en := master_ready & master_valid & (buf_nxtstate === stream_rd) & buf_state_en
|
||||
buf_cmd_byte_ptr := Mux(bypass_en.asBool(), master_addr(2, 0), buf_addr(2, 0))
|
||||
io.ahb_htrans := "b10".U & Fill(2, (!((buf_nxtstate =/= stream_rd) & buf_state_en)))
|
||||
slvbuf_wr_en := buf_wr_en // shifting the contents from the buf to slv_buf for streaming cases
|
||||
slvbuf_wr_en := (master_valid & master_ready & (master_opc(2, 0) === "b000".U)) // shifting the contents from the buf to slv_buf for streaming cases
|
||||
}
|
||||
|
||||
is(stream_err_rd) {
|
||||
|
@ -309,7 +317,7 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
|
||||
is(data_wr) {
|
||||
buf_state_en := (cmd_doneQ & ahb_hready_q) | ahb_hresp_q
|
||||
val master_ready = ((cmd_doneQ & ahb_hready_q) | ahb_hresp_q) & !ahb_hresp_q & slave_ready //////////TBD///////// // Ready to accept new command if current command done and no error
|
||||
master_ready := ((cmd_doneQ & ahb_hready_q) | ahb_hresp_q) & !ahb_hresp_q & slave_ready //////////TBD///////// // Ready to accept new command if current command done and no error
|
||||
buf_nxtstate := Mux((ahb_hresp_q | !slave_ready).asBool(), done, Mux((master_valid & master_ready).asBool(), Mux((master_opc(2, 1) === "b01".U), cmd_wr, cmd_rd), idle))
|
||||
slvbuf_error_in := ahb_hresp_q
|
||||
slvbuf_error_en := buf_state_en
|
||||
|
@ -389,9 +397,9 @@ class axi4_to_ahb extends Module with el2_lib with RequireAsyncReset with Config
|
|||
RegEnable(io.ahb_haddr(31, 0), 0.U, last_addr_en.asBool())
|
||||
}
|
||||
//sc
|
||||
buf_state := withClock(ahbm_clk) {
|
||||
RegNext(Mux(buf_state_en.asBool(),buf_nxtstate,buf_state) & !buf_rst, 0.U)
|
||||
}
|
||||
// buf_state := withClock(ahbm_clk) {
|
||||
// RegNext(Mux(buf_state_en.asBool(),buf_nxtstate,buf_state) & !buf_rst, 0.U)
|
||||
// }
|
||||
//s
|
||||
buf_write := withClock(buf_clk) {
|
||||
RegEnable(buf_write_in, 0.U, buf_wr_en.asBool())
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue