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/trunk/src/grpSd/unitSdCardModel/src
- from Rev 148 to Rev 149
- ↔ Reverse comparison
Rev 148 → Rev 149
/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 |
/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 |
/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 |
/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)]; |