punk@1: punk@1: import Trace::*; punk@1: punk@1: //---------------------------------------------------------------------- punk@1: // Basic memory requests and responses punk@1: //---------------------------------------------------------------------- punk@1: punk@1: typedef union tagged punk@1: { punk@1: struct { Bit#(addrSz) addr; Bit#(tagSz) tag; } LoadReq; punk@1: struct { Bit#(addrSz) addr; Bit#(tagSz) tag; Bit#(dataSz) data; } StoreReq; punk@1: } punk@1: MemReq#( type addrSz, type tagSz, type dataSz ) punk@1: deriving(Eq,Bits); punk@1: punk@1: typedef union tagged punk@1: { punk@1: struct { Bit#(tagSz) tag; Bit#(dataSz) data; } LoadResp; punk@1: struct { Bit#(tagSz) tag; } StoreResp; punk@1: } punk@1: MemResp#( type tagSz, type dataSz ) punk@1: deriving(Eq,Bits); punk@1: punk@1: //---------------------------------------------------------------------- punk@1: // Specialized req/resp for inst/data/host punk@1: //---------------------------------------------------------------------- punk@1: punk@1: typedef 32 AddrSz; punk@1: typedef 08 TagSz; punk@1: typedef 32 DataSz; punk@1: typedef 32 InstSz; punk@1: typedef 32 HostDataSz; punk@1: punk@1: typedef MemReq#(AddrSz,TagSz,0) InstReq; punk@1: typedef MemResp#(TagSz,InstSz) InstResp; punk@1: punk@1: typedef MemReq#(AddrSz,TagSz,DataSz) DataReq; punk@1: typedef MemResp#(TagSz,DataSz) DataResp; punk@1: punk@1: typedef MemReq#(AddrSz,TagSz,HostDataSz) HostReq; punk@1: typedef MemResp#(TagSz,HostDataSz) HostResp; punk@1: punk@1: //---------------------------------------------------------------------- punk@1: // Specialized req/resp for main memory punk@1: //---------------------------------------------------------------------- punk@1: punk@1: typedef 32 MainMemAddrSz; punk@1: typedef 08 MainMemTagSz; punk@1: typedef 32 MainMemDataSz; punk@1: punk@1: typedef MemReq#(MainMemAddrSz,MainMemTagSz,MainMemDataSz) MainMemReq; punk@1: typedef MemResp#(MainMemTagSz,MainMemDataSz) MainMemResp; punk@1: punk@1: //---------------------------------------------------------------------- punk@1: // Tracing Functions punk@1: //---------------------------------------------------------------------- punk@1: punk@1: instance Traceable#(MemReq#(a,b,c)); punk@1: punk@1: function Action traceTiny( String loc, String ttag, MemReq#(a,b,c) req ); punk@1: case ( req ) matches punk@1: tagged LoadReq .ld : $fdisplay(stderr, " => %s:%s l%2x", loc, ttag, ld.tag ); punk@1: tagged StoreReq .st : $fdisplay(stderr, " => %s:%s s%2x", loc, ttag, st.tag ); punk@1: endcase punk@1: endfunction punk@1: punk@1: function Action traceFull( String loc, String ttag, MemReq#(a,b,c) req ); punk@1: case ( req ) matches punk@1: tagged LoadReq .ld : $fdisplay(stderr, " => %s:%s Ld { addr=%x, tag=%x }", loc, ttag, ld.addr, ld.tag ); punk@1: tagged StoreReq .st : $fdisplay(stderr, " => %s:%s St { addr=%x, tag=%x, data=%x }", loc, ttag, st.addr, st.tag, st.data ); punk@1: endcase punk@1: endfunction punk@1: punk@1: endinstance punk@1: punk@1: instance Traceable#(MemResp#(a,b)); punk@1: punk@1: function Action traceTiny( String loc, String ttag, MemResp#(a,b) resp ); punk@1: case ( resp ) matches punk@1: tagged LoadResp .ld : $fdisplay(stderr, " => %s:%s l%2x", loc, ttag, ld.tag ); punk@1: tagged StoreResp .st : $fdisplay(stderr, " => %s:%s s%2x", loc, ttag, st.tag ); punk@1: endcase punk@1: endfunction punk@1: punk@1: function Action traceFull( String loc, String ttag, MemResp#(a,b) resp ); punk@1: case ( resp ) matches punk@1: tagged LoadResp .ld : $fdisplay(stderr, " => %s:%s Ld { tag=%x, data=%x }", loc, ttag, ld.tag, ld.data ); punk@1: tagged StoreResp .st : $fdisplay(stderr, " => %s:%s St { tag=%x }", loc, ttag, st.tag ); punk@1: endcase punk@1: endfunction punk@1: punk@1: endinstance punk@1: