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