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] - Diff between revs 114 and 122

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 114 Rev 122
Line 11... Line 11...
include "../../unitSdCardModel/src/Crc.sv";
include "../../unitSdCardModel/src/Crc.sv";
include "../../unitSdCardModel/src/SdCommand.sv";
include "../../unitSdCardModel/src/SdCommand.sv";
include "../../unitSdCardModel/src/SdData.sv";
include "../../unitSdCardModel/src/SdData.sv";
 
 
class SDCard;
class SDCard;
        local virtual ISdCmd.Card ICmd;
        local virtual ISdCard.Card ICard;
 
 
        local SDCardState state;
        local SDCardState state;
        local RCA_t rca;
        local RCA_t rca;
        local SDCommandToken recvcmd;
        local SDCommandToken recvcmd;
        local logic CCS;
        local logic CCS;
        local Mode_t mode;
        local Mode_t mode;
        local DataMode_t datamode;
        local DataMode_t datamode;
 
 
        local event CmdReceived, InitDone;
        local event CmdReceived, InitDone;
 
 
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
        function new(virtual ISdCard CardInterface, event CmdReceived, event InitDone);
                ICmd = CmdInterface;
                ICard = CardInterface;
                state = new();
                state = new();
                this.CmdReceived = CmdReceived;
                this.CmdReceived = CmdReceived;
                this.InitDone = InitDone;
                this.InitDone = InitDone;
                this.CCS = 1;
                this.CCS = 1;
                rca = 0;
                rca = 0;
                mode = standard;
                mode = standard;
                ICmd.cbcard.Data <= 'z;
                ICard.cbcard.Data <= 'z;
        endfunction
        endfunction
 
 
        task reset();
        task reset();
        endtask
        endtask
 
 
        // Receive a command token and handle it
        // Receive a command token and handle it
        task recv();
        task recv();
                ICmd.cbcard.Cmd <= 'z;
                ICard.cbcard.Cmd <= 'z;
 
 
                repeat(8) @ICmd.cbcard;
                repeat(8) @ICard.cbcard;
 
 
                recvcmd = new();
                recvcmd = new();
 
 
                wait(ICmd.cbcard.Cmd == 0);
                wait(ICard.cbcard.Cmd == 0);
                // Startbit
                // Startbit
                recvcmd.startbit = ICmd.cbcard.Cmd;
                recvcmd.startbit = ICard.cbcard.Cmd;
 
 
                @ICmd.cbcard;
                @ICard.cbcard;
                // Transbit
                // Transbit
                recvcmd.transbit = ICmd.cbcard.Cmd;
                recvcmd.transbit = ICard.cbcard.Cmd;
 
 
                // CmdID
                // CmdID
                for (int i = 5; i >= 0; i--) begin
                for (int i = 5; i >= 0; i--) begin
                        @ICmd.cbcard;
                        @ICard.cbcard;
                        recvcmd.id[i] = ICmd.cbcard.Cmd;
                        recvcmd.id[i] = ICard.cbcard.Cmd;
                end
                end
 
 
                // Arg
                // Arg
                for (int i = 31; i >= 0; i--) begin
                for (int i = 31; i >= 0; i--) begin
                        @ICmd.cbcard;
                        @ICard.cbcard;
                        recvcmd.arg[i] = ICmd.cbcard.Cmd;
                        recvcmd.arg[i] = ICard.cbcard.Cmd;
                end
                end
 
 
                // CRC
                // CRC
                for (int i = 6; i >= 0; i--) begin
                for (int i = 6; i >= 0; i--) begin
                        @ICmd.cbcard;
                        @ICard.cbcard;
                        recvcmd.crc7[i] = ICmd.cbcard.Cmd;
                        recvcmd.crc7[i] = ICard.cbcard.Cmd;
                end
                end
 
 
                // Endbit
                // Endbit
                @ICmd.cbcard;
                @ICard.cbcard;
                recvcmd.endbit = ICmd.cbcard.Cmd;
                recvcmd.endbit = ICard.cbcard.Cmd;
 
 
                recvcmd.checkFromHost();
                recvcmd.checkFromHost();
                -> CmdReceived;
                -> CmdReceived;
        endtask
        endtask
 
 
Line 100... Line 100...
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
                assert(recvcmd.arg[12:8] == 'b0001); // Standard voltage
 
 
                // respond with R7: we are SD 2.00 compatible and compatible to the
                // respond with R7: we are SD 2.00 compatible and compatible to the
                // voltage
                // voltage
                voltageresponse = new(recvcmd.arg);
                voltageresponse = new(recvcmd.arg);
                voltageresponse.send(ICmd);
                voltageresponse.send(ICard);
 
 
                recvCMD55(0);
                recvCMD55(0);
 
 
                // expect ACMD41 with HCS = 1
                // expect ACMD41 with HCS = 1
                recv();
                recv();
Line 112... Line 112...
                assert(recvcmd.arg == cSdArgACMD41HCS);
                assert(recvcmd.arg == cSdArgACMD41HCS);
 
 
                // respond with R3
                // respond with R3
                ocr = new(CCS, cSdVoltageWindow);
                ocr = new(CCS, cSdVoltageWindow);
                acmd41response = new(ocr);
                acmd41response = new(ocr);
                acmd41response.send(ICmd);
                acmd41response.send(ICard);
 
 
                recvCMD55(0);
                recvCMD55(0);
 
 
                // expect ACMD41 with HCS = 1
                // expect ACMD41 with HCS = 1
                recv();
                recv();
Line 125... Line 125...
                state.AppCmd = 0;
                state.AppCmd = 0;
 
 
                // respond with R3
                // respond with R3
                ocr.setBusy(cOCRDone);
                ocr.setBusy(cOCRDone);
                acmd41response = new(ocr);
                acmd41response = new(ocr);
                acmd41response.send(ICmd);
                acmd41response.send(ICard);
 
 
                // expect CMD2
                // expect CMD2
                recv();
                recv();
                assert(recvcmd.id == cSdCmdAllSendCID);
                assert(recvcmd.id == cSdCmdAllSendCID);
 
 
                // respond with R2
                // respond with R2
                cidresponse = new();
                cidresponse = new();
                cidresponse.send(ICmd);
                cidresponse.send(ICard);
 
 
                // expect CMD3
                // expect CMD3
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSendRelAdr);
                assert(recvcmd.id == cSdCmdSendRelAdr);
 
 
                // respond with R3
                // respond with R3
                rcaresponse = new(rca, state);
                rcaresponse = new(rca, state);
                rcaresponse.send(ICmd);
                rcaresponse.send(ICard);
 
 
                // expect CMD7
                // expect CMD7
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSelCard);
                assert(recvcmd.id == cSdCmdSelCard);
                assert(recvcmd.arg[31:16] == rca);
                assert(recvcmd.arg[31:16] == rca);
 
 
                // respond with R1, no busy
                // respond with R1, no busy
                state.ReadyForData = 1;
                state.ReadyForData = 1;
                response = new(cSdCmdSelCard, state);
                response = new(cSdCmdSelCard, state);
                response.send(ICmd);
                response.send(ICard);
 
 
                // expect ACMD51
                // expect ACMD51
                recvCMD55(rca);
                recvCMD55(rca);
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSendSCR);
                assert(recvcmd.id == cSdCmdSendSCR);
 
 
                // respond with R1
                // respond with R1
                response = new(cSdCmdSendSCR, state);
                response = new(cSdCmdSendSCR, state);
                response.send(ICmd);
                response.send(ICard);
 
 
                repeat(2) @ICmd.cbcard;
                repeat(2) @ICard.cbcard;
 
 
                // send dummy SCR
                // send dummy SCR
                for (int i = 0; i < 64; i++)
                for (int i = 0; i < 64; i++)
                        data.push_back(0);
                        data.push_back(0);
 
 
                data[63-50] = 1;
                data[63-50] = 1;
                data[63-48] = 1;
                data[63-48] = 1;
 
 
                sddata = new(standard, widewidth);
                sddata = new(standard, widewidth);
                sddata.send(ICmd, data);
                sddata.send(ICard, data);
 
 
                // expect ACMD6
                // expect ACMD6
                recvCMD55(rca);
                recvCMD55(rca);
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSetBusWidth);
                assert(recvcmd.id == cSdCmdSetBusWidth);
                assert(recvcmd.arg == 'h00000002);
                assert(recvcmd.arg == 'h00000002);
 
 
                response = new(cSdCmdSetBusWidth, state);
                response = new(cSdCmdSetBusWidth, state);
                response.send(ICmd);
                response.send(ICard);
 
 
                sddata.mode = wide;
                sddata.mode = wide;
 
 
                // expect CMD6
                // expect CMD6
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSwitchFuntion);
                assert(recvcmd.id == cSdCmdSwitchFuntion);
                assert(recvcmd.arg == 'h00FFFFF1);
                assert(recvcmd.arg == 'h00FFFFF1);
                response.send(ICmd);
                response.send(ICard);
 
 
                // send status data structure
                // send status data structure
                data = {};
                data = {};
 
 
                for (int i = 0; i < 512; i++)
                for (int i = 0; i < 512; i++)
                        data.push_back(0);
                        data.push_back(0);
 
 
                data[511-400] = 1;
                data[511-400] = 1;
                data[511-376] = 1;
                data[511-376] = 1;
                sddata.send(ICmd, data);
                sddata.send(ICard, data);
 
 
                // expect CMD6 with set
                // expect CMD6 with set
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSwitchFuntion);
                assert(recvcmd.id == cSdCmdSwitchFuntion);
                assert(recvcmd.arg == 'h80FFFFF1);
                assert(recvcmd.arg == 'h80FFFFF1);
                response.send(ICmd);
                response.send(ICard);
 
 
                // send status data structure
                // send status data structure
                data = {};
                data = {};
 
 
                for (int i = 0; i < 512; i++)
                for (int i = 0; i < 512; i++)
                        data.push_back(0);
                        data.push_back(0);
 
 
                data[511-400] = 1;
                data[511-400] = 1;
                data[511-376] = 1;
                data[511-376] = 1;
                sddata.send(ICmd, data);
                sddata.send(ICard, data);
 
 
                // switch to 50MHz
                // switch to 50MHz
                // expect CMD13
                // expect CMD13
                recv();
                recv();
                assert(recvcmd.id == cSdCmdSendStatus);
                assert(recvcmd.id == cSdCmdSendStatus);
                assert(recvcmd.arg == rca);
                assert(recvcmd.arg == rca);
                response = new(cSdCmdSendStatus, state);
                response = new(cSdCmdSendStatus, state);
                response.send(ICmd);
                response.send(ICard);
 
 
 
                -> InitDone;
 
 
 
        endtask
 
 
 
        task read();
 
                SDCommandR1 response;
 
                logic data[$];
 
                SdData sddata;
 
 
                // expect Read
                // expect Read
                recv();
                recv();
                assert(recvcmd.id == cSdCmdReadSingleBlock);
                assert(recvcmd.id == cSdCmdReadSingleBlock);
                // recvcmd.arg = address
                // recvcmd.arg = address
                response = new(cSdCmdReadSingleBlock, state);
                response = new(cSdCmdReadSingleBlock, state);
                response.send(ICmd);
                response.send(ICard);
 
 
                data = {};
                data = {};
                for(int i = 0; i < (512 * 8); i++)
                for(int i = 0; i < (512 * 8); i++)
                        data.push_back(1);
                        data.push_back(1);
 
 
                sddata.send(ICmd, data);
                sddata.send(ICard, data);
 
 
                -> InitDone;
 
 
 
        endtask
        endtask
 
 
        task recvCMD55(RCA_t rca);
        task recvCMD55(RCA_t rca);
                SDCommandR1 response;
                SDCommandR1 response;
Line 253... Line 261...
                assert(recvcmd.arg[31:16] == rca);
                assert(recvcmd.arg[31:16] == rca);
                state.recvCMD55();
                state.recvCMD55();
 
 
                // respond with R1
                // respond with R1
                response = new(cSdCmdNextIsACMD, state);
                response = new(cSdCmdNextIsACMD, state);
                response.send(ICmd);
                response.send(ICard);
        endtask
        endtask
 
 
        function automatic SDCommandToken getCmd();
        function automatic SDCommandToken getCmd();
                return recvcmd;
                return recvcmd;
        endfunction
        endfunction
 
 
 
 
        task recvCmd(input SDCommandToken cmd, output SDCommandResponse response);
 
                case (cmd.id)
 
                        cSdCmdGoIdleState: reset();
 
                        default: $display("SDCard: CmdId %d not implemented", cmd.id);
 
                endcase
 
        endtask
 
 
 
endclass
endclass
 
 
class NoSDCard extends SDCard;
class NoSDCard extends SDCard;
 
 
        function new(virtual ISdCmd CmdInterface, event CmdReceived, event InitDone);
        function new(virtual ISdCard CardInterface, event CmdReceived, event InitDone);
                super.new(CmdInterface, CmdReceived, InitDone);
                super.new(CardInterface, CmdReceived, InitDone);
        endfunction
        endfunction
 
 
        task automatic init();
        task automatic init();
        endtask
        endtask
 
 

powered by: WebSVN 2.1.0

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