OpenCores
URL https://opencores.org/ocsvn/sdhc-sc-core/sdhc-sc-core/trunk

Subversion Repositories sdhc-sc-core

[/] [sdhc-sc-core/] [trunk/] [grpSdVerification/] [unitSdCardModel/] [src/] [SdCardModel.sv] - Blame information for rev 54

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 44 rkastl
//
2
// file: SdCardModel.sv
3
// author: Rainer Kastl
4
//
5
// Models a SDCard for verification
6
//
7
 
8
const logic cActivated = 1;
9
const logic cInactivated = 0;
10
 
11
`define cSDArgWith 32
12
typedef logic[`cSDArgWith-1:0] SDCommandArg;
13 50 rkastl
typedef logic[6:0] aCrc;
14 44 rkastl
 
15
typedef enum {
16
         cSdCmdGoIdleState = 0,
17
         cSdCmdAllSendCID = 2,
18
         cSdCmdSendRelAdr = 3,
19
         cSdCmdSetDSR = 4, // [31:16] DSR
20
         cSdCmdSelCard = 7, // [31:16] RCA
21
         cSdCmdSendIfCond = 8, // [31:12] reserved, [11:8] supply voltage, [7:0] check pattern
22
         cSdCmdSendCSD = 9, // [31:16] RCA
23
         cSdCmdSendCID = 10, // [31:16] RCA
24
         cSdCmdStopTrans = 12,
25
         cSdCmdSendStatus = 13 // [31:16] RCA
26
} SDCommandId;
27
 
28
typedef enum {
29
        idle
30
} SDCardState;
31
 
32
class SDCommandToken;
33 46 rkastl
        logic startbit;
34
        logic transbit;
35 51 rkastl
        rand logic[5:0] id;
36
        rand SDCommandArg arg;
37 50 rkastl
        aCrc crc7;
38 46 rkastl
        logic endbit;
39 50 rkastl
 
40
        function void display();
41
                $display("Startbit: %b", startbit);
42
                $display("Transbit: %b", transbit);
43
                $display("ID: %b", id);
44
                $display("Arg: %h", arg);
45
                $display("CRC: %b", crc7);
46
                $display("Endbit: %b" , endbit);
47
        endfunction
48
 
49
        function void checkStartEnd();
50
                assert(startbit == 0);
51
                assert(endbit == 1);
52
        endfunction
53
 
54
        function void checkFromHost();
55
                checkStartEnd();
56
                checkCrc();
57
                assert(transbit == 1);
58
        endfunction
59
 
60
        function void checkCrc();
61 53 rkastl
                assert(crc7 == calcCrcOfToken());
62 50 rkastl
        endfunction
63
 
64 53 rkastl
        function automatic aCrc calcCrcOfToken();
65
                logic[39:0] temp;
66 50 rkastl
                aCrc crc = 0;
67 53 rkastl
 
68 50 rkastl
                temp[39] = startbit;
69
                temp[38] = transbit;
70
                temp[37:32] = id;
71
                temp[31:0] = arg;
72 53 rkastl
 
73 50 rkastl
                for(int i = 39; i >= 0; i--) begin
74
                        if (((crc[6] & 1)) != temp[i])
75 53 rkastl
                                 crc = (crc << 1) ^ 'b10001001;
76
                        else
77
                                 crc <<= 1;
78
                end
79 50 rkastl
                return crc;
80
        endfunction
81
 
82 51 rkastl
        function automatic bit equals(SDCommandToken rhs);
83
                if(id == rhs.id && arg == rhs.arg) begin
84
                        return 1;
85
                end
86
                return 0;
87
        endfunction
88
 
89 44 rkastl
endclass
90
 
91
class SDCommandResponse;
92 53 rkastl
        protected logic startbit;
93
        protected logic transbit;
94
        protected logic[5:0] id;
95
        protected SDCommandArg arg;
96
        protected aCrc crc;
97
        protected logic endbit;
98 44 rkastl
 
99 53 rkastl
        function automatic void calcCrc();
100
                logic[39:0] temp;
101
 
102
                temp[39] = startbit;
103
                temp[38] = transbit;
104
                temp[37:32] = id;
105
                temp[31:0] = arg;
106
 
107
                for(int i = 39; i >= 0; i--) begin
108
                        if (((crc[6] & 1)) != temp[i])
109
                                 crc = (crc << 1) ^ 'b10001001;
110
                        else
111
                                 crc <<= 1;
112
                end
113
        endfunction
114
 
115
 
116
        task automatic send(virtual ISdCmd.Card ICmd);
117
                calcCrc();
118
 
119 54 rkastl
                @ICmd.cb;
120
                ICmd.cb.Cmd <= startbit;
121 53 rkastl
 
122 54 rkastl
                @ICmd.cb;
123
                ICmd.cb.Cmd <= transbit;
124 53 rkastl
 
125
                for(int i = 5; i >= 0; i--) begin
126 54 rkastl
                        @ICmd.cb;
127
                        ICmd.cb.Cmd <= id[i];
128 53 rkastl
                end
129
 
130
                for (int i = 31; i>= 0; i--) begin
131 54 rkastl
                        @ICmd.cb;
132
                        ICmd.cb.Cmd <= arg[i];
133 53 rkastl
                end
134
 
135
                for (int i = 5; i >= 0; i--) begin
136 54 rkastl
                        @ICmd.cb;
137
                        ICmd.cb.Cmd <= crc[i];
138 53 rkastl
                end
139
 
140 54 rkastl
                @ICmd.cb;
141
                ICmd.cb.Cmd <= endbit;
142 53 rkastl
 
143 54 rkastl
                @ICmd.cb;
144
                ICmd.cb.Cmd <= 'z;
145 53 rkastl
        endtask
146 44 rkastl
endclass
147
 
148 53 rkastl
class SDCommandR7 extends SDCommandResponse;
149
 
150
        function new(SDCommandArg arg);
151
                startbit = 0;
152
                transbit = 0;
153
                id = cSdCmdSendIfCond;
154
                this.arg = arg;
155
                endbit = 1;
156
        endfunction
157
 
158
endclass
159
 
160 44 rkastl
class SDCard;
161 53 rkastl
        local virtual ISdCmd.Card ICmd;
162 50 rkastl
 
163 53 rkastl
        local SDCardState state;
164
        local SDCommandToken recvcmd;
165 44 rkastl
 
166 53 rkastl
        local event CmdReceived, InitDone;
167 50 rkastl
 
168 53 rkastl
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
169
                ICmd = CmdInterface;
170 44 rkastl
                state = idle;
171 50 rkastl
                this.CmdReceived = CmdReceived;
172 53 rkastl
                this.InitDone = InitDone;
173 44 rkastl
        endfunction
174
 
175
        task reset();
176
                state = idle;
177
        endtask
178
 
179 53 rkastl
        // Receive a command token and handle it
180 50 rkastl
        task recv();
181
                recvcmd = new();
182 54 rkastl
                ICmd.cb.Cmd <= 'z;
183 50 rkastl
 
184 54 rkastl
                wait(ICmd.cb.Cmd == 0);
185 50 rkastl
                // Startbit
186 54 rkastl
                recvcmd.startbit = ICmd.cb.Cmd;
187 50 rkastl
 
188 54 rkastl
                @ICmd.cb;
189 50 rkastl
                // Transbit
190 54 rkastl
                recvcmd.transbit = ICmd.cb.Cmd;
191 50 rkastl
 
192
                // CmdID
193
                for (int i = 5; i >= 0; i--) begin
194 54 rkastl
                        @ICmd.cb;
195
                        recvcmd.id[i] = ICmd.cb.Cmd;
196 50 rkastl
                end
197
 
198
                // Arg
199
                for (int i = 31; i >= 0; i--) begin
200 54 rkastl
                        @ICmd.cb;
201
                        recvcmd.arg[i] = ICmd.cb.Cmd;
202 50 rkastl
                end
203
 
204
                // CRC
205
                for (int i = 6; i >= 0; i--) begin
206 54 rkastl
                        @ICmd.cb;
207
                        recvcmd.crc7[i] = ICmd.cb.Cmd;
208 50 rkastl
                end
209
 
210
                // Endbit
211 54 rkastl
                @ICmd.cb;
212
                recvcmd.endbit = ICmd.cb.Cmd;
213 50 rkastl
 
214 53 rkastl
                recvcmd.checkFromHost();
215 50 rkastl
                -> CmdReceived;
216
        endtask
217
 
218 53 rkastl
        task automatic init();
219
                SDCommandR7 voltageresponse;
220
                SDCommandResponse response;
221
 
222
                // expect CMD0 so that state is clear
223
                recv();
224
                assert(recvcmd.id == cSdCmdGoIdleState);
225
 
226
                // expect CMD8: voltage and SD 2.00 compatible
227
                recv();
228
                assert(recvcmd.id == cSdCmdSendIfCond);
229
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
230
 
231
                // respond with R7: we are SD 2.00 compatible and compatible to the
232
                // voltage
233
                voltageresponse = new(recvcmd.arg);
234
                response = voltageresponse;
235
                response.send(ICmd);
236
 
237
                -> InitDone;
238
 
239
        endtask
240 50 rkastl
 
241
        function automatic SDCommandToken getCmd();
242
                return recvcmd;
243
        endfunction
244
 
245
 
246 44 rkastl
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
247 45 rkastl
                case (cmd.id)
248
                        cSdCmdGoIdleState: reset();
249
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
250
                endcase
251 44 rkastl
        endtask
252
 
253
endclass
254
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.