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 56

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 56 rkastl
                crc = 0;
102 53 rkastl
 
103
                temp[39] = startbit;
104
                temp[38] = transbit;
105
                temp[37:32] = id;
106
                temp[31:0] = arg;
107
 
108
                for(int i = 39; i >= 0; i--) begin
109
                        if (((crc[6] & 1)) != temp[i])
110
                                 crc = (crc << 1) ^ 'b10001001;
111
                        else
112
                                 crc <<= 1;
113
                end
114
        endfunction
115
 
116
 
117
        task automatic send(virtual ISdCmd.Card ICmd);
118
                calcCrc();
119
 
120 54 rkastl
                @ICmd.cb;
121
                ICmd.cb.Cmd <= startbit;
122 53 rkastl
 
123 54 rkastl
                @ICmd.cb;
124
                ICmd.cb.Cmd <= transbit;
125 53 rkastl
 
126
                for(int i = 5; i >= 0; i--) begin
127 54 rkastl
                        @ICmd.cb;
128
                        ICmd.cb.Cmd <= id[i];
129 53 rkastl
                end
130
 
131
                for (int i = 31; i>= 0; i--) begin
132 54 rkastl
                        @ICmd.cb;
133
                        ICmd.cb.Cmd <= arg[i];
134 53 rkastl
                end
135
 
136 56 rkastl
                for (int i = 6; i >= 0; i--) begin
137 54 rkastl
                        @ICmd.cb;
138
                        ICmd.cb.Cmd <= crc[i];
139 53 rkastl
                end
140
 
141 54 rkastl
                @ICmd.cb;
142
                ICmd.cb.Cmd <= endbit;
143 53 rkastl
 
144 54 rkastl
                @ICmd.cb;
145
                ICmd.cb.Cmd <= 'z;
146 53 rkastl
        endtask
147 44 rkastl
endclass
148
 
149 53 rkastl
class SDCommandR7 extends SDCommandResponse;
150
 
151
        function new(SDCommandArg arg);
152
                startbit = 0;
153
                transbit = 0;
154
                id = cSdCmdSendIfCond;
155
                this.arg = arg;
156
                endbit = 1;
157
        endfunction
158
 
159
endclass
160
 
161 44 rkastl
class SDCard;
162 53 rkastl
        local virtual ISdCmd.Card ICmd;
163 50 rkastl
 
164 53 rkastl
        local SDCardState state;
165
        local SDCommandToken recvcmd;
166 44 rkastl
 
167 53 rkastl
        local event CmdReceived, InitDone;
168 50 rkastl
 
169 53 rkastl
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
170
                ICmd = CmdInterface;
171 44 rkastl
                state = idle;
172 50 rkastl
                this.CmdReceived = CmdReceived;
173 53 rkastl
                this.InitDone = InitDone;
174 44 rkastl
        endfunction
175
 
176
        task reset();
177
                state = idle;
178
        endtask
179
 
180 53 rkastl
        // Receive a command token and handle it
181 50 rkastl
        task recv();
182
                recvcmd = new();
183 54 rkastl
                ICmd.cb.Cmd <= 'z;
184 50 rkastl
 
185 54 rkastl
                wait(ICmd.cb.Cmd == 0);
186 50 rkastl
                // Startbit
187 54 rkastl
                recvcmd.startbit = ICmd.cb.Cmd;
188 50 rkastl
 
189 54 rkastl
                @ICmd.cb;
190 50 rkastl
                // Transbit
191 54 rkastl
                recvcmd.transbit = ICmd.cb.Cmd;
192 50 rkastl
 
193
                // CmdID
194
                for (int i = 5; i >= 0; i--) begin
195 54 rkastl
                        @ICmd.cb;
196
                        recvcmd.id[i] = ICmd.cb.Cmd;
197 50 rkastl
                end
198
 
199
                // Arg
200
                for (int i = 31; i >= 0; i--) begin
201 54 rkastl
                        @ICmd.cb;
202
                        recvcmd.arg[i] = ICmd.cb.Cmd;
203 50 rkastl
                end
204
 
205
                // CRC
206
                for (int i = 6; i >= 0; i--) begin
207 54 rkastl
                        @ICmd.cb;
208
                        recvcmd.crc7[i] = ICmd.cb.Cmd;
209 50 rkastl
                end
210
 
211
                // Endbit
212 54 rkastl
                @ICmd.cb;
213
                recvcmd.endbit = ICmd.cb.Cmd;
214 50 rkastl
 
215 53 rkastl
                recvcmd.checkFromHost();
216 50 rkastl
                -> CmdReceived;
217
        endtask
218
 
219 53 rkastl
        task automatic init();
220
                SDCommandR7 voltageresponse;
221
                SDCommandResponse response;
222
 
223
                // expect CMD0 so that state is clear
224
                recv();
225
                assert(recvcmd.id == cSdCmdGoIdleState);
226
 
227
                // expect CMD8: voltage and SD 2.00 compatible
228
                recv();
229
                assert(recvcmd.id == cSdCmdSendIfCond);
230
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
231
 
232
                // respond with R7: we are SD 2.00 compatible and compatible to the
233
                // voltage
234
                voltageresponse = new(recvcmd.arg);
235
                response = voltageresponse;
236
                response.send(ICmd);
237
 
238
                -> InitDone;
239
 
240
        endtask
241 50 rkastl
 
242
        function automatic SDCommandToken getCmd();
243
                return recvcmd;
244
        endfunction
245
 
246
 
247 44 rkastl
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
248 45 rkastl
                case (cmd.id)
249
                        cSdCmdGoIdleState: reset();
250
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
251
                endcase
252 44 rkastl
        endtask
253
 
254
endclass
255
 

powered by: WebSVN 2.1.0

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