view 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
line wrap: on
line source

2 import Trace::*;
4 //----------------------------------------------------------------------
5 // Basic memory requests and responses
6 //----------------------------------------------------------------------
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);
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);
24 //----------------------------------------------------------------------
25 // Specialized req/resp for inst/data/host
26 //----------------------------------------------------------------------
28 typedef 32 AddrSz;
29 typedef 08 TagSz;
30 typedef 32 DataSz;
31 typedef 32 InstSz;
32 typedef 32 HostDataSz;
34 typedef MemReq#(AddrSz,TagSz,0) InstReq;
35 typedef MemResp#(TagSz,InstSz) InstResp;
37 typedef MemReq#(AddrSz,TagSz,DataSz) DataReq;
38 typedef MemResp#(TagSz,DataSz) DataResp;
40 typedef MemReq#(AddrSz,TagSz,HostDataSz) HostReq;
41 typedef MemResp#(TagSz,HostDataSz) HostResp;
43 //----------------------------------------------------------------------
44 // Specialized req/resp for main memory
45 //----------------------------------------------------------------------
47 typedef 32 MainMemAddrSz;
48 typedef 08 MainMemTagSz;
49 typedef 32 MainMemDataSz;
51 typedef MemReq#(MainMemAddrSz,MainMemTagSz,MainMemDataSz) MainMemReq;
52 typedef MemResp#(MainMemTagSz,MainMemDataSz) MainMemResp;
54 //----------------------------------------------------------------------
55 // Tracing Functions
56 //----------------------------------------------------------------------
58 instance Traceable#(MemReq#(a,b,c));
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
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
74 endinstance
76 instance Traceable#(MemResp#(a,b));
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
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
92 endinstance