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 155 to Rev 156
- ↔ Reverse comparison
Rev 155 → Rev 156
/trunk/src/grpSd/unitSdWbSlave/src/WbTransaction.sv
15,6 → 15,9
rand WbAddr Addr; |
rand WbData Data; |
|
function void display(); |
$display("Transaction: %s, %s, %b, %b", Type.name(), Kind.name(), Addr, Data); |
endfunction |
endclass |
|
class WbTransactionSequence; |
26,17 → 29,24
transactions.size() == size; |
|
foreach(transactions[i]) { |
if (i > 0) |
if (transactions[i-1].Type == WbTransaction::Burst) |
if (i > 0) { |
if (transactions[i].Type == WbTransaction::Burst) |
transactions[i].Type == WbTransaction::Burst || WbTransaction::End; |
} |
} |
|
if (transactions[size - 1].Type == WbTransaction::Burst) |
transactions[size].Type == WbTransaction::End; |
if (transactions[size - 2].Type == WbTransaction::Burst) |
transactions[size - 1].Type == WbTransaction::End; |
}; |
|
function void display(); |
foreach(transactions[i]) |
transactions[i].display(); |
endfunction |
|
endclass |
|
|
typedef mailbox #(WbTransaction) WbTransMb; |
|
`endif |
/trunk/src/grpSd/pkgSdWb/src/SdWb.sv
0,0 → 1,16
`ifndef SDWB_SV |
`define SDWB_SV |
|
`include "WbTransaction.sv"; |
|
const WbData cOperationRead = 'h00000001; |
const WbData cOperationWrite = 'h00000010; |
|
const WbAddr cOperationAddr = 'b000; |
const WbAddr cStartAddrAddr = 'b001; |
const WbAddr cEndAddrAddr = 'b010; |
const WbAddr cReadDataAddr = 'b011; |
const WbAddr cWriteDataAddr = 'b100; |
|
`endif |
|
/trunk/src/grpSd/unitSdVerificationTestbench/Files.tcl
30,7 → 30,7
set svunits {Sd SdCardModel |
Sd SdVerificationTestbench} |
|
set sysvlogparams [list +incdir+../../unitSdCardModel/src+../src+../../unitSdWbSlave/src+../../../grpVerification/unitLogger/src/+../../../grpSdVerification/unitSdCoreTransactionBFM/src+../../../grpSdVerification/unitSdCoreTransactionSeqGen/src+../../../grpSdVerification/unitSdCoreTransferFunction/src+../../../grpSdVerification/unitSdCoreChecker/src+../../../grpSdVerification/unitSdCoreTransaction/src] |
set sysvlogparams [list +incdir+../../unitSdCardModel/src+../src+../../unitSdWbSlave/src+../../../grpVerification/unitLogger/src/+../../../grpSdVerification/unitSdCoreTransactionBFM/src+../../../grpSdVerification/unitSdCoreTransactionSeqGen/src+../../../grpSdVerification/unitSdCoreTransferFunction/src+../../../grpSdVerification/unitSdCoreChecker/src+../../../grpSdVerification/unitSdCoreTransaction/src+../../pkgSdWb/src/] |
|
#set tb |
set top Testbed |
/trunk/src/grpSd/unitSdVerificationTestbench/src/SdVerificationTestbench.sv
24,12 → 24,17
initial begin |
SdCardModel card; |
Harness harness; |
Logger log; |
|
log = new(); |
card = new(); |
harness = new(SdBus, WbBus); |
harness.Card = card; |
|
harness.start(); |
#1ms; |
|
log.terminate(); |
end |
endprogram |
|
/trunk/src/grpSdVerification/unitSdCoreTransaction/src/SdCoreTransaction.sv
1,7 → 1,7
`ifndef SDCORETRANSACTION_SV |
`define SDCORETRANSACTION_SV |
|
typedef bit[511:0] DataBlock; |
typedef bit[0:511][7:0] DataBlock; |
|
class SdCoreTransaction; |
|
23,6 → 23,8
else { |
data.size() == 0; |
} |
|
kind == readSingleBlock; |
}; |
|
endclass |
/trunk/src/grpSdVerification/unitSdCoreTransactionBFM/src/SdCoreTransactionBFM.sv
3,6 → 3,7
|
`include "SdCoreTransaction.sv"; |
`include "WbTransaction.sv"; |
`include "WbTransactionReadSingleBlock.sv"; |
|
class SdCoreTransactionBFM; |
|
23,10 → 24,30
task run(); |
while (StopAfter != 0) begin |
SdCoreTransaction trans; |
WbTransactionSequence seq; |
|
SdTransInMb.get(trans); |
Log.note("TransBFM transaction received: TODO: split up and send"); |
|
case (trans.kind) |
SdCoreTransaction::readSingleBlock: |
begin |
WbTransactionSequenceReadSingleBlock tmp = new(trans.startAddr, trans.endAddr); |
seq = tmp; |
end |
default: |
begin |
string msg; |
$swrite(msg, "Transaction kind %s not handled.", trans.kind.name()); |
Log.error(msg); |
end |
endcase |
|
assert (seq.randomize()) else Log.error("Randomizing WbTransactionSequence seq failed."); |
seq.display(); |
|
foreach(seq.transactions[i]) |
WbTransOutMb.put(seq.transactions[i]); |
|
if (StopAfter > 0) StopAfter--; |
end |
endtask |
/trunk/src/grpSdVerification/unitSdCoreTransactionBFM/src/WbTransactionReadSingleBlock.sv
0,0 → 1,51
`ifndef WBTRANSACTIONREADSINGLEBLOCK_SV |
`define WBTRANSACTIONREADSINGLEBLOCK_SV |
|
`include "WbTransaction.sv"; |
`include "SdWb.sv"; |
|
class WbTransactionSequenceReadSingleBlock extends WbTransactionSequence; |
|
WbAddr StartAddr; |
WbAddr EndAddr; |
|
function new(WbAddr StartAddr, WbAddr EndAddr); |
size = 1 + 1 + 1; // startaddr, endaddr, operation |
|
transactions = new[size]; |
foreach(transactions[i]) |
transactions[i] = new(); |
|
this.StartAddr = StartAddr; |
this.EndAddr = EndAddr; |
endfunction |
|
constraint ReadSingleBlock { |
transactions[2].Addr == cOperationAddr; |
transactions[2].Data == cOperationRead; |
|
transactions[0].Addr == cStartAddrAddr || cEndAddrAddr; |
if (transactions[0].Addr == cStartAddrAddr) { |
transactions[1].Addr == cEndAddrAddr; |
transactions[1].Data == EndAddr; |
transactions[0].Data == StartAddr; |
} else if (transactions[0].Addr == cEndAddrAddr) { |
transactions[1].Addr == cStartAddrAddr; |
transactions[0].Data == EndAddr; |
transactions[1].Data == StartAddr; |
} |
|
foreach(transactions[i]) { |
if (i inside {[0:2]}) { |
transactions[i].Kind == WbTransaction::Write; |
} else { |
transactions[i].Kind == WbTransaction::Read; |
} |
} |
}; |
|
endclass |
|
|
`endif |
|