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