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 63

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 58 rkastl
include "../../unitSdCardModel/src/SdCommand.sv";
12 44 rkastl
 
13
class SDCard;
14 53 rkastl
        local virtual ISdCmd.Card ICmd;
15 50 rkastl
 
16 53 rkastl
        local SDCardState state;
17 63 rkastl
        local RCA_t rca;
18 53 rkastl
        local SDCommandToken recvcmd;
19 59 rkastl
        local logic CCS;
20 44 rkastl
 
21 53 rkastl
        local event CmdReceived, InitDone;
22 50 rkastl
 
23 53 rkastl
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
24
                ICmd = CmdInterface;
25 57 rkastl
                state = new();
26 50 rkastl
                this.CmdReceived = CmdReceived;
27 53 rkastl
                this.InitDone = InitDone;
28 59 rkastl
                this.CCS = 1;
29 63 rkastl
                rca = 0;
30 44 rkastl
        endfunction
31
 
32
        task reset();
33
        endtask
34
 
35 53 rkastl
        // Receive a command token and handle it
36 50 rkastl
        task recv();
37
                recvcmd = new();
38 54 rkastl
                ICmd.cb.Cmd <= 'z;
39 50 rkastl
 
40 54 rkastl
                wait(ICmd.cb.Cmd == 0);
41 50 rkastl
                // Startbit
42 54 rkastl
                recvcmd.startbit = ICmd.cb.Cmd;
43 50 rkastl
 
44 54 rkastl
                @ICmd.cb;
45 50 rkastl
                // Transbit
46 54 rkastl
                recvcmd.transbit = ICmd.cb.Cmd;
47 50 rkastl
 
48
                // CmdID
49
                for (int i = 5; i >= 0; i--) begin
50 54 rkastl
                        @ICmd.cb;
51
                        recvcmd.id[i] = ICmd.cb.Cmd;
52 50 rkastl
                end
53
 
54
                // Arg
55
                for (int i = 31; i >= 0; i--) begin
56 54 rkastl
                        @ICmd.cb;
57
                        recvcmd.arg[i] = ICmd.cb.Cmd;
58 50 rkastl
                end
59
 
60
                // CRC
61
                for (int i = 6; i >= 0; i--) begin
62 54 rkastl
                        @ICmd.cb;
63
                        recvcmd.crc7[i] = ICmd.cb.Cmd;
64 50 rkastl
                end
65
 
66
                // Endbit
67 54 rkastl
                @ICmd.cb;
68
                recvcmd.endbit = ICmd.cb.Cmd;
69 50 rkastl
 
70 53 rkastl
                recvcmd.checkFromHost();
71 50 rkastl
                -> CmdReceived;
72
        endtask
73
 
74 53 rkastl
        task automatic init();
75
                SDCommandR7 voltageresponse;
76 57 rkastl
                SDCommandR1 response;
77 59 rkastl
                SDCommandR3 acmd41response;
78 62 rkastl
                SDCommandR2 cidresponse;
79 59 rkastl
                SDOCR ocr;
80 63 rkastl
                SDCommandR6 rcaresponse;
81 53 rkastl
 
82
                // expect CMD0 so that state is clear
83
                recv();
84
                assert(recvcmd.id == cSdCmdGoIdleState);
85
 
86
                // expect CMD8: voltage and SD 2.00 compatible
87
                recv();
88
                assert(recvcmd.id == cSdCmdSendIfCond);
89
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
90
 
91
                // respond with R7: we are SD 2.00 compatible and compatible to the
92
                // voltage
93
                voltageresponse = new(recvcmd.arg);
94 57 rkastl
                voltageresponse.send(ICmd);
95 53 rkastl
 
96 57 rkastl
                // expect CMD55 with default RCA
97
                recv();
98
                assert(recvcmd.id == cSdCmdNextIsACMD);
99
                assert(recvcmd.arg == 0);
100
                state.recvCMD55();
101
 
102
                // respond with R1
103
                response = new(cSdCmdNextIsACMD, state);
104
                response.send(ICmd);
105
 
106
                // expect ACMD41 with HCS = 1
107
                recv();
108
                assert(recvcmd.id == cSdCmdACMD41);
109
                assert(recvcmd.arg == cSdArgACMD41HCS);
110
 
111 59 rkastl
                // respond with R3
112
                ocr = new(CCS, cSdVoltageWindow);
113
                acmd41response = new(ocr);
114
                acmd41response.send(ICmd);
115 60 rkastl
 
116
                // expect CMD55 with default RCA
117
                recv();
118
                assert(recvcmd.id == cSdCmdNextIsACMD);
119
                assert(recvcmd.arg == 0);
120
                state.recvCMD55();
121 59 rkastl
 
122 60 rkastl
                // respond with R1
123
                response = new(cSdCmdNextIsACMD, state);
124
                response.send(ICmd);
125
 
126
                // expect ACMD41 with HCS = 1
127
                recv();
128
                assert(recvcmd.id == cSdCmdACMD41);
129
                assert(recvcmd.arg == cSdArgACMD41HCS);
130
 
131
                // respond with R3
132
                ocr.setBusy(cOCRDone);
133
                acmd41response = new(ocr);
134
                acmd41response.send(ICmd);
135
 
136 62 rkastl
                // expect CMD2
137
                recv();
138
                assert(recvcmd.id == cSdCmdAllSendCID);
139
 
140
                // respond with R2
141
                cidresponse = new();
142
                cidresponse.send(ICmd);
143
 
144 63 rkastl
                // expect CMD3
145
                recv();
146
                assert(recvcmd.id == cSdCmdSendRelAdr);
147
 
148
                // respond with R3
149
                rcaresponse = new(rca, state);
150
                rcaresponse.send(ICmd);
151
 
152 53 rkastl
                -> InitDone;
153
 
154
        endtask
155 50 rkastl
 
156
        function automatic SDCommandToken getCmd();
157
                return recvcmd;
158
        endfunction
159
 
160
 
161 44 rkastl
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
162 45 rkastl
                case (cmd.id)
163
                        cSdCmdGoIdleState: reset();
164
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
165
                endcase
166 44 rkastl
        endtask
167
 
168
endclass
169
 

powered by: WebSVN 2.1.0

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