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
    /sdhc-sc-core
    from Rev 148 to Rev 149
    Reverse comparison

Rev 148 → Rev 149

/trunk/src/grpSd/unitSdCardModel/src/SdBusTrans.sv
0,0 → 1,40
`ifndef SDBUSTRANS_SV
`define SDBUSTRANS_SV
 
const logic cSdStartbit = 0;
const logic cSdEndbit = 1;
 
typedef logic SdBusTransData[$];
 
virtual class SdBusTrans;
virtual function SdBusTransData packToData();
endfunction
 
virtual function void unpackFromData(ref SdBusTransData data);
endfunction
endclass
 
class SdBusTransToken extends SdBusTrans;
logic transbit;
logic[5:0] id;
SDCommandArg arg;
aCrc7 crc;
 
function aCrc7 calcCrcOfToken();
logic temp[$] = { >> { cSdStartbit, this.transbit, this.id, this.arg}};
return calcCrc7(temp);
endfunction
 
virtual function SdBusTransData packToData();
SdBusTransData data = { >> {transbit, id, arg, crc}};
return data;
endfunction
virtual function void unpackFromData(ref SdBusTransData data);
{ >> {transbit, id, arg, crc}} = data;
endfunction
 
endclass;
 
`endif
/trunk/src/grpSd/unitSdCardModel/src/SdBFM-impl.sv
0,0 → 1,111
`ifndef SDBFMIMPL_SV
`define SDBFMIMPL_SV
 
function SdBFM::new(virtual ISdCard card);
this.ICard = card;
this.Log = new;
this.Sem = new(1);
 
// disable outputs
ICard.cb.Cmd <= 'z;
ICard.cb.Data <= 'z;
endfunction
 
function SdBFM::stop(int AfterCount);
StopAfter = AfterCount;
endfunction
 
task SdBFM::send(input SdBusTrans token);
this.Sem.get(1);
// startbit
@ICard.cb;
ICard.cb.Cmd <= cSdStartbit;
 
// data
begin
SdBusTransData data = token.packToData();
 
foreach(data[i]) begin
@ICard.cb;
ICard.cb.Cmd <= data[i];
end
data.delete();
end
 
// endbit
@ICard.cb;
ICard.cb.Cmd <= cSdEndbit;
 
@ICard.cb;
ICard.cb.Cmd <= 'z;
 
this.Sem.put(1);
endtask
 
task SdBFM::receive(output SdBusTransToken token);
this.Sem.get(1);
 
wait(ICard.cb.Cmd == cSdStartbit);
recv(token);
this.Sem.put(1);
endtask
 
task SdBFM::recv(output SdBusTransToken token);
token = new();
 
// data
begin
SdBusTransData data;
 
for (int i = 0; i < 46; i++) begin
@ICard.cb;
data.push_back(ICard.cb.Cmd);
end
 
token.unpackFromData(data);
end
 
// endbit
@ICard.cb;
assert(ICard.cb.Cmd == cSdEndbit) else
begin
this.Log.error("Received invalid endbit during SdBFM.receive.\n");
end
 
endtask
 
task SdBFM::receiveOrSend();
if(ICard.cb.Cmd == cSdStartbit) begin
SdBusTransToken token;
recv(token);
ReceivedTransMb.put(token);
end
else begin
int flag;
SdBusTransToken token;
 
flag = SendTransMb.try_get(token);
if (flag == 1) send(token);
else if (flag == -1) Log.error("Error accessing SendTransMb.");
end
endtask
 
task SdBFM::run();
while (StopAfter != 0) begin
receiveOrSend();
 
if (StopAfter > 0) StopAfter--;
end
endtask
 
task SdBFM::start();
fork
begin
run();
end
join_any
endtask
 
`endif
/trunk/src/grpSd/unitSdCardModel/src/SdBFM.sv
12,115 → 12,32
`include "Crc.sv"
`include "Logger.sv"
`include "SDCommandArg.sv"
`include "SdBusTrans.sv"
 
const logic cSdStartbit = 0;
const logic cSdEndbit = 1;
typedef mailbox #(SdBusTrans) SdBfmMb;
 
typedef logic SdBusTransData[$];
 
virtual class SdBusTrans;
virtual function SdBusTransData packToData();
endfunction
 
virtual function void unpackFromData(ref SdBusTransData data);
endfunction
endclass
 
class SdBusTransToken extends SdBusTrans;
logic transbit;
logic[5:0] id;
SDCommandArg arg;
aCrc7 crc;
 
function aCrc7 calcCrcOfToken();
logic temp[$] = { >> { cSdStartbit, this.transbit, this.id, this.arg}};
return calcCrc7(temp);
endfunction
 
virtual function SdBusTransData packToData();
SdBusTransData data = { >> {transbit, id, arg, crc}};
return data;
endfunction
virtual function void unpackFromData(ref SdBusTransData data);
{ >> {transbit, id, arg, crc}} = data;
endfunction
 
endclass;
 
class SdBFM;
 
virtual ISdCard.card ICard;
local semaphore sem;
local Logger log;
SdBfmMb ReceivedTransMb;
SdBfmMb SendTransMb;
local semaphore Sem;
local Logger Log;
local int StopAfter = -1;
 
function new(virtual ISdCard card);
this.ICard = card;
this.log = new;
this.sem = new(1);
extern function new(virtual ISdCard card);
 
// disable outputs
ICard.cb.Cmd <= 'z;
ICard.cb.Data <= 'z;
endfunction
extern task start(); // starts a thread for receiving and sending via mailboxes
extern function stop(int AfterCount); // stop the thread
 
task send(input SdBusTrans token);
this.sem.get(1);
// startbit
@ICard.cb;
ICard.cb.Cmd <= cSdStartbit;
extern task send(input SdBusTrans token);
extern task receive(output SdBusTransToken token);
 
// data
begin
SdBusTransData data = token.packToData();
extern local task recv(output SdBusTransToken token);
extern local task receiveOrSend();
extern local task run();
 
foreach(data[i]) begin
@ICard.cb;
ICard.cb.Cmd <= data[i];
end
data.delete();
end
 
// endbit
@ICard.cb;
ICard.cb.Cmd <= cSdEndbit;
 
@ICard.cb;
ICard.cb.Cmd <= 'z;
 
this.sem.put(1);
endtask
 
task receive(output SdBusTransToken token);
this.sem.get(1);
token = new();
 
wait(ICard.cb.Cmd == cSdStartbit);
// data
begin
SdBusTransData data;
 
for (int i = 0; i < 46; i++) begin
@ICard.cb;
data.push_back(ICard.cb.Cmd);
end
 
token.unpackFromData(data);
end
 
// endbit
@ICard.cb;
assert(ICard.cb.Cmd == cSdEndbit) else
begin
this.log.error("Received invalid endbit during SdBFM.receive.\n");
end
 
this.sem.put(1);
endtask
 
endclass
 
`include "SdBFM-impl.sv";
`endif
/trunk/src/grpSd/unitSdCardModel/src/SdCardModel.sv
32,7 → 32,7
local rand int datasize; // ram addresses = 2^datasize - 1; 512 byte blocks
constraint cdatasize {datasize > 1; datasize <= 32;}
 
local logic[512*8-1:0] ram[];
local bit[512*8-1:0] ram[];
function void post_randomize() ;
this.ram = new[2^(datasize-1)];

powered by: WebSVN 2.1.0

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