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 113

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 100 rkastl
include "../../unitSdCardModel/src/Crc.sv";
12 58 rkastl
include "../../unitSdCardModel/src/SdCommand.sv";
13 100 rkastl
include "../../unitSdCardModel/src/SdData.sv";
14 44 rkastl
 
15
class SDCard;
16 53 rkastl
        local virtual ISdCmd.Card ICmd;
17 50 rkastl
 
18 53 rkastl
        local SDCardState state;
19 63 rkastl
        local RCA_t rca;
20 53 rkastl
        local SDCommandToken recvcmd;
21 59 rkastl
        local logic CCS;
22 100 rkastl
        local Mode_t mode;
23
        local DataMode_t datamode;
24 44 rkastl
 
25 53 rkastl
        local event CmdReceived, InitDone;
26 50 rkastl
 
27 53 rkastl
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
28
                ICmd = CmdInterface;
29 57 rkastl
                state = new();
30 50 rkastl
                this.CmdReceived = CmdReceived;
31 53 rkastl
                this.InitDone = InitDone;
32 59 rkastl
                this.CCS = 1;
33 63 rkastl
                rca = 0;
34 100 rkastl
                mode = standard;
35 105 rkastl
                ICmd.cbcard.Data <= 'z;
36 44 rkastl
        endfunction
37
 
38
        task reset();
39
        endtask
40
 
41 53 rkastl
        // Receive a command token and handle it
42 50 rkastl
        task recv();
43 105 rkastl
                ICmd.cbcard.Cmd <= 'z;
44 96 rkastl
 
45 105 rkastl
                repeat(8) @ICmd.cbcard;
46 95 rkastl
 
47 50 rkastl
                recvcmd = new();
48
 
49 105 rkastl
                wait(ICmd.cbcard.Cmd == 0);
50 50 rkastl
                // Startbit
51 105 rkastl
                recvcmd.startbit = ICmd.cbcard.Cmd;
52 50 rkastl
 
53 105 rkastl
                @ICmd.cbcard;
54 50 rkastl
                // Transbit
55 105 rkastl
                recvcmd.transbit = ICmd.cbcard.Cmd;
56 50 rkastl
 
57
                // CmdID
58
                for (int i = 5; i >= 0; i--) begin
59 105 rkastl
                        @ICmd.cbcard;
60
                        recvcmd.id[i] = ICmd.cbcard.Cmd;
61 50 rkastl
                end
62
 
63
                // Arg
64
                for (int i = 31; i >= 0; i--) begin
65 105 rkastl
                        @ICmd.cbcard;
66
                        recvcmd.arg[i] = ICmd.cbcard.Cmd;
67 50 rkastl
                end
68
 
69
                // CRC
70
                for (int i = 6; i >= 0; i--) begin
71 105 rkastl
                        @ICmd.cbcard;
72
                        recvcmd.crc7[i] = ICmd.cbcard.Cmd;
73 50 rkastl
                end
74
 
75
                // Endbit
76 105 rkastl
                @ICmd.cbcard;
77
                recvcmd.endbit = ICmd.cbcard.Cmd;
78 50 rkastl
 
79 53 rkastl
                recvcmd.checkFromHost();
80 50 rkastl
                -> CmdReceived;
81
        endtask
82
 
83 53 rkastl
        task automatic init();
84
                SDCommandR7 voltageresponse;
85 57 rkastl
                SDCommandR1 response;
86 59 rkastl
                SDCommandR3 acmd41response;
87 62 rkastl
                SDCommandR2 cidresponse;
88 59 rkastl
                SDOCR ocr;
89 63 rkastl
                SDCommandR6 rcaresponse;
90 100 rkastl
                logic data[$];
91
                SdData sddata;
92 53 rkastl
 
93
                // expect CMD0 so that state is clear
94
                recv();
95
                assert(recvcmd.id == cSdCmdGoIdleState);
96
 
97
                // expect CMD8: voltage and SD 2.00 compatible
98
                recv();
99
                assert(recvcmd.id == cSdCmdSendIfCond);
100
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
101
 
102
                // respond with R7: we are SD 2.00 compatible and compatible to the
103
                // voltage
104
                voltageresponse = new(recvcmd.arg);
105 57 rkastl
                voltageresponse.send(ICmd);
106 53 rkastl
 
107 102 rkastl
                recvCMD55(0);
108 57 rkastl
 
109
                // expect ACMD41 with HCS = 1
110
                recv();
111
                assert(recvcmd.id == cSdCmdACMD41);
112
                assert(recvcmd.arg == cSdArgACMD41HCS);
113
 
114 59 rkastl
                // respond with R3
115
                ocr = new(CCS, cSdVoltageWindow);
116
                acmd41response = new(ocr);
117
                acmd41response.send(ICmd);
118 60 rkastl
 
119 102 rkastl
                recvCMD55(0);
120 59 rkastl
 
121 60 rkastl
                // expect ACMD41 with HCS = 1
122
                recv();
123
                assert(recvcmd.id == cSdCmdACMD41);
124
                assert(recvcmd.arg == cSdArgACMD41HCS);
125 98 rkastl
                state.AppCmd = 0;
126 60 rkastl
 
127
                // respond with R3
128
                ocr.setBusy(cOCRDone);
129
                acmd41response = new(ocr);
130
                acmd41response.send(ICmd);
131
 
132 62 rkastl
                // expect CMD2
133
                recv();
134
                assert(recvcmd.id == cSdCmdAllSendCID);
135
 
136
                // respond with R2
137
                cidresponse = new();
138
                cidresponse.send(ICmd);
139
 
140 63 rkastl
                // expect CMD3
141
                recv();
142
                assert(recvcmd.id == cSdCmdSendRelAdr);
143
 
144
                // respond with R3
145
                rcaresponse = new(rca, state);
146
                rcaresponse.send(ICmd);
147
 
148 96 rkastl
                // expect CMD7
149
                recv();
150
                assert(recvcmd.id == cSdCmdSelCard);
151
                assert(recvcmd.arg[31:16] == rca);
152
 
153 98 rkastl
                // respond with R1, no busy
154
                state.ReadyForData = 1;
155
                response = new(cSdCmdSelCard, state);
156
                response.send(ICmd);
157 96 rkastl
 
158 99 rkastl
                // expect ACMD51
159 102 rkastl
                recvCMD55(rca);
160 99 rkastl
                recv();
161
                assert(recvcmd.id == cSdCmdSendSCR);
162
 
163
                // respond with R1
164
                response = new(cSdCmdSendSCR, state);
165
                response.send(ICmd);
166
 
167 105 rkastl
                repeat(2) @ICmd.cbcard;
168 100 rkastl
 
169
                // send dummy SCR
170 101 rkastl
                for (int i = 0; i < 64; i++)
171 100 rkastl
                        data.push_back(0);
172
 
173 101 rkastl
                data[63-50] = 1;
174
                data[63-48] = 1;
175 100 rkastl
 
176
                sddata = new(standard, widewidth);
177
                sddata.send(ICmd, data);
178
 
179 102 rkastl
                // expect ACMD6
180
                recvCMD55(rca);
181
                recv();
182
                assert(recvcmd.id == cSdCmdSetBusWidth);
183
                assert(recvcmd.arg == 'h00000002);
184
 
185
                response = new(cSdCmdSetBusWidth, state);
186
                response.send(ICmd);
187
 
188 103 rkastl
                sddata.mode = wide;
189
 
190
                // expect CMD6
191
                recv();
192
                assert(recvcmd.id == cSdCmdSwitchFuntion);
193
                assert(recvcmd.arg == 'h00FFFFF1);
194
                response.send(ICmd);
195
 
196
                // send status data structure
197
                data = {};
198
 
199
                for (int i = 0; i < 512; i++)
200
                        data.push_back(0);
201
 
202
                data[511-400] = 1;
203
                data[511-376] = 1;
204
                sddata.send(ICmd, data);
205 104 rkastl
 
206
                // expect CMD6 with set
207
                recv();
208
                assert(recvcmd.id == cSdCmdSwitchFuntion);
209
                assert(recvcmd.arg == 'h80FFFFF1);
210
                response.send(ICmd);
211
 
212
                // send status data structure
213
                data = {};
214 103 rkastl
 
215 104 rkastl
                for (int i = 0; i < 512; i++)
216
                        data.push_back(0);
217 103 rkastl
 
218 104 rkastl
                data[511-400] = 1;
219
                data[511-376] = 1;
220
                sddata.send(ICmd, data);
221
 
222
                // switch to 50MHz
223 105 rkastl
                // expect CMD13
224
                recv();
225
                assert(recvcmd.id == cSdCmdSendStatus);
226
                assert(recvcmd.arg == rca);
227
                response = new(cSdCmdSendStatus, state);
228
                response.send(ICmd);
229 104 rkastl
 
230 113 rkastl
                // expect Read
231
                recv();
232
                assert(recvcmd.id == cSdCmdReadSingleBlock);
233
                // recvcmd.arg = address
234
                response = new(cSdCmdReadSingleBlock, state);
235
                response.send(ICmd);
236
 
237
                data = {};
238
                for(int i = 0; i < (512 * 8) - 1; i++)
239
                        data.push_back(1);
240
 
241
                sddata.send(ICmd, data);
242
 
243 53 rkastl
                -> InitDone;
244
 
245
        endtask
246 102 rkastl
 
247
        task recvCMD55(RCA_t rca);
248
                SDCommandR1 response;
249
 
250
                // expect CMD55
251
                recv();
252
                assert(recvcmd.id == cSdCmdNextIsACMD);
253
                assert(recvcmd.arg[31:16] == rca);
254
                state.recvCMD55();
255
 
256
                // respond with R1
257
                response = new(cSdCmdNextIsACMD, state);
258
                response.send(ICmd);
259
        endtask
260 50 rkastl
 
261
        function automatic SDCommandToken getCmd();
262
                return recvcmd;
263
        endfunction
264
 
265
 
266 44 rkastl
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
267 45 rkastl
                case (cmd.id)
268
                        cSdCmdGoIdleState: reset();
269
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
270
                endcase
271 44 rkastl
        endtask
272
 
273
endclass
274
 
275 106 rkastl
class NoSDCard extends SDCard;
276
 
277
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
278
                super.new(CmdInterface, CmdReceived, InitDone);
279
        endfunction
280
 
281
        task automatic init();
282
        endtask
283
 
284
endclass

powered by: WebSVN 2.1.0

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