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 102

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
                ICmd.cb.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 96 rkastl
                ICmd.cb.Cmd <= 'z;
44
 
45 95 rkastl
                repeat(8) @ICmd.cb;
46
 
47 50 rkastl
                recvcmd = new();
48
 
49 54 rkastl
                wait(ICmd.cb.Cmd == 0);
50 50 rkastl
                // Startbit
51 54 rkastl
                recvcmd.startbit = ICmd.cb.Cmd;
52 50 rkastl
 
53 54 rkastl
                @ICmd.cb;
54 50 rkastl
                // Transbit
55 54 rkastl
                recvcmd.transbit = ICmd.cb.Cmd;
56 50 rkastl
 
57
                // CmdID
58
                for (int i = 5; i >= 0; i--) begin
59 54 rkastl
                        @ICmd.cb;
60
                        recvcmd.id[i] = ICmd.cb.Cmd;
61 50 rkastl
                end
62
 
63
                // Arg
64
                for (int i = 31; i >= 0; i--) begin
65 54 rkastl
                        @ICmd.cb;
66
                        recvcmd.arg[i] = ICmd.cb.Cmd;
67 50 rkastl
                end
68
 
69
                // CRC
70
                for (int i = 6; i >= 0; i--) begin
71 54 rkastl
                        @ICmd.cb;
72
                        recvcmd.crc7[i] = ICmd.cb.Cmd;
73 50 rkastl
                end
74
 
75
                // Endbit
76 54 rkastl
                @ICmd.cb;
77
                recvcmd.endbit = ICmd.cb.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 100 rkastl
                repeat(2) @ICmd.cb;
168
 
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 53 rkastl
                -> InitDone;
189
 
190
        endtask
191 102 rkastl
 
192
        task recvCMD55(RCA_t rca);
193
                SDCommandR1 response;
194
 
195
                // expect CMD55
196
                recv();
197
                assert(recvcmd.id == cSdCmdNextIsACMD);
198
                assert(recvcmd.arg[31:16] == rca);
199
                state.recvCMD55();
200
 
201
                // respond with R1
202
                response = new(cSdCmdNextIsACMD, state);
203
                response.send(ICmd);
204
        endtask
205 50 rkastl
 
206
        function automatic SDCommandToken getCmd();
207
                return recvcmd;
208
        endfunction
209
 
210
 
211 44 rkastl
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
212 45 rkastl
                case (cmd.id)
213
                        cSdCmdGoIdleState: reset();
214
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
215
                endcase
216 44 rkastl
        endtask
217
 
218
endclass
219
 

powered by: WebSVN 2.1.0

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