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 59

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
        local SDCommandToken recvcmd;
18 59 rkastl
        local logic CCS;
19 44 rkastl
 
20 53 rkastl
        local event CmdReceived, InitDone;
21 50 rkastl
 
22 53 rkastl
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
23
                ICmd = CmdInterface;
24 57 rkastl
                state = new();
25 50 rkastl
                this.CmdReceived = CmdReceived;
26 53 rkastl
                this.InitDone = InitDone;
27 59 rkastl
                this.CCS = 1;
28 44 rkastl
        endfunction
29
 
30
        task reset();
31
        endtask
32
 
33 53 rkastl
        // Receive a command token and handle it
34 50 rkastl
        task recv();
35
                recvcmd = new();
36 54 rkastl
                ICmd.cb.Cmd <= 'z;
37 50 rkastl
 
38 54 rkastl
                wait(ICmd.cb.Cmd == 0);
39 50 rkastl
                // Startbit
40 54 rkastl
                recvcmd.startbit = ICmd.cb.Cmd;
41 50 rkastl
 
42 54 rkastl
                @ICmd.cb;
43 50 rkastl
                // Transbit
44 54 rkastl
                recvcmd.transbit = ICmd.cb.Cmd;
45 50 rkastl
 
46
                // CmdID
47
                for (int i = 5; i >= 0; i--) begin
48 54 rkastl
                        @ICmd.cb;
49
                        recvcmd.id[i] = ICmd.cb.Cmd;
50 50 rkastl
                end
51
 
52
                // Arg
53
                for (int i = 31; i >= 0; i--) begin
54 54 rkastl
                        @ICmd.cb;
55
                        recvcmd.arg[i] = ICmd.cb.Cmd;
56 50 rkastl
                end
57
 
58
                // CRC
59
                for (int i = 6; i >= 0; i--) begin
60 54 rkastl
                        @ICmd.cb;
61
                        recvcmd.crc7[i] = ICmd.cb.Cmd;
62 50 rkastl
                end
63
 
64
                // Endbit
65 54 rkastl
                @ICmd.cb;
66
                recvcmd.endbit = ICmd.cb.Cmd;
67 50 rkastl
 
68 53 rkastl
                recvcmd.checkFromHost();
69 50 rkastl
                -> CmdReceived;
70
        endtask
71
 
72 53 rkastl
        task automatic init();
73
                SDCommandR7 voltageresponse;
74 57 rkastl
                SDCommandR1 response;
75 59 rkastl
                SDCommandR3 acmd41response;
76
                SDOCR ocr;
77 53 rkastl
 
78
                // expect CMD0 so that state is clear
79
                recv();
80
                assert(recvcmd.id == cSdCmdGoIdleState);
81
 
82
                // expect CMD8: voltage and SD 2.00 compatible
83
                recv();
84
                assert(recvcmd.id == cSdCmdSendIfCond);
85
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
86
 
87
                // respond with R7: we are SD 2.00 compatible and compatible to the
88
                // voltage
89
                voltageresponse = new(recvcmd.arg);
90 57 rkastl
                voltageresponse.send(ICmd);
91 53 rkastl
 
92 57 rkastl
                // expect CMD55 with default RCA
93
                recv();
94
                assert(recvcmd.id == cSdCmdNextIsACMD);
95
                assert(recvcmd.arg == 0);
96
                state.recvCMD55();
97
 
98
                // respond with R1
99
                response = new(cSdCmdNextIsACMD, state);
100
                response.send(ICmd);
101
 
102
                // expect ACMD41 with HCS = 1
103
                recv();
104
                assert(recvcmd.id == cSdCmdACMD41);
105
                assert(recvcmd.arg == cSdArgACMD41HCS);
106
 
107 59 rkastl
                // respond with R3
108
                ocr = new(CCS, cSdVoltageWindow);
109
                acmd41response = new(ocr);
110
                acmd41response.send(ICmd);
111
 
112 53 rkastl
                -> InitDone;
113
 
114
        endtask
115 50 rkastl
 
116
        function automatic SDCommandToken getCmd();
117
                return recvcmd;
118
        endfunction
119
 
120
 
121 44 rkastl
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
122 45 rkastl
                case (cmd.id)
123
                        cSdCmdGoIdleState: reset();
124
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
125
                endcase
126 44 rkastl
        endtask
127
 
128
endclass
129
 

powered by: WebSVN 2.1.0

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