OpenCores
URL https://opencores.org/ocsvn/sdhc-sc-core/sdhc-sc-core/trunk

Subversion Repositories sdhc-sc-core

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 149 to Rev 150
    Reverse comparison

Rev 149 → Rev 150

/sdhc-sc-core/trunk/src/grpSd/unitSdCardModel/src/SdBusTrans.sv
1,17 → 1,24
`ifndef SDBUSTRANS_SV
`define SDBUSTRANS_SV
 
`include "SdDataBlock.sv"
 
const logic cSdStartbit = 0;
const logic cSdEndbit = 1;
 
typedef logic SdBusTransData[$];
 
virtual class SdBusTrans;
class SdBusTrans;
 
SdDataBlock DataBlocks[];
bit SendBusy = 0;
 
virtual function SdBusTransData packToData();
endfunction
 
virtual function void unpackFromData(ref SdBusTransData data);
endfunction
 
endclass
 
class SdBusTransToken extends SdBusTrans;
/sdhc-sc-core/trunk/src/grpSd/unitSdCardModel/src/SdBFM-impl.sv
1,7 → 1,7
`ifndef SDBFMIMPL_SV
`define SDBFMIMPL_SV
 
function SdBFM::new(virtual ISdCard card);
function SdBFM::new(virtual ISdBus card);
this.ICard = card;
this.Log = new;
this.Sem = new(1);
15,9 → 15,7
StopAfter = AfterCount;
endfunction
 
task SdBFM::send(input SdBusTrans token);
this.Sem.get(1);
task SdBFM::sendCmd(inout SdBusTransData data);
// startbit
@ICard.cb;
ICard.cb.Cmd <= cSdStartbit;
24,7 → 22,6
 
// data
begin
SdBusTransData data = token.packToData();
 
foreach(data[i]) begin
@ICard.cb;
39,7 → 36,95
 
@ICard.cb;
ICard.cb.Cmd <= 'z;
waitUntilReady();
endtask
 
task SdBFM::sendAllDataBlocks(SdDataBlock blocks[]);
foreach(blocks[i]) begin
sendDataBlock(blocks[i]);
waitUntilReady();
end
endtask
 
task SdBFM::waitUntilReady();
repeat (8) @ICard.cb;
endtask
 
task SdBFM::sendDataBlock(SdDataBlock block);
if (Mode == standard) sendStandardDataBlock(block.data);
else sendWideDataBlock(block.data);
endtask
 
task SdBFM::sendStandardDataBlock(logic data[$]);
data.push_front(0); // startbit
CrcOnContainer(data);
data.push_back(1); // endbit
 
foreach(data[i]) begin
@ICard.cb;
ICard.cb.Data[0] <= data[i];
end
 
@ICard.cb;
ICard.cb.Data <= 'z;
endtask
 
task SdBFM::sendWideDataBlock(logic data[$]);
logic dat0[$];
logic dat1[$];
logic dat2[$];
logic dat3[$];
 
for (int i = 0; i < data.size(); i+=4) begin
dat3.push_back(data[i]);
dat2.push_back(data[i+1]);
dat1.push_back(data[i+2]);
dat0.push_back(data[i+3]);
end
CrcOnContainer(dat0);
CrcOnContainer(dat1);
CrcOnContainer(dat2);
CrcOnContainer(dat3);
 
@ICard.cb;
ICard.cb.Data <= 0;
 
for(int i = 0; i < dat0.size(); i++) begin
@ICard.cb;
ICard.cb.Data <= (dat3[i]<<3) + (dat2[i] <<2) + (dat1[i] <<1) + dat0[i];
end
@ICard.cb;
ICard.cb.Data <= 0;
 
@ICard.cb;
ICard.cb.Data <= 'z;
endtask
 
task SdBFM::sendBusy();
@ICard.cb;
// 10 busy cycles
ICard.cb.Data[0] <= 0;
repeat (10) @ICard.cb;
ICard.cb.Data[0] <= 1;
 
@ICard.cb;
ICard.cb.Data <= 'z;
endtask
 
task SdBFM::send(input SdBusTrans token);
SdBusTransData data;
this.Sem.get(1);
data = token.packToData();
if (data.size() > 0) sendCmd(data);
if (token.DataBlocks.size() > 0) sendAllDataBlocks(token.DataBlocks);
else if (token.SendBusy == 1) sendBusy();
this.Sem.put(1);
endtask
 
73,9 → 158,54
begin
this.Log.error("Received invalid endbit during SdBFM.receive.\n");
end
endtask
 
task SdBFM::receiveDataBlock(output SdDataBlock block);
ICard.cb.Data <= 'bzzzz;
 
if (Mode == wide) wait (ICard.cb.Data == 'b0000);
else wait (ICard.cb.Data[0] == '0);
 
recvDataBlock(block);
endtask
 
task SdBFM::recvDataBlock(output SdDataBlock block);
if (Mode == standard) recvStandardDataBlock(block);
else recvWideDataBlock(block);
endtask
 
task SdBFM::recvStandardDataBlock(output SdDataBlock block);
Log.error("recvStandardDataBlock not implemented");
endtask
 
task SdBFM::recvWideDataBlock(output SdDataBlock block);
aCrc16 crc[4];
block = new();
 
$display("Startbits: %t", $time);
for (int j = 0; j <= 512*2; j++) begin
@ICard.cb;
for(int i = 0; i < 4; i++) begin
block.data.push_back(ICard.cb.Data[i]);
end
end
 
// crc
for (int j = 0; j < 16; j++) begin
@ICard.cb;
for(int i = 0; i < 4; i++) begin
crc[i] = ICard.cb.Data[i];
end
end
 
// TODO: check crc
 
// end bits
@ICard.cb;
$display("Endbits: %h, %t", ICard.cb.Data, $time);
assert(ICard.cb.Data == 'b1111);
endtask
 
task SdBFM::receiveOrSend();
if(ICard.cb.Cmd == cSdStartbit) begin
SdBusTransToken token;
/sdhc-sc-core/trunk/src/grpSd/unitSdCardModel/src/SdBFM.sv
8,7 → 8,7
`ifndef SDBFM_SV
`define SDBFM_SV
 
`include "SdCmdInterface.sv"
`include "SdBusInterface.sv"
`include "Crc.sv"
`include "Logger.sv"
`include "SDCommandArg.sv"
15,28 → 15,44
`include "SdBusTrans.sv"
 
typedef mailbox #(SdBusTrans) SdBfmMb;
typedef enum {
standard,
wide
} Mode_t;
 
class SdBFM;
 
virtual ISdCard.card ICard;
virtual ISdBus.card ICard;
SdBfmMb ReceivedTransMb;
SdBfmMb SendTransMb;
local semaphore Sem;
local Logger Log;
local int StopAfter = -1;
Mode_t Mode;
extern function new(virtual ISdBus card);
 
extern function new(virtual ISdCard card);
 
extern task start(); // starts a thread for receiving and sending via mailboxes
extern function stop(int AfterCount); // stop the thread
 
extern task send(input SdBusTrans token);
extern task sendBusy();
extern task receive(output SdBusTransToken token);
extern task receiveDataBlock(output SdDataBlock block);
extern task waitUntilReady();
 
extern local task sendCmd(inout SdBusTransData data);
extern local task sendAllDataBlocks(SdDataBlock blocks[]);
extern local task sendDataBlock(SdDataBlock block);
extern local task sendStandardDataBlock(logic data[$]);
extern local task sendWideDataBlock(logic data[$]);
extern local task recvDataBlock(output SdDataBlock block);
extern local task recvStandardDataBlock(output SdDataBlock block);
extern local task recvWideDataBlock(output SdDataBlock block);
extern local task recv(output SdBusTransToken token);
extern local task receiveOrSend();
extern local task run();
 
local semaphore Sem;
local Logger Log;
local int StopAfter = -1;
endclass
 
`include "SdBFM-impl.sv";
/sdhc-sc-core/trunk/src/grpSd/unitSdCardModel/src/SdDataBlock.sv
0,0 → 1,29
//
// file: SdData.sv
// author: Rainer Kastl
//
// Class for sending and receiving data (SD spec 2.00)
//
 
`ifndef SDDATA
`define SDDATA
typedef enum {
usual,
widewidth
} DataMode_t;
 
function automatic void CrcOnContainer(ref logic data[$]);
aCrc16 crc = 0;
crc = calcCrc16(data);
 
for (int i = 15; i >= 0; i--)
data.push_back(crc[i]);
endfunction
 
class SdDataBlock;
DataMode_t Mode;
logic data[$];
endclass
 
`endif
/sdhc-sc-core/trunk/src/grpSd/unitSdCardModel/src/SdCardModel.sv
13,13 → 13,11
 
`include "Crc.sv";
`include "SdCommand.sv";
`include "SdData.sv";
`include "SdBFM.sv";
`include "Logger.sv";
 
class SDCard;
local SdBFM bfm;
local virtual ISdCard.card ICard;
local SDCardState state;
local RCA_t rca;
local logic CCS;
27,8 → 25,6
local DataMode_t datamode;
local Logger log;
 
local event CmdReceived, InitDone;
 
local rand int datasize; // ram addresses = 2^datasize - 1; 512 byte blocks
constraint cdatasize {datasize > 1; datasize <= 32;}
 
38,12 → 34,9
this.ram = new[2^(datasize-1)];
endfunction
 
function new(virtual ISdCard CardInterface, event CmdReceived, event InitDone);
ICard = CardInterface;
bfm = new(CardInterface);
function new(SdBFM bfm);
this.bfm = bfm;
state = new();
this.CmdReceived = CmdReceived;
this.InitDone = InitDone;
this.CCS = 1;
rca = 0;
mode = standard;
61,7 → 54,6
SDOCR ocr;
SDCommandR6 rcaresponse;
logic data[$];
SdData sddata;
SdBusTransToken token;
 
log.note("Expecting CMD0");
156,21 → 148,19
this.bfm.receive(token);
assert(token.id == cSdCmdSendSCR);
 
// respond with R1
// respond with R1 and dummy SCR
response = new(cSdCmdSendSCR, state);
this.bfm.send(response);
 
repeat(2) @ICard.cb;
 
response.DataBlocks = new[1];
response.DataBlocks[0] = new();
// send dummy SCR
for (int i = 0; i < 64; i++)
data.push_back(0);
response.DataBlocks[0].data.push_back(0);
data[63-50] = 1;
data[63-48] = 1;
response.DataBlocks[0].data[63-50] = 1;
response.DataBlocks[0].data[63-48] = 1;
 
sddata = new(standard, widewidth);
sddata.send(ICard, data);
this.bfm.send(response);
 
// expect ACMD6
recvCMD55(rca);
182,7 → 172,7
response = new(cSdCmdSetBusWidth, state);
this.bfm.send(response);
 
sddata.mode = wide;
this.bfm.Mode = wide;
mode = wide;
 
// expect CMD6
190,18 → 180,18
this.bfm.receive(token);
assert(token.id == cSdCmdSwitchFuntion);
assert(token.arg == 'h00FFFFF1);
this.bfm.send(response);
 
// send status data structure
data = {};
response.DataBlocks = new[1];
response.DataBlocks[0] = new();
for (int i = 0; i < 512; i++)
data.push_back(0);
response.DataBlocks[0].data.push_back(0);
 
data[511-401] = 1;
data[511-376] = 1;
sddata.send(ICard, data);
response.DataBlocks[0].data[511-401] = 1;
response.DataBlocks[0].data[511-376] = 1;
 
this.bfm.send(response);
 
// expect CMD6 with set
log.note("Expect CMD6 with set");
this.bfm.receive(token);
209,16 → 199,6
assert(token.arg == 'h80FFFFF1);
this.bfm.send(response);
 
// send status data structure
data = {};
for (int i = 0; i < 512; i++)
data.push_back(0);
 
data[511-401] = 1;
data[511-376] = 1;
sddata.send(ICard, data);
 
// switch to 50MHz
// expect CMD13
log.note("Expect CMD13");
228,8 → 208,6
response = new(cSdCmdSendStatus, state);
this.bfm.send(response);
 
-> InitDone;
 
endtask
 
task run();
253,9 → 231,7
 
task read(SdBusTransToken token);
SDCommandR1 response;
logic data[$];
logic[31:0] addr;
SdData sddata = new(mode, usual);
 
// expect Read
assert(token.id == cSdCmdReadSingleBlock);
262,48 → 238,48
addr = token.arg[0];
assert(addr < ram.size());
response = new(cSdCmdReadSingleBlock, state);
this.bfm.send(response);
 
data = {};
response.DataBlocks = new[1];
response.DataBlocks[0] = new();
for (int i = 0; i < 512; i++) begin
for (int j = 7; j >= 0; j--) begin
data.push_back(ram[addr][i*8 + j]);
response.DataBlocks[0].data.push_back(ram[addr][i*8 + j]);
end
end
 
sddata.send(ICard, data);
this.bfm.send(response);
endtask
 
task write(SdBusTransToken token);
SDCommandR1 response;
SdData sddata = new(this.mode, widewidth);
logic rddata[$];
SdDataBlock rdblock;
logic[31:0] addr;
 
// expect Write
assert(token.id == cSdCmdWriteSingleBlock);
addr = token.arg[0];
addr = token.arg;
assert(addr < ram.size());
response = new(cSdCmdWriteSingleBlock, state);
this.bfm.send(response);
 
// recv data
sddata.recv(ICard, rddata);
$display("rddata: %p", rddata);
this.bfm.receiveDataBlock(rdblock);
$display("rddata: %p", rdblock.data);
 
$display("datasize: %h", datasize);
$display("Address (token): %h", token.arg);
$display("Address: %h", addr);
 
// write into ram
for (int i = 0; i < 512; i++) begin
for (int j = 7; j >= 0; j--) begin
ram[addr][i * 8 + j] = rddata.pop_front();
ram[addr][i * 8 + j] = rdblock.data.pop_front();
end
end
 
repeat (8) @ICard.cb;
sddata.sendBusy(ICard);
 
this.bfm.waitUntilReady();
this.bfm.sendBusy();
$display("Ram at write address: %h", ram[addr]);
 
endtask
327,8 → 303,8
 
class NoSDCard extends SDCard;
 
function new(virtual ISdCard CardInterface, event CmdReceived, event InitDone);
super.new(CardInterface, CmdReceived, InitDone);
function new(SdBFM bfm);
super.new(bfm);
endfunction
 
task automatic init();
/sdhc-sc-core/trunk/src/grpSd/unitSdCardModel/src/SdBusInterface.sv
0,0 → 1,26
//
// file: ../../unitSdVerificationTestbench/src/SdCmdInterface.sv
// author: Rainer Kastl
//
// Interface for the SdCmd entity
//
 
`ifndef SDBUSINTERFACE_SV
`define SDBUSINTERFACE_SV
 
interface ISdBus;
wire Cmd;
logic SClk;
wire[3:0] Data;
 
clocking cb @(posedge SClk);
inout Cmd;
inout Data;
endclocking
 
modport card (clocking cb);
 
endinterface
 
`endif
 
/sdhc-sc-core/trunk/src/grpSd/unitTestWbMaster/src/TestWbMaster-e.vhdl
0,0 → 1,41
--
-- Title: Wishbone master for test purpose
-- File: TestWbMaster-e.vhdl
-- Author: Copyright 2010: Rainer Kastl
-- Standard: VHDL'93
--
-- Description: Writes a block on the card and reads it back
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity TestWbMaster is
port (
-- Wishbone interface
CLK_I : in std_ulogic;
RST_I : in std_ulogic;
 
-- Wishbone master
ERR_I : in std_ulogic;
RTY_I : in std_ulogic;
ACK_I : in std_ulogic;
DAT_I : in std_ulogic_vector(31 downto 0);
 
CYC_O : out std_ulogic;
STB_O : out std_ulogic;
WE_O : out std_ulogic;
CTI_O : out std_ulogic_vector(2 downto 0);
BTE_O : out std_ulogic_vector(1 downto 0);
 
ADR_O : out std_ulogic_vector(6 downto 4);
DAT_O : out std_ulogic_vector(31 downto 0);
SEL_O : out std_ulogic_vector(0 downto 0);
 
-- status signal
ERR_O : out std_ulogic;
DON_O : out std_ulogic
);
end entity TestWbMaster;
 
/sdhc-sc-core/trunk/src/grpSd/unitTestWbMaster/src/TestWbMaster-Rtl-a.vhdl
0,0 → 1,175
--
-- Title: Architecture of TestWbMaster
-- File: TestWbMaster-Rtl-a.vhdl
-- Author: Copyright 2010: Rainer Kastl
-- Standard: VHDL'93
--
-- Description:
--
 
architecture Rtl of TestWbMaster is
 
type aState is (startAddr, writeBuffer, write, readbuffer, read, done);
subtype aCounter is unsigned(7 downto 0); -- 128 * 32 bit = 512 byte
 
type aWbState is (idle, write, read);
 
type aReg is record
 
State : aState;
Counter : aCounter;
WbState : aWbState;
Err : std_ulogic;
 
end record aReg;
 
signal R, NxR : aReg;
 
begin
 
Regs : process (CLK_I)
begin
if (rising_edge(CLK_I)) then
 
if (RST_I = '1') then
-- sync. reset
R.State <= startAddr;
R.Counter <= (others => '0');
R.WbState <= write;
R.Err <= '0';
 
else
R <= NxR;
 
end if;
 
end if;
end process Regs;
 
StateMachine : process (R, ERR_I, RTY_I, ACK_I, DAT_I)
begin
 
-- default assignment
NxR <= R;
ERR_O <= R.Err;
CTI_O <= "000";
CYC_O <= '0';
WE_O <= '0';
SEL_O <= "0";
STB_O <= '0';
ADR_O <= "000";
DAT_O <= (others => '0');
BTE_O <= "00";
DON_O <= '0';
 
-- we don´t care for errors or retrys
if (ERR_I = '1' or RTY_I = '1') then
NxR.Err <= '1';
end if;
 
case R.WbState is
when idle =>
null;
 
when write =>
-- write data
CTI_O <= "000";
CYC_O <= '1';
WE_O <= '1';
SEL_O <= "1";
STB_O <= '1';
 
if (ACK_I = '1') then
if (R.Counter = 128) then
NxR.Counter <= (others => '0');
else
NxR.Counter <= R.Counter + 1;
end if;
end if;
 
when read =>
-- read data
CTI_O <= "000";
CYC_O <= '1';
WE_O <= '0';
SEL_O <= "1";
STB_O <= '1';
 
if (ACK_I = '1') then
-- check data
--if to_unsigned(to_integer(DAT_I),32) /= to_unsigned(R.Counter, 32) then
-- NxR.Err <= '1';
--end if;
 
if (R.Counter = 128) then
NxR.Counter <= (others => '0');
NxR.WbState <= idle;
else
NxR.Counter <= R.Counter + 1;
end if;
end if;
 
when others =>
report "Invalid wbState" severity error;
end case;
case R.State is
when startAddr =>
ADR_O <= "001";
DAT_O <= X"00000004";
 
if (ACK_I = '1') then
NxR.State <= writeBuffer;
NxR.Counter <= (others => '0');
NxR.WbState <= write;
end if;
 
when writeBuffer =>
ADR_O <= "100"; -- write data
DAT_O <= std_ulogic_vector(R.Counter) & std_ulogic_vector(R.Counter) &
std_ulogic_vector(R.Counter) & std_ulogic_vector(R.Counter);
 
if (R.Counter = 128) then
NxR.State <= write;
NxR.Counter <= to_unsigned(128, aCounter'length);
NxR.WbState <= write;
end if;
 
when write =>
ADR_O <= "000";
DAT_O <= X"00000010"; -- start write operation
 
if (ACK_I = '1') then
NxR.State <= done;
NxR.WbState <= idle;
end if;
 
when read =>
ADR_O <= "000";
DAT_O <= X"00000001"; -- start read operation
 
if (ACK_I = '1') then
NxR.State <= readBuffer;
NxR.WbState <= read;
end if;
when readBuffer =>
ADR_O <= "011"; -- read data
if (R.Counter = 128) then
NxR.Counter <= (others => '0');
NxR.State <= done;
NxR.WbState <= idle;
end if;
 
when done =>
DON_O <= '1';
 
when others =>
report "Invalid state" severity error;
end case;
end process StateMachine;
 
 
end architecture Rtl;
/sdhc-sc-core/trunk/src/grpSd/unitSdTop/src/SdTop-Rtl-ea.vhdl
67,6 → 67,7
signal iSdWbSync, oSdControllerSync : aSdWbSlaveToSdController;
signal iSdControllerSync, oSdWbSync : aSdControllerToSdWbSlave;
signal SdStrobe : std_ulogic;
signal SdInStrobe : std_ulogic;
signal HighSpeed : std_ulogic;
signal iCmd : aiSdCmd;
signal oCmd : aoSdCmd;
209,6 → 210,7
iHighSpeed => HighSpeed,
iDisable => DisableSdClk,
oSdStrobe => SdStrobe,
oSdInStrobe => SdInStrobe,
oSdCardClk => oSClk
);
 
217,6 → 219,7
 
iClk => iSdClk,
iRstSync => iRstSync,
iStrobe => SdInStrobe,
iCmd => ioCmd,
iData => ioData,
oCmdSync => iCmd.Cmd,
/sdhc-sc-core/trunk/src/grpSd/unitSdClockMaster/src/SdClockMaster-Rtl-a.vhdl
15,6 → 15,7
Counter : aCounter;
Clk : std_ulogic;
Strobe : std_ulogic;
InStrobe : std_ulogic;
HighSpeed : std_ulogic;
end record aRegSet;
 
25,6 → 26,7
-- connect outputs with registers
oSdCardClk <= R.Clk;
oSdStrobe <= R.Strobe;
oSdInStrobe <= R.InStrobe;
 
Regs : process (iClk, iRstSync)
begin
36,6 → 38,7
R.Counter <= to_unsigned(0, R.Counter'length);
R.Clk <= cInactivated;
R.Strobe <= cInactivated;
R.InStrobe <= cInactivated;
R.HighSpeed <= cInactivated;
 
else
62,19 → 65,27
NxR.Clk <= R.Counter(1);
 
case R.Counter is
when "00" | "01" | "11" =>
when "00" | "11" =>
NxR.Strobe <= cInactivated;
NxR.InStrobe <= cInactivated;
 
when "10" =>
NxR.Strobe <= cActivated;
NxR.InStrobe <= cInactivated;
 
when "01" =>
NxR.InStrobe <= cActivated;
NxR.Strobe <= cInactivated;
 
when others =>
NxR.Strobe <= 'X';
NxR.InStrobe <= 'X';
end case;
 
when cActivated => -- High-Speed mode
NxR.Clk <= R.Counter(0);
NxR.Strobe <= R.Counter(0);
NxR.InStrobe <= not R.Counter(0);
 
when others =>
NxR.Clk <= 'X';
100,10 → 111,12
when cActivated =>
-- disable strobes and do not increment the counter
NxR.Strobe <= cInactivated;
NxR.InStrobe <= cInactivated;
 
when others =>
NxR.Clk <= 'X';
NxR.Strobe <= 'X';
NxR.InStrobe <= 'X';
 
end case;
 
/sdhc-sc-core/trunk/src/grpSd/unitSdClockMaster/src/SdClockMaster-e.vhdl
25,6 → 25,7
iDisable : in std_ulogic; -- Disables the clock output
 
oSdStrobe : out std_ulogic; -- strobe signal to enable SdCmd and SdData
oSdInStrobe : out std_ulogic; -- strobe signal to capture the input cmd and data
oSdCardClk : out std_ulogic -- clock output to SD card
);
 
/sdhc-sc-core/trunk/src/grpSd/unitSdData/src/SdData-Rtl-a.vhdl
334,7 → 334,7
case R.Mode is
when wide =>
for i in 0 to 3 loop
temp(i) := R.Word(to_integer(RBitInWordC) - i);
temp(3 - i) := R.Word(to_integer(RBitInWordC) - i);
end loop;
 
when standard =>
/sdhc-sc-core/trunk/src/grpSd/unitTbdSd/Files.tcl
29,6 → 29,11
Sd SdTop {Rtl}
Sd TbdSd {Rtl}}
 
set tb {Sd TbdSd {Bhv}}
set svunits {Sd TbdSd}
 
set sysvlogparams [list +incdir+../../unitSdCardModel/src+../src+../../unitSdWbSlave/src+../../../grpVerification/unitLogger/src/]
 
#set tb
set top Testbed
 
 
/sdhc-sc-core/trunk/src/grpSd/unitTbdSd/src/TbdSd.sv
0,0 → 1,60
//
// file: ../../unitSdVerificationTestbench/src/SdVerificationTestbench.sv
// author: Rainer Kastl
//
// SystemVerilog Testbench testing SdCmd and SdController
//
 
`ifndef SDVERIFICATIONTESTBENCH
`define SDVERIFICATIONTESTBENCH
 
`include "SdCardModel.sv";
 
program Test(ISdBus SdBus);
initial begin
SdBusTransToken token;
SdBFM SdBfm = new(SdBus);
SDCard card = new(SdBfm);
assert(card.randomize());
 
fork
begin // generator
end
 
begin // monitor
end
 
begin // driver for SdCardModel
card.run();
end
 
join;
 
$display("%t : Test completed.", $time);
end
endprogram
 
module Testbed();
logic Clk = 0;
logic nResetAsync = 0;
 
ISdBus CardInterface();
 
TbdSd top(
Clk,
nResetAsync,
CardInterface.Cmd,
CardInterface.SClk,
CardInterface.Data);
 
always #5 Clk <= ~Clk;
 
initial begin
#10 nResetAsync <= 1;
end
 
Test tb(CardInterface);
 
endmodule
 
`endif
/sdhc-sc-core/trunk/src/grpSd/unitTbdSd/src/TbdSd-Rtl-ea.vhdl
62,9 → 62,12
signal oRty : std_ulogic;
 
signal ErrorLed, DoneLed : std_ulogic;
signal LedBank : std_ulogic_vector(7 downto 0);
 
begin
 
oLedBank <= LedBank(7 downto 1) & DoneLed;
 
Reg : process (iClk) is
begin
if (rising_edge(iClk)) then
125,7 → 128,7
ioCmd => ioCmd,
oSclk => oSclk,
ioData => ioData,
oLedBank => oLedBank
oLedBank => LedBank
);
 
TestWbMaster_inst : entity work.TestWbMaster
/sdhc-sc-core/trunk/src/grpSd/unitSdController/src/SdController-Rtl-a.vhdl
558,6 → 558,7
 
when read =>
NextR.ToSdData.DataMode <= usual;
oLedBank(0) <= cActivated;
 
case R.Region is
when send =>
604,6 → 605,7
 
when write =>
NextR.ToSdData.DataMode <= usual;
oLedBank(1) <= cActivated;
 
case R.Region is
when send =>
/sdhc-sc-core/trunk/src/grpSd/unitSdCardSynchronizer/src/SdCardSynchronizer-Rtl-ea.vhdl
21,6 → 21,7
 
iClk : in std_ulogic;
iRstSync : in std_ulogic;
iStrobe : in std_ulogic;
iCmd : in std_logic;
iData : in std_logic_vector(3 downto 0);
oCmdSync : out std_ulogic;
50,17 → 51,19
 
else
 
-- register input data
CmdSync(0) <= iCmd;
DataSync(0) <= std_ulogic_vector(iData);
if (iStrobe = cActivated) then
-- register input data
CmdSync(0) <= iCmd;
DataSync(0) <= std_ulogic_vector(iData);
 
-- additional synchronization FFs
for i in 1 to gSyncCount - 1 loop
-- additional synchronization FFs
for i in 1 to gSyncCount - 1 loop
 
CmdSync(i) <= CmdSync(i - 1);
DataSync(i) <= DataSync(i - 1);
CmdSync(i) <= CmdSync(i - 1);
DataSync(i) <= DataSync(i - 1);
 
end loop;
end loop;
end if;
end if;
end if;
end process Reg;

powered by: WebSVN 2.1.0

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