punk@1
|
1
|
punk@1
|
2 import Trace::*;
|
punk@1
|
3
|
punk@1
|
4 //----------------------------------------------------------------------
|
punk@1
|
5 // Basic memory requests and responses
|
punk@1
|
6 //----------------------------------------------------------------------
|
punk@1
|
7
|
punk@1
|
8 typedef union tagged
|
punk@1
|
9 {
|
punk@1
|
10 struct { Bit#(addrSz) addr; Bit#(tagSz) tag; } LoadReq;
|
punk@1
|
11 struct { Bit#(addrSz) addr; Bit#(tagSz) tag; Bit#(dataSz) data; } StoreReq;
|
punk@1
|
12 }
|
punk@1
|
13 MemReq#( type addrSz, type tagSz, type dataSz )
|
punk@1
|
14 deriving(Eq,Bits);
|
punk@1
|
15
|
punk@1
|
16 typedef union tagged
|
punk@1
|
17 {
|
punk@1
|
18 struct { Bit#(tagSz) tag; Bit#(dataSz) data; } LoadResp;
|
punk@1
|
19 struct { Bit#(tagSz) tag; } StoreResp;
|
punk@1
|
20 }
|
punk@1
|
21 MemResp#( type tagSz, type dataSz )
|
punk@1
|
22 deriving(Eq,Bits);
|
punk@1
|
23
|
punk@1
|
24 //----------------------------------------------------------------------
|
punk@1
|
25 // Specialized req/resp for inst/data/host
|
punk@1
|
26 //----------------------------------------------------------------------
|
punk@1
|
27
|
punk@1
|
28 typedef 32 AddrSz;
|
punk@1
|
29 typedef 08 TagSz;
|
punk@1
|
30 typedef 32 DataSz;
|
punk@1
|
31 typedef 32 InstSz;
|
punk@1
|
32 typedef 32 HostDataSz;
|
punk@1
|
33
|
punk@1
|
34 typedef MemReq#(AddrSz,TagSz,0) InstReq;
|
punk@1
|
35 typedef MemResp#(TagSz,InstSz) InstResp;
|
punk@1
|
36
|
punk@1
|
37 typedef MemReq#(AddrSz,TagSz,DataSz) DataReq;
|
punk@1
|
38 typedef MemResp#(TagSz,DataSz) DataResp;
|
punk@1
|
39
|
punk@1
|
40 typedef MemReq#(AddrSz,TagSz,HostDataSz) HostReq;
|
punk@1
|
41 typedef MemResp#(TagSz,HostDataSz) HostResp;
|
punk@1
|
42
|
punk@1
|
43 //----------------------------------------------------------------------
|
punk@1
|
44 // Specialized req/resp for main memory
|
punk@1
|
45 //----------------------------------------------------------------------
|
punk@1
|
46
|
punk@1
|
47 typedef 32 MainMemAddrSz;
|
punk@1
|
48 typedef 08 MainMemTagSz;
|
punk@1
|
49 typedef 32 MainMemDataSz;
|
punk@1
|
50
|
punk@1
|
51 typedef MemReq#(MainMemAddrSz,MainMemTagSz,MainMemDataSz) MainMemReq;
|
punk@1
|
52 typedef MemResp#(MainMemTagSz,MainMemDataSz) MainMemResp;
|
punk@1
|
53
|
punk@1
|
54 //----------------------------------------------------------------------
|
punk@1
|
55 // Tracing Functions
|
punk@1
|
56 //----------------------------------------------------------------------
|
punk@1
|
57
|
punk@1
|
58 instance Traceable#(MemReq#(a,b,c));
|
punk@1
|
59
|
punk@1
|
60 function Action traceTiny( String loc, String ttag, MemReq#(a,b,c) req );
|
punk@1
|
61 case ( req ) matches
|
punk@1
|
62 tagged LoadReq .ld : $fdisplay(stderr, " => %s:%s l%2x", loc, ttag, ld.tag );
|
punk@1
|
63 tagged StoreReq .st : $fdisplay(stderr, " => %s:%s s%2x", loc, ttag, st.tag );
|
punk@1
|
64 endcase
|
punk@1
|
65 endfunction
|
punk@1
|
66
|
punk@1
|
67 function Action traceFull( String loc, String ttag, MemReq#(a,b,c) req );
|
punk@1
|
68 case ( req ) matches
|
punk@1
|
69 tagged LoadReq .ld : $fdisplay(stderr, " => %s:%s Ld { addr=%x, tag=%x }", loc, ttag, ld.addr, ld.tag );
|
punk@1
|
70 tagged StoreReq .st : $fdisplay(stderr, " => %s:%s St { addr=%x, tag=%x, data=%x }", loc, ttag, st.addr, st.tag, st.data );
|
punk@1
|
71 endcase
|
punk@1
|
72 endfunction
|
punk@1
|
73
|
punk@1
|
74 endinstance
|
punk@1
|
75
|
punk@1
|
76 instance Traceable#(MemResp#(a,b));
|
punk@1
|
77
|
punk@1
|
78 function Action traceTiny( String loc, String ttag, MemResp#(a,b) resp );
|
punk@1
|
79 case ( resp ) matches
|
punk@1
|
80 tagged LoadResp .ld : $fdisplay(stderr, " => %s:%s l%2x", loc, ttag, ld.tag );
|
punk@1
|
81 tagged StoreResp .st : $fdisplay(stderr, " => %s:%s s%2x", loc, ttag, st.tag );
|
punk@1
|
82 endcase
|
punk@1
|
83 endfunction
|
punk@1
|
84
|
punk@1
|
85 function Action traceFull( String loc, String ttag, MemResp#(a,b) resp );
|
punk@1
|
86 case ( resp ) matches
|
punk@1
|
87 tagged LoadResp .ld : $fdisplay(stderr, " => %s:%s Ld { tag=%x, data=%x }", loc, ttag, ld.tag, ld.data );
|
punk@1
|
88 tagged StoreResp .st : $fdisplay(stderr, " => %s:%s St { tag=%x }", loc, ttag, st.tag );
|
punk@1
|
89 endcase
|
punk@1
|
90 endfunction
|
punk@1
|
91
|
punk@1
|
92 endinstance
|
punk@1
|
93
|