OpenCores
URL https://opencores.org/ocsvn/sdcard_mass_storage_controller/sdcard_mass_storage_controller/trunk

Subversion Repositories sdcard_mass_storage_controller

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /sdcard_mass_storage_controller/trunk
    from Rev 134 to Rev 135
    Reverse comparison

Rev 134 → Rev 135

/bench/sdc_dma/verilog/sd_controller_top_tb.v
0,0 → 1,3101
//////////////////////////////////////////////////////////////////////
//// ////
//// sd_controller_top_tb.v ////
//// ////
//// This file is part of the SD IP core project ////
//// http://www.opencores.org/?do=project&who=sdcard_mass_storage_controller ////
//// ////
//// Author(s): ////
//// - Adam Edvardsson, adam@opencores.org ////
//// ////
//// ////
//////////////////////////////////////////////////////////////////////
//// WB Model, ideas and task borrowed from: ////
//// http://www.opencores.org/projects/ethmac/ ////
//// Author(s): ////
//// - Tadej Markovic, tadej@opencores.org ////
//// - Igor Mohor, igorM@opencores.org ////
//////////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2001, 2002 Authors ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
 
 
//`define TX_ERROR_TEST
`include "wb_model_defines.v"
`include "sd_defines.v"
`define TIME $display(" Time: %0t", $time)
 
`define BD_RX 8'h60
`define BD_TX 8'h80
 
`define argument 8'h00
`define command 8'h04
`define status 8'h08
`define resp1 8'h0c
`define controller 8'h1c
`define block 8'h20
`define power 8'h24
`define software 8'h28
`define timeout 8'h2c
`define normal_isr 8'h30
`define error_isr 8'h34
`define normal_iser 8'h38
`define error_iser 8'h3c
`define capa 8'h48
`define clock_d 8'h4c
`define bd_status 8'h50
`define bd_isr 8'h54
`define bd_iser 8'h58
`define bd_rx 8'h60
`define bd_tx 8'h80
`define BD_ISR 8'h54
`define SD_BASE 32'hd0000000
`define CMD2 16'h200
`define CMD3 16'h300
`define ACMD6 16'h600
`define CMD7 16'h700
`define CMD8 16'h800
`define CMD55 16'h3700
`define ACMD41 16'h2900
`define CMD8 16'h800
 
`define RSP_48 16'h2
`define RSP_136 16'h1
`define CICE 16'h10
`define CRCE 16'h08
 
module sd_controller_top_tb(
 
);
 
 
 
// WISHBONE common
reg wb_clk; // WISHBONE clock
reg wb_rst; // WISHBONE reset
wire [31:0] wbs_sds_dat_i; // WISHBONE data input
wire [31:0] wbs_sds_dat_o; // WISHBONE data output
// WISHBONE error output
// WISHBONE slave
wire [9:0] wbs_sds_adr_i; // WISHBONE address input
wire [3:0] wbs_sds_sel_i; // WISHBONE byte select input
wire wbs_sds_we_i; // WISHBONE write enable input
wire wbs_sds_cyc_i; // WISHBONE cycle input
wire wbs_sds_stb_i; // WISHBONE strobe input
wire wbs_sds_ack_o; // WISHBONE acknowledge output
// WISHBONE master
wire [31:0] wbm_sdm_adr_o;
wire [3:0] wbm_sdm_sel_o;
wire wbm_sdm_we_o;
 
wire [31:0] wbm_sdm_dat_i;
wire [31:0] wbm_sdm_dat_o;
wire wbm_sdm_cyc_o;
wire wbm_sdm_stb_o;
wire wbm_sdm_ack_i;
wire [2:0] wbm_sdm_cti_o;
wire [1:0] wbm_sdm_bte_o;
//Global variables
 
reg wbm_working; // tasks wbm_write and wbm_read set signal when working and reset it when stop working
integer tests_successfull;
integer tests_failed;
 
reg [3:0] wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
reg [3:0] wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
reg [3:0] wbs_waits; // wait cycles befor WB Slave responds
reg [7:0] wbs_retries; // if RTY response, then this is the number of retries before ACK
 
reg [799:0] test_name; // used for tb_log_file
//SD Card interface
 
wire sd_cmd_oe;
wire sd_dat_oe;
wire cmdIn;
wire [3:0] datIn;
 
trireg sd_cmd;
tri [3:0] sd_dat;
 
assign sd_cmd = sd_cmd_oe ? cmdIn: 1'bz;
assign sd_dat = sd_dat_oe ? datIn : 4'bz;
reg succes;
sdModel sdModelTB0
(
.sdClk (sd_clk_pad_o),
.cmd (sd_cmd),
.dat (sd_dat)
 
);
 
 
//Instaciate SD-Card controller
 
sdc_controller sd_controller_top_0
(
.wb_clk_i(wb_clk),
.wb_rst_i(wb_rst),
.wb_dat_i(wbs_sds_dat_i),
.wb_dat_o(wbs_sds_dat_o),
.wb_adr_i(wbs_sds_adr_i[7:0]),
.wb_sel_i(wbs_sds_sel_i),
.wb_we_i(wbs_sds_we_i),
.wb_stb_i(wbs_sds_stb_i),
.wb_cyc_i(wbs_sds_cyc_i),
.wb_ack_o(wbs_sds_ack_o),
.m_wb_adr_o(wbm_sdm_adr_o),
.m_wb_sel_o(wbm_sdm_sel_o),
.m_wb_we_o(wbm_sdm_we_o),
.m_wb_dat_o(wbm_sdm_dat_o),
.m_wb_dat_i(wbm_sdm_dat_i),
.m_wb_cyc_o(wbm_sdm_cyc_o),
.m_wb_stb_o(wbm_sdm_stb_o),
.m_wb_ack_i(wbm_sdm_ack_i),
.m_wb_cti_o(wbm_sdm_cti_o),
.m_wb_bte_o(wbm_sdm_bte_o),
.sd_cmd_dat_i(sd_cmd),
.sd_cmd_out_o (cmdIn ),
.sd_cmd_oe_o (sd_cmd_oe),
.sd_dat_dat_i ( sd_dat ), //sd_dat_pad_io),
.sd_dat_out_o (datIn ) ,
.sd_dat_oe_o ( sd_dat_oe ),
.sd_clk_o_pad (sd_clk_pad_o)
`ifdef SD_CLK_SEP
,sd_clk_i_pad
`endif
`ifdef IRQ_ENABLE
,.int_a (int_a),
.int_b (int_b),
.int_c (int_c)
`endif
);
 
integer host_log_file_desc;
WB_MASTER_BEHAVIORAL wb_master
(
.CLK_I(wb_clk),
.RST_I(wb_rst),
.TAG_I(0), //Not in use
.TAG_O(), //Not in use
.ACK_I(wbs_sds_ack_o),
.ADR_O(wbs_sds_adr_i), // only eth_sl_wb_adr_i[11:2] used
.CYC_O(wbs_sds_cyc_i),
.DAT_I(wbs_sds_dat_o),
.DAT_O(wbs_sds_dat_i),
.ERR_I(0), //Not in use
.RTY_I(1'b0), // inactive (1'b0)
.SEL_O(wbs_sds_sel_i),
.STB_O(wbs_sds_stb_i),
.WE_O (wbs_sds_we_i),
.CAB_O() // NOT USED for now!
);
integer memory_log_file_desc;
 
WB_SLAVE_BEHAVIORAL wb_slave
(
.CLK_I(wb_clk),
.RST_I(wb_rst),
.ACK_O(wbm_sdm_ack_i),
.ADR_I(wbm_sdm_adr_o),
.CYC_I(wbm_sdm_cyc_o),
.DAT_O(wbm_sdm_dat_i),
.DAT_I(wbm_sdm_dat_o),
.ERR_O(),
.RTY_O(), // NOT USED for now!
.SEL_I(wbm_sdm_sel_o),
.STB_I(wbm_sdm_stb_o),
.WE_I (wbm_sdm_we_o),
.CAB_I(1'b0)
);
 
integer phy_log_file_desc;
integer wb_s_mon_log_file_desc ;
integer wb_m_mon_log_file_desc ;
 
/*WB_BUS_MON wb_eth_slave_bus_mon
(
// WISHBONE common
.CLK_I(wb_clk),
.RST_I(wb_rst),
 
// WISHBONE slave
.ACK_I(wbs_sds_ack_o),
.ADDR_O({24'h0,wbs_sds_adr_i[7:0]}),
.CYC_O(wbs_sds_cyc_i),
.DAT_I(wbs_sds_dat_o),
.DAT_O(wbs_sds_dat_i),
.ERR_I(0),
.RTY_I(1'b0),
.SEL_O(wbs_sds_sel_i),
.STB_O(wbs_sds_stb_i),
.WE_O (wbs_sds_we_i),
.TAG_I(0),
`ifdef ETH_WISHBONE_B3
.TAG_O(),
`else
.TAG_O(5'h0),
`endif
.CAB_O(1'b0),
`ifdef ETH_WISHBONE_B3
.check_CTI (1'b1),
`else
.check_CTI (1'b0),
`endif
.log_file_desc (wb_s_mon_log_file_desc)
); */
 
WB_BUS_MON wb_eth_master_bus_mon
(
// WISHBONE common
.CLK_I(wb_clk),
.RST_I(wb_rst),
 
// WISHBONE master
.ACK_I(wbm_sdm_ack_i),
.ADDR_O(wbm_sdm_adr_o),
.CYC_O(wbm_sdm_cyc_o),
.DAT_I(wbm_sdm_dat_i),
.DAT_O(wbm_sdm_dat_o),
.ERR_I(0),
.RTY_I(1'b0),
.SEL_O(wbm_sdm_sel_o),
.STB_O(wbm_sdm_stb_o),
.WE_O (wbm_sdm_we_o),
.TAG_I(0),
.TAG_O(5'h0),
.CAB_O(1'b0),
.check_CTI(1'b0), // NO need
.log_file_desc(wb_m_mon_log_file_desc)
);
 
reg StartTB;
integer card_rca;
initial
begin
wait(StartTB);
succes = 1'b0;
// Initial global values
tests_successfull = 0;
tests_failed = 0;
wbm_working = 0;
card_rca=0;
wbm_init_waits = 4'h1;
wbm_subseq_waits = 4'h3;
wbs_waits = 4'h1;
wbs_retries = 8'h2;
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
// set DIFFERENT mrx_clk to mtx_clk!
// eth_phy.set_mrx_equal_mtx = 1'b0;
 
// Call tests
// ----------
//note test T5 only valid when SD is in Testmode (sd_tb_defines.v file)
$display("T0 Start");
test_access_to_reg(0, 1); // 0 - 1 //Test RW registers
$display("");
$display("===========================================================================");
$display("T0 test_access_to_reg Completed");
$display("===========================================================================");
$display("T1 Start");
test_send_cmd(0, 3);
// 0: Send CMD0, No Response ////
// 1: Send CMD3, 48-Bit Response, No error check
//2: Send CMD3, 48-Bit Response, All Error check
// 3: Send CMD2, 136-Bit Response
$display("");
$display("===========================================================================");
$display("T1 test_send_cmd Completed");
$display("===========================================================================");
 
$display("T2 Start");
test_init_sequnce(0, 1);
$display("");
$display("===========================================================================");
$display("T2 test_init_sequence Completed");
$display("===========================================================================");
$display("T3 Start");
test_send_data(0, 1);
$display("");
$display("===========================================================================");
$display("T3 test_send_data Completed");
$display("===========================================================================");
// test_send_rec_data
$display("T4 Start");
test_send_rec_data(0, 1);
$display("");
$display("===========================================================================");
$display("T4 test_send_rec_data Completed");
$display("===========================================================================");
//test_send_rec_data
$display("T5 Start");
test_send_cmd_error_rsp(0, 3);
$display("");
$display("===========================================================================");
$display("T5 test_send_cmd_error_rsp Complete");
$display("===========================================================================");
// test_send_rec_data_error_rsp
//test_send_rec_data_error_rsp(0, 1);
// $display("");
// $display("===========================================================================");
// $display("T6 test_send_cmd_error_rsp Complete");
// $display("===========================================================================");
$display("All Tests past");
succes = 1'b1;
end
 
 
 
 
 
 
 
 
 
integer tb_log_file;
 
initial
begin
tb_log_file = $fopen("../log/sdc_tb.log");
if (tb_log_file < 2)
begin
$display("*E Could not open/create testbench log file in ../log/ directory!");
$finish;
end
$fdisplay(tb_log_file, "========================== SD IP Core Testbench results ===========================");
$fdisplay(tb_log_file, " ");
 
phy_log_file_desc = $fopen("../log/eth_tb_phy.log");
if (phy_log_file_desc < 2)
begin
$fdisplay(tb_log_file, "*E Could not open/create sd_tb_phy.log file in ../log/ directory!");
$finish;
end
$fdisplay(phy_log_file_desc, "================ PHY Module Testbench access log ================");
$fdisplay(phy_log_file_desc, " ");
 
memory_log_file_desc = $fopen("../log/sd_tb_memory.log");
if (memory_log_file_desc < 2)
begin
$fdisplay(tb_log_file, "*E Could not open/create sd_tb_memory.log file in ../log/ directory!");
$finish;
end
$fdisplay(memory_log_file_desc, "=============== MEMORY Module Testbench access log ===============");
$fdisplay(memory_log_file_desc, " ");
 
host_log_file_desc = $fopen("../log/eth_tb_host.log");
if (host_log_file_desc < 2)
begin
$fdisplay(tb_log_file, "*E Could not open/create eth_tb_host.log file in ../log/ directory!");
$finish;
end
$fdisplay(host_log_file_desc, "================ HOST Module Testbench access log ================");
$fdisplay(host_log_file_desc, " ");
 
wb_s_mon_log_file_desc = $fopen("../log/eth_tb_wb_s_mon.log");
if (wb_s_mon_log_file_desc < 2)
begin
$fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_s_mon.log file in ../log/ directory!");
$finish;
end
$fdisplay(wb_s_mon_log_file_desc, "============== WISHBONE Slave Bus Monitor error log ==============");
$fdisplay(wb_s_mon_log_file_desc, " ");
$fdisplay(wb_s_mon_log_file_desc, " Only ERRONEOUS conditions are logged !");
$fdisplay(wb_s_mon_log_file_desc, " ");
 
wb_m_mon_log_file_desc = $fopen("../log/eth_tb_wb_m_mon.log");
if (wb_m_mon_log_file_desc < 2)
begin
$fdisplay(tb_log_file, "*E Could not open/create eth_tb_wb_m_mon.log file in ../log/ directory!");
$finish;
end
$fdisplay(wb_m_mon_log_file_desc, "============= WISHBONE Master Bus Monitor error log =============");
$fdisplay(wb_m_mon_log_file_desc, " ");
$fdisplay(wb_m_mon_log_file_desc, " Only ERRONEOUS conditions are logged !");
$fdisplay(wb_m_mon_log_file_desc, " ");
 
// Reset pulse
wb_rst = 1'b1;
#423 wb_rst = 1'b0;
 
// Clear memories
//clear_memories;
 
#423 StartTB = 1'b1;
end
 
 
 
 
// Generating WB_CLK_I clock
always
begin
wb_clk=0;
// forever #2.5 WB_CLK_I = ~WB_CLK_I; // 2*2.5 ns -> 200.0 MHz
// forever #5 WB_CLK_I = ~WB_CLK_I; // 2*5 ns -> 100.0 MHz
// forever #10 WB_CLK_I = ~WB_CLK_I; // 2*10 ns -> 50.0 MHz
forever #12.5 wb_clk = ~wb_clk; // 2*12.5 ns -> 40 MHz
// forever #15 WB_CLK_I = ~WB_CLK_I; // 2*10 ns -> 33.3 MHz
// forever #20 WB_CLK_I = ~WB_CLK_I; // 2*20 ns -> 25 MHz
// forever #25 WB_CLK_I = ~WB_CLK_I; // 2*25 ns -> 20.0 MHz
// forever #31.25 WB_CLK_I = ~WB_CLK_I; // 2*31.25 ns -> 16.0 MHz
// forever #50 WB_CLK_I = ~WB_CLK_I; // 2*50 ns -> 10.0 MHz
// forever #55 WB_CLK_I = ~WB_CLK_I; // 2*55 ns -> 9.1 MHz
end
 
//TEST Cases
//
//
//
 
task test_send_cmd;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// test_send_cmd
test_heading("Send CMD");
$display(" ");
$display("test_send_cmd TEST");
fail = 0;
 
// reset MAC registers
hard_reset;
 
 
//////////////////////////////////////////////////////////////////////
//// ////
//// test_send_cmd: ////
//// ////
//// ////
///
/// 0: Send CMD3, 48-Bit Response, All Error check
/// ////
///
//////////////////////////////////////////////////////////////////////
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 0: Send CMD, No Response ////
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "0: Send CMD, No Response ";
`TIME; $display(" TEST 0: 0: Send CMD, No Response ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'hff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0 in TEST0", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
 
 
 
 
 
 
 
task test_send_rec_data_error_rsp;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
integer resp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// access_to_reg
test_heading("access_to_reg");
$display(" ");
$display("access_to_reg TEST");
fail = 0;
resp_data = 0;
// reset MAC registers
hard_reset;
 
 
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 3.0: Init sequence, With response check
//CMD 0. Reset Card
//CMD 8. Get voltage (Only 2.0 Card response to this) ////
//CMD55. Indicate Next Command are Application specific
//ACMD44. Get Voltage windows
//CMD2. CID reg
//CMD3. Get RCA.
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "4.0: Send data ";
`TIME; $display(" TEST 4.0: Send data ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h2ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//CMD 0 Reset card
//Setup settings
addr = `SD_BASE + `command ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0 in TEST4.0", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
//CMD 8. Get voltage (Only 2.0 Card response to this)
addr = `SD_BASE + `command ;
data = `CMD8 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish or timeout
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 8, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
$display("V 1.0 Card, Timeout In TEST 4.0 %h", tmp_data);
tmp_data=1;
end
end
resp_data[31]=1; //Just to make it to not skip first
while (resp_data[31]) begin //Wait until busy is clear in the card
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Send ACMD 41
addr = `SD_BASE + `command ;
data = `ACMD41 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 41 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
end
//Send CMD 2
addr = `SD_BASE + `command ;
data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
`TIME;
$display("CMD2 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("CID reg 1: %h", resp_data);
//Send CMD 3
addr = `SD_BASE + `command ;
data = `CMD3 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
`TIME;
$display("CMD3 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
card_rca= resp_data [31:16];
$display("RCA Response: %h", resp_data);
$display("RCA Nr for data transfer: %h", card_rca);
//Put in transferstate
//Send CMD 7
addr = `SD_BASE + `command ;
data = `CMD7 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data[31:16] = card_rca; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD7 in TEST 4.0", i_addr);
`TIME;
$display("CMD7 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Set bus width
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Send ACMD 6
addr = `SD_BASE + `command ;
data = `ACMD6 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 2; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 6 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("Card status after Bus width set %h", resp_data);
//write data
sdModelTB0.add_wrong_data_crc<=1;
addr = `SD_BASE + `BD_TX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
addr = `SD_BASE + `BD_TX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
addr = `SD_BASE + `BD_ISR ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while ( resp_data[0] !=1 ) begin
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (resp_data[1] ) begin
test_fail_num("Error in TEST 4.0: Data resend When Writing try >N. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Data resend When Writing try >N. BD_ISR %h", resp_data);
end
if (resp_data[2] ) begin
test_fail_num("Error in TEST 4.0: FIFO underflow/overflow When Writing. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: FIFO underflow/overflow When Writing. BD_ISR %h", resp_data);
end
if (resp_data[4] ) begin
test_fail_num("Error in TEST 4.0: Command error When Writing. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Command error When Writing. BD_ISR %h", resp_data);
end
if (resp_data[5] ) begin
test_fail_num("Error in TEST 4.0: Data CRC error When Writing. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Data CRC error When Writing. BD_ISR %h", resp_data);
end
sdModelTB0.add_wrong_data_crc<=0;
end
clear_memories;
sdModelTB0.add_wrong_data_crc<=1;
addr = `SD_BASE + `BD_RX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
addr = `SD_BASE + `BD_RX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
addr = `SD_BASE + `BD_ISR ;
data=0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while ( resp_data[0] !=1 ) begin
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (resp_data[1] ) begin
test_fail_num("Error in TEST 4.0 When Reading: Data resend try >N. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 When Reading: Data resend try >N. BD_ISR %h", resp_data);
end
if (resp_data[2] ) begin
test_fail_num("Error in TEST 4.0 When Reading: FIFO underflow/overflow. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 When Reading: FIFO underflow/overflow. BD_ISR %h", resp_data);
end
if (resp_data[4] ) begin
test_fail_num("Error in TEST 4.0 When Reading: Command error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Command error. BD_ISR %h", resp_data);
end
if (resp_data[5] ) begin
test_fail_num("Error in TEST 4.0: Data CRC error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Data CRC error When Reading. BD_ISR %h", resp_data);
end
end
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
 
task test_send_rec_data;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
integer resp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// access_to_reg
 
fail = 0;
resp_data = 0;
// reset MAC registers
hard_reset;
 
 
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 3.0: Init sequence, With response check
//CMD 0. Reset Card
//CMD 8. Get voltage (Only 2.0 Card response to this) ////
//CMD55. Indicate Next Command are Application specific
//ACMD44. Get Voltage windows
//CMD2. CID reg
//CMD3. Get RCA.
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "4.0: Send data ";
`TIME; $display(" TEST 4.0: Send data ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h2ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//CMD 0 Reset card
//Setup settings
addr = `SD_BASE + `command ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0 in TEST4.0", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
//CMD 8. Get voltage (Only 2.0 Card response to this)
addr = `SD_BASE + `command ;
data = `CMD8 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish or timeout
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 8, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
$display("V 1.0 Card, Timeout In TEST 4.0 %h", tmp_data);
tmp_data=1;
end
end
resp_data[31]=1; //Just to make it to not skip first
while (resp_data[31]) begin //Wait until busy is clear in the card
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Send ACMD 41
addr = `SD_BASE + `command ;
data = `ACMD41 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 41 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
end
//Send CMD 2
addr = `SD_BASE + `command ;
data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
`TIME;
$display("CMD2 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("CID reg 1: %h", resp_data);
//Send CMD 3
addr = `SD_BASE + `command ;
data = `CMD3 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
`TIME;
$display("CMD3 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
card_rca= resp_data [31:16];
$display("RCA Response: %h", resp_data);
$display("RCA Nr for data transfer: %h", card_rca);
//Put in transferstate
//Send CMD 7
addr = `SD_BASE + `command ;
data = `CMD7 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data[31:16] = card_rca; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD7 in TEST 4.0", i_addr);
`TIME;
$display("CMD7 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Set bus width
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Send ACMD 6
addr = `SD_BASE + `command ;
data = `ACMD6 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 2; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 6 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("Card status after Bus width set %h", resp_data);
//write data
addr = `SD_BASE + `BD_TX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
addr = `SD_BASE + `BD_TX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
addr = `SD_BASE + `BD_ISR ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while ( resp_data[0] !=1 ) begin
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (resp_data[1] ) begin
test_fail_num("Error in TEST 4.0 when writing: Data resend try >N. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when writing: Data resend try >N. BD_ISR %h", resp_data);
end
else if (resp_data[2] ) begin
test_fail_num("Error in TEST 4.0 when writing : FIFO underflow/overflow. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when writing: FIFO underflow/overflow. BD_ISR %h", resp_data);
end
else if (resp_data[4] ) begin
test_fail_num("Error in TEST 4.0 when writing: Command error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when writing: Command error. BD_ISR %h", resp_data);
end
else if (resp_data[5] ) begin
test_fail_num("Error in TEST 4.0 when writing: Data CRC error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when writing: Data CRC error. BD_ISR %h", resp_data);
end
end
clear_memories;
 
addr = `SD_BASE + `BD_RX ;
data = 0; //
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
addr = `SD_BASE + `BD_RX ;
data = 0; //C
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
addr = `SD_BASE + `BD_ISR ;
data=0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while ( resp_data[0] !=1 ) begin
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (resp_data[1] ) begin
test_fail_num("Error in TEST 4.0 when reading: Data resend try >N. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when reading: Data resend try >N. BD_ISR %h", resp_data);
end
else if (resp_data[2] ) begin
test_fail_num("Error in TEST 4.0 when reading: FIFO underflow/overflow. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when reading: FIFO underflow/overflow. BD_ISR %h", resp_data);
end
else if (resp_data[4] ) begin
test_fail_num("Error in TEST 4.0 when reading: Command error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when reading: Command error. BD_ISR %h", resp_data);
end
else if (resp_data[5] ) begin
test_fail_num("Error in TEST 4.0 when reading: Data CRC error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0 when reading: Data CRC error. BD_ISR %h", resp_data);
end
end
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
 
 
 
 
 
 
 
 
task test_send_data;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
integer resp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// access_to_reg
test_heading("access_to_reg");
$display(" ");
$display("access_to_reg TEST");
fail = 0;
resp_data = 0;
// reset MAC registers
hard_reset;
 
 
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 3.0: Init sequence, With response check
//CMD 0. Reset Card
//CMD 8. Get voltage (Only 2.0 Card response to this) ////
//CMD55. Indicate Next Command are Application specific
//ACMD44. Get Voltage windows
//CMD2. CID reg
//CMD3. Get RCA.
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "4.0: Send data ";
`TIME; $display(" TEST 4.0: Send data ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h2ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//CMD 0 Reset card
//Setup settings
addr = `SD_BASE + `command ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0 in TEST4.0", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
//CMD 8. Get voltage (Only 2.0 Card response to this)
addr = `SD_BASE + `command ;
data = `CMD8 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish or timeout
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 8, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
$display("V 1.0 Card, Timeout In TEST 4.0 %h", tmp_data);
tmp_data=1;
end
end
resp_data[31]=1; //Just to make it to not skip first
while (resp_data[31]) begin //Wait until busy is clear in the card
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Send ACMD 41
addr = `SD_BASE + `command ;
data = `ACMD41 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 41 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
end
//Send CMD 2
addr = `SD_BASE + `command ;
data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
`TIME;
$display("CMD2 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("CID reg 1: %h", resp_data);
//Send CMD 3
addr = `SD_BASE + `command ;
data = `CMD3 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 4.0", i_addr);
`TIME;
$display("CMD3 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
card_rca= resp_data [31:16];
$display("RCA Response: %h", resp_data);
$display("RCA Nr for data transfer: %h", card_rca);
//Put in transferstate
//Send CMD 7
addr = `SD_BASE + `command ;
data = `CMD7 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data[31:16] = card_rca; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD7 in TEST 4.0", i_addr);
`TIME;
$display("CMD7 Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Set bus width
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
end
//Send ACMD 6
addr = `SD_BASE + `command ;
data = `ACMD6 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 2; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 6 in TEST 4.0", i_addr);
`TIME;
$display("Error in TEST 4.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("Card status after Bus width set %h", resp_data);
//write data
addr = `SD_BASE + `BD_TX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
addr = `SD_BASE + `BD_TX ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
addr = `SD_BASE + `BD_ISR ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while ( resp_data[0] !=1 ) begin
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (resp_data[1] ) begin
test_fail_num("Error in TEST 4.0: Data resend try >N. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Data resend try >N. BD_ISR %h", resp_data);
end
else if (resp_data[2] ) begin
test_fail_num("Error in TEST 4.0: FIFO underflow/overflow. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: FIFO underflow/overflow. BD_ISR %h", resp_data);
end
else if (resp_data[4] ) begin
test_fail_num("Error in TEST 4.0: Command error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Command error. BD_ISR %h", resp_data);
end
else if (resp_data[5] ) begin
test_fail_num("Error in TEST 4.0: Data CRC error. BD_ISR %h", resp_data);
`TIME;
$display("Error in TEST 4.0: Data CRC error. BD_ISR %h", resp_data);
end
end
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
task test_init_sequnce; //
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
integer resp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// access_to_reg
test_heading("access_to_reg");
$display(" ");
$display("access_to_reg TEST");
fail = 0;
resp_data = 0;
// reset MAC registers
hard_reset;
 
 
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 3.0: Init sequence, With response check
//CMD 0. Reset Card
//CMD 8. Get voltage (Only 2.0 Card response to this) ////
//CMD55. Indicate Next Command are Application specific
//ACMD44. Get Voltage windows
//CMD2. CID reg
//CMD3. Get RCA.
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "3.0: Init Seq, No Response ";
`TIME; $display(" TEST 3.0: 0: Init Seq, No Response ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h2ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//CMD 0 Reset card
//Setup settings
addr = `SD_BASE + `command ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0 in TEST0", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
//CMD 8. Get voltage (Only 2.0 Card response to this)
addr = `SD_BASE + `command ;
data = `CMD8 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish or timeout
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 8, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
$display("V 1.0 Card, Timeout In TEST 3.0 %h", tmp_data);
tmp_data=1;
end
end
resp_data[31]=1; //Just to make it to not skip first
while (resp_data[31]) begin //Wait until busy is clear in the card
//Send CMD 55
addr = `SD_BASE + `command ;
data = `CMD55 |`CICE | `CRCE | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD55 in TEST 3.0", i_addr);
`TIME;
$display("Error in TEST 3.0 status reg: %h", tmp_data);
end
end
//Send ACMD 41
addr = `SD_BASE + `command ;
data = `ACMD41 | `RSP_48 ;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending ACMD 41 in TEST 3.0", i_addr);
`TIME;
$display("Error in TEST 3.0 status reg: %h", tmp_data);
end
//Read response data
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
end
//Send CMD 2
addr = `SD_BASE + `command ;
data = `CMD2 | `CRCE | `RSP_136 ; //CMD index 2, CRC and Index Check, rsp = 136 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 3.0", i_addr);
`TIME;
$display("CMD2 Error in TEST 3.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
$display("CID reg 1: %h", resp_data);
//Send CMD 3
addr = `SD_BASE + `command ;
data = `CMD3 | `CRCE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 3.0", i_addr);
`TIME;
$display("CMD3 Error in TEST 3.0 status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `resp1 ;
wbm_read(addr, resp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
card_rca= resp_data [31:16];
$display("RCA Response: %h", resp_data);
$display("RCA Nr for data transfer: %h", card_rca);
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
 
 
 
task test_access_to_reg;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// access_to_reg
test_heading("access_to_reg");
$display(" ");
$display("access_to_reg TEST");
fail = 0;
 
// reset MAC registers
hard_reset;
 
 
//////////////////////////////////////////////////////////////////////
//// ////
//// test_access_to_reg: ////
//// ////
//// 0: Read/Write acces register ////
/// ////
//////////////////////////////////////////////////////////////////////
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
 
////////////////////////////////////////////////////////////////////
//// ////
//// Test all RW register for: ////
//// 1: Read access (Correct reset values) ////
//// 2: Write/Read ////
////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
// TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )
test_name = "TEST 0: 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )";
`TIME; $display(" TEST 0: 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )");
data = 0;
rand_sel = 0;
sel = 0;
for (i = 1; i <= 19; i = i + 1) // num of registers
begin
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
case (i)
1: begin
i_addr = `bd_iser;
rsp = 0;
data = 32'h0000_00FF;
end
2:begin
i_addr = `command;
rsp = 0;
data = 32'h0000_FFFF;
end
3:begin
i_addr = `timeout;
rsp = 0;
data = 32'h0000_FFFF;
end
4: begin
i_addr = `normal_iser;
rsp = 0;
data = 32'h0000_FFFF;
end
5:begin
i_addr = `error_iser;
rsp = 0;
data = 32'h0000_FFFF;
end
6: begin
i_addr = `clock_d;
rsp = `RESET_CLK_DIV;
data = 32'h0000_00FF;
end
19: begin
i_addr = `argument;
rsp = 0;
data = 32'hFFFF_FFFF;
end
8: begin
i_addr = `status;
rsp = 0;
end
9: begin
i_addr = `resp1;
rsp = 0;
end
10: begin
i_addr = `controller;
rsp = 2;
end
11: begin
i_addr = `block;
rsp = 16'h200;
end
12: begin
i_addr = `power;
rsp = 16'h00F;
end
13: begin
i_addr = `software;
rsp = 16'h000;
end
14: begin
i_addr = `timeout;
rsp = 16'hFFFF;
end
15: begin
i_addr = `normal_isr;
rsp = 16'h000;
end
 
 
 
17: begin
i_addr = `capa;
rsp = 16'h000;
end
18: begin
i_addr = `bd_status;
rsp = 16'h0808;
end
default : begin
i_addr = `capa;
rsp = 16'h000;
end
endcase
addr = `SD_BASE + i_addr;
sel = 4'hF;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data !== rsp)
begin
fail = fail + 1;
test_fail_num("Register %h defaultvalue is not RSP ",i_addr);
`TIME;
$display("Wrong defaulte value @ addr %h, tmp_data %h, should b %h", addr, tmp_data,rsp);
end
// set value to 32'hFFFF_FFFF
if ( (i<=6) || (i==19) ) begin
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
wait (wbm_working == 0);
wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data !== data)
begin
fail = fail + 1;
test_fail_num("Register could not be written to FFFF_FFFF", i_addr);
`TIME;
$display("Register could not be written to FFFF_FFFF - addr %h, tmp_data %h", addr, tmp_data);
end
end
end
end
// Errors were reported previously
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
task test_send_cmd_error_rsp;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// test_send_cmd
test_heading("Send CMD, with simulated bus error on SD_CMD line");
$display(" ");
$display("test_send_cmd_error_rsp");
fail = 0;
 
// reset MAC registers
hard_reset;
sdModelTB0.add_wrong_cmd_crc<=1;
 
 
//sdModelTB0.add_wrong_cmd_indx<=1;
 
//////////////////////////////////////////////////////////////////////
//// ////
//// test_send_cmd: ////
//// ////
//// 0: Send CMD0, No Response ////
/// 1: Send CMD3, 48-Bit Response, No error check
/// 2: Send CMD3, 48-Bit Response, All Error check
/// 3: Send CMD2, 136-Bit Response ////
///
//////////////////////////////////////////////////////////////////////
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 5: Send CMD, with a simulated bus error ////
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "0: Send CMD, No Response ";
`TIME; $display(" TEST 5 part 0: Send CMD, No Response ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'hff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
sdModelTB0.add_wrong_cmd_crc<=1;
//Setup settings
addr = `SD_BASE + `command ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0 in TEST5", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
sdModelTB0.add_wrong_cmd_crc<=1;
sdModelTB0.add_wrong_cmd_indx<=1;
//////////////////////////////////////////////////////////////////////
//// Prereq: A valid CMD index which responde with 48 bit has to be sent //
/// Test 1: Send CMD, 48-Bit Response, No error check ////
//////////////////////////////////////////////////////////////////////
if (test_num == 1) //
begin
test_name = " TEST 5, part 1: Send CMD, 48-Bit Response, No error check ";
`TIME; $display(" TEST 5, part 1: Send CMD, 48-Bit Response, No error check ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h1ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = `CMD3 | `RSP_48 ; //CMD index 3, Erro check =0, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD3 in TEST 5", i_addr);
`TIME;
$display("Error status reg: %h", tmp_data);
end
end
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD3 in TEST 5", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
//////////////////////////////////////////////////////////////////////
////Prereq: A valid CMD index which responde with 48 bit has to be sent //
/// Test 2: Send CMD3, 48-Bit Response, All Error check enable ////
//////////////////////////////////////////////////////////////////////
if (test_num == 2) //
begin
test_name = " TEST 5, part 2: Send CMD3, 48-Bit Response, All Error check enable ";
`TIME; $display(" TEST 5, part 2: Send CMD3, 48-Bit Response, All Error check enable ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h1ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = `CMD3 | `CICE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data == 0) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
`TIME;
$display("Bus error catched, Error status reg: %h", tmp_data);
end
end
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
`TIME;
$display("Normal status register is 0x1: %h, bus error succesfully captured", tmp_data);
end
else begin
test_fail_num("Bus error wasent captured, Normal status register is: %h",tmp_data);
`TIME;
$display("Bus error wasent captured, Normal status register is : %h",tmp_data);
fail = fail + 1;
end
end
if (test_num == 3) //
begin
test_name = " Test 5 part 4: Send CMD2, 136-Bit ";
`TIME; $display(" Test 5 part 4: Send CMD2, 136-Bit ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h1ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = `CMD2 | `RSP_136 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 5", i_addr);
`TIME;
$display("Error status reg: %h", tmp_data);
end
end
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD2 in TEST3", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
////////////////////////////////////////////////////////////////////////////
task IRQ_test_send_cmd;
input [31:0] start_task;
input [31:0] end_task;
integer bit_start_1;
integer bit_end_1;
integer bit_start_2;
integer bit_end_2;
integer num_of_reg;
integer i_addr;
integer i_data;
integer i_length;
integer tmp_data;
reg [31:0] tx_bd_num;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
reg [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
integer i;
integer i1;
integer i2;
integer i3;
integer fail;
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
reg [31:0] rsp;
begin
// test_send_cmd
test_heading("IRQ Send CMD");
$display(" ");
$display("IRQ test_send_cmd TEST");
fail = 0;
 
// reset MAC registers
hard_reset;
 
 
//////////////////////////////////////////////////////////////////////
//// ////
//// test_send_cmd: ////
//// ////
//// 0: Send CMD0, No Response ////
/// 1: Send CMD3, 48-Bit Response, No error check
/// 2: Send CMD3, 48-Bit Response, All Error check
/// 3: Send CMD2, 136-Bit Response ////
///
//////////////////////////////////////////////////////////////////////
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
begin
//////////////////////////////////////////////////////////////////////
//// ////
//Test 0: Send CMD, No Response ////
//////////////////////////////////////////////////////////////////////
if (test_num == 0) //
begin
 
test_name = "0: Send CMD, No Response ";
`TIME; $display(" TEST 0: 0: Send CMD, No Response ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h80;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Enable IRQ_A on Normal Interupt register, Sending complete and Send Fail
addr = `SD_BASE + `normal_iser ;
data = 16'h8001;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings for command
addr = `SD_BASE + `command ;
data = 16'h802; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings for command
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for send finnish
addr = `SD_BASE + `normal_isr ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1)
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
//When send finnish check if any error
addr = `SD_BASE + `error_isr ;
data = 0;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD0", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
//////////////////////////////////////////////////////////////////////
//// Prereq: A valid CMD index which responde with 48 bit has to be sent //
/// Test 1: Send CMD, 48-Bit Response, No error check ////
//////////////////////////////////////////////////////////////////////
if (test_num == 1) //
begin
test_name = " 1: Send CMD, 48-Bit Response, No error check ";
`TIME; $display(" TEST 1: Send CMD, 48-Bit Response, No error check ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h1ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = `CMD3 | `RSP_48 ; //CMD index 3, Erro check =0, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD3 in TEST 1", i_addr);
`TIME;
$display("Error status reg: %h", tmp_data);
end
end
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD3 in TEST 1", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
//////////////////////////////////////////////////////////////////////
////Prereq: A valid CMD index which responde with 48 bit has to be sent //
/// Test 2: Send CMD3, 48-Bit Response, All Error check enable ////
//////////////////////////////////////////////////////////////////////
if (test_num == 2) //
begin
test_name = " 2: Send CMD3, 48-Bit Response, All Error check enable ";
`TIME; $display(" Test 2: Send CMD3, 48-Bit Response, All Error check enable ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h1ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = `CMD3 | `CICE | `CRCE | `RSP_48 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD3 in TEST 2", i_addr);
`TIME;
$display("Error status reg: %h", tmp_data);
end
end
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD3 in TEST2", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
if (test_num == 3) //
begin
test_name = " 3: Send CMD2, 136-Bit ";
`TIME; $display(" Test 3: Send CMD2, 136-Bit ");
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5;
data = 0;
rand_sel = 0;
sel = 4'hF;
//Reset Core
addr = `SD_BASE + `software ;
data = 1;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup timeout reg
addr = `SD_BASE + `timeout ;
data = 16'h1ff;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Clock divider /2
addr = `SD_BASE + `clock_d ;
data = 16'h0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Start Core
addr = `SD_BASE + `software ;
data = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Setup settings
addr = `SD_BASE + `command ;
data = `CMD2 | `RSP_136 ; //CMD index 3, CRC and Index Check, rsp = 48 bit;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//Argument settings
addr = `SD_BASE + `argument ;
data = 0; //CMD index 0, Erro check =0, rsp = 0;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//wait for response or timeout
addr = `SD_BASE + `normal_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
while (tmp_data != 1) begin
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data[15]== 1) begin
fail = fail + 1;
addr = `SD_BASE + `error_isr ;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
test_fail_num("Error occured when sending CMD2 in TEST 3", i_addr);
`TIME;
$display("Error status reg: %h", tmp_data);
end
end
if (tmp_data[15]) begin
fail = fail + 1;
test_fail_num("Error occured when sending CMD2 in TEST3", i_addr);
`TIME;
$display("Normal status register is not 0x1: %h", tmp_data);
end
end
end
if(fail == 0)
test_ok;
else
fail = 0;
end
endtask
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//Tasks
task wbm_write;
input [31:0] address_i;
input [31:0] data_i;
input [3:0] sel_i;
input [31:0] size_i;
input [3:0] init_waits_i;
input [3:0] subseq_waits_i;
 
reg `WRITE_STIM_TYPE write_data;
reg `WB_TRANSFER_FLAGS flags;
reg `WRITE_RETURN_TYPE write_status;
integer i;
begin
wbm_working = 1;
write_status = 0;
 
flags = 0;
flags`WB_TRANSFER_SIZE = size_i;
flags`INIT_WAITS = init_waits_i;
flags`SUBSEQ_WAITS = subseq_waits_i;
 
write_data = 0;
write_data`WRITE_DATA = data_i[31:0];
write_data`WRITE_ADDRESS = address_i;
write_data`WRITE_SEL = sel_i;
 
for (i = 0; i < size_i; i = i + 1)
begin
wb_master.blk_write_data[i] = write_data;
data_i = data_i >> 32;
write_data`WRITE_DATA = data_i[31:0];
write_data`WRITE_ADDRESS = write_data`WRITE_ADDRESS + 4;
end
 
wb_master.wb_block_write(flags, write_status);
 
if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
begin
`TIME;
$display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
end
 
@(posedge wb_clk);
#3;
wbm_working = 0;
#1;
end
endtask // wbm_write
 
 
task wbm_read;
input [31:0] address_i;
output [((`MAX_BLK_SIZE * 32) - 1):0] data_o;
input [3:0] sel_i;
input [31:0] size_i;
input [3:0] init_waits_i;
input [3:0] subseq_waits_i;
 
reg `READ_RETURN_TYPE read_data;
reg `WB_TRANSFER_FLAGS flags;
reg `READ_RETURN_TYPE read_status;
integer i;
begin
wbm_working = 1;
 
read_status = 0;
data_o = 0;
 
flags = 0;
flags`WB_TRANSFER_SIZE = size_i;
flags`INIT_WAITS = init_waits_i;
flags`SUBSEQ_WAITS = subseq_waits_i;
 
read_data = 0;
read_data`READ_ADDRESS = address_i;
read_data`READ_SEL = sel_i;
 
for (i = 0; i < size_i; i = i + 1)
begin
wb_master.blk_read_data_in[i] = read_data;
read_data`READ_ADDRESS = read_data`READ_ADDRESS + 4;
end
 
wb_master.wb_block_read(flags, read_status);
 
if (read_status`CYC_ACTUAL_TRANSFER !== size_i)
begin
`TIME;
$display("*E WISHBONE Master was unable to complete the requested read operation from MAC!");
end
 
for (i = 0; i < size_i; i = i + 1)
begin
data_o = data_o << 32;
read_data = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
data_o[31:0] = read_data`READ_DATA;
end
 
@(posedge wb_clk);
#3;
wbm_working = 0;
#1;
end
endtask // wbm_read
 
 
task clear_memories;
reg [22:0] adr_i;
reg delta_t;
begin
for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
begin
wb_slave.wb_memory[adr_i[21:2]] = 0;
end
end
endtask // clear_memories
 
task hard_reset; // MAC registers
begin
// reset MAC registers
@(posedge wb_clk);
#2 wb_rst = 1'b1;
repeat(2) @(posedge wb_clk);
#2 wb_rst = 1'b0;
end
endtask // hard_reset
 
task test_fail_num ;
input [7999:0] failure_reason ;
input [31:0] number ;
// reg [8007:0] display_failure ;
reg [7999:0] display_failure ;
reg [799:0] display_test ;
begin
tests_failed = tests_failed + 1 ;
 
display_failure = failure_reason; // {failure_reason, "!"} ;
while ( display_failure[7999:7992] == 0 )
display_failure = display_failure << 8 ;
 
display_test = test_name ;
while ( display_test[799:792] == 0 )
display_test = display_test << 8 ;
 
$fdisplay( tb_log_file, " *************************************************************************************" ) ;
$fdisplay( tb_log_file, " At time: %t ", $time ) ;
$fdisplay( tb_log_file, " Test: %s", display_test ) ;
$fdisplay( tb_log_file, " *FAILED* because") ;
$fdisplay( tb_log_file, " %s; %d", display_failure, number ) ;
$fdisplay( tb_log_file, " *************************************************************************************" ) ;
$fdisplay( tb_log_file, " " ) ;
 
`ifdef STOP_ON_FAILURE
#20 $stop ;
`endif
end
endtask // test_fail_num
 
task test_ok ;
reg [799:0] display_test ;
begin
tests_successfull = tests_successfull + 1 ;
 
display_test = test_name ;
while ( display_test[799:792] == 0 )
display_test = display_test << 8 ;
 
$fdisplay( tb_log_file, " *************************************************************************************" ) ;
$fdisplay( tb_log_file, " At time: %t ", $time ) ;
$fdisplay( tb_log_file, " Test: %s", display_test ) ;
$fdisplay( tb_log_file, " reported *SUCCESSFULL*! ") ;
$fdisplay( tb_log_file, " *************************************************************************************" ) ;
$fdisplay( tb_log_file, " " ) ;
end
endtask // test_ok
 
 
task test_heading;
input [799:0] test_heading ;
reg [799:0] display_test ;
begin
display_test = test_heading;
while ( display_test[799:792] == 0 )
display_test = display_test << 8 ;
$fdisplay( tb_log_file, " ***************************************************************************************" ) ;
$fdisplay( tb_log_file, " ***************************************************************************************" ) ;
$fdisplay( tb_log_file, " Heading: %s", display_test ) ;
$fdisplay( tb_log_file, " ***************************************************************************************" ) ;
$fdisplay( tb_log_file, " ***************************************************************************************" ) ;
$fdisplay( tb_log_file, " " ) ;
end
endtask // test_heading
 
endmodule
/bench/sdc_dma/verilog/sdModel.v
1,5 → 1,5
//`include "timescale.v"
`include "SD_defines.v"
`include "sd_defines.v"
`define tTLH 10 //Clock rise time
`define tHL 10 //Clock fall time
`define tISU 6 //Input setup time
8,9 → 8,9
`define DLY_TO_OUTP 47
 
`define BLOCKSIZE 512
`define MEMSIZE 2048 // 4 block
`define MEMSIZE 24643590 // 2mb block
`define BLOCK_BUFFER_SIZE 1
`define TIME_BUSY 64
`define TIME_BUSY 63
 
`define PRG 7
`define RCV 6
56,6 → 56,7
reg [15:0] RCA;
reg [31:0] OCR;
reg [120:0] CID;
reg [120:0] CSD;
reg Busy; //0 when busy
wire [6:0] crcOut;
reg [4:0] crc_c;
62,10 → 63,11
 
reg [3:0] CurrentState;
reg [3:0] DataCurrentState;
`define RCASTART 16'h20
`define RCASTART 16'h2000
`define OCRSTART 32'hff8000
`define STATUSSTART 32'h0
`define CIDSTART 128'h00ffffffddddddddaaaaaaaa99999999 //Just some random data not really usefull anyway
`define CIDSTART 128'hffffffddddddddaaaaaaaa99999999 //Just some random data not really usefull anyway
`define CSDSTART 128'hadaeeeddddddddaaaaaaaa12345678
 
`define outDelay 4
reg [2:0] outDelayCnt;
108,6 → 110,8
 
 
reg crcDat_rst;
reg mult_read;
reg mult_write;
reg crcDat_en;
reg [3:0] crcDat_in;
wire [15:0] crcDat_out [3:0];
115,10 → 119,10
genvar i;
generate
for(i=0; i<4; i=i+1) begin:CRC_16_gen
SD_CRC_16 CRC_16_i (crcDat_in[i],crcDat_en, sdClk, crcDat_rst, crcDat_out[i]);
sd_crc_16 CRC_16_i (crcDat_in[i],crcDat_en, sdClk, crcDat_rst, crcDat_out[i]);
end
endgenerate
SD_CRC_7 CRC_7(
sd_crc_7 crc_7(
crcIn,
crcEn,
sdClk,
125,6 → 129,7
crcRst,
crcOut);
 
reg stop;
 
reg appendCrc;
reg [5:0] startUppCnt;
131,12 → 136,12
 
reg q_start_bit;
//Card initinCMd
initial $readmemh("../bin/FLASH.txt",FLASHmem);
initial $readmemh("../bin/ramdisk2.hex",FLASHmem);
 
integer k;
initial begin
$display("Contents of Mem after reading data file:");
for (k=0; k<10; k=k+1) $display("%d:%h",k,FLASHmem[k]);
for (k=0; k<512; k=k+1) $display("%d:%h",k,FLASHmem[k]);
end
reg qCmd;
reg [2:0] crcCnt;
149,6 → 154,7
add_wrong_data_crc<=0;
add_wrong_cmd_indx<=0;
add_wrong_cmd_crc<=0;
stop<=1;
cardIdentificationState<=1;
state<=IDLE;
dataState<=DATA_IDLE;
165,6 → 171,8
inCmd<=0;
BusWidth<=1;
responseType=0;
mult_read=0;
mult_write=0;
crcIn<=0;
response_S<=0;
crcEn<=0;
177,6 → 185,7
OCR<= `OCRSTART;
CardStatus <= `STATUSSTART;
CID<=`CIDSTART;
CSD<=`CSDSTART;
response_CMD<=0;
outDelayCnt<=0;
crcDat_rst<=1;
191,6 → 200,7
crcDat_en<=0;
crcDat_in<=0;
flash_write_cnt<=0;
startUppCnt<=0;
flash_blockwrite_cnt<=0;
end
 
237,9 → 247,9
next_datastate = 0;
case(dataState)
DATA_IDLE: begin
if (CardStatus[12:9]==`RCV )
if ((CardStatus[12:9]==`RCV) || (mult_write == 1'b1) )
next_datastate = READ_WAITS;
else if (CardStatus[12:9]==`DATAS )
else if ((CardStatus[12:9]==`DATAS )|| (mult_read == 1'b1) )
next_datastate = WRITE_DATA;
else
next_datastate = DATA_IDLE;
255,20 → 265,33
READ_DATA : begin
if (crc_c==0 )
next_datastate = WRITE_FLASH;
else
else begin
if (stop == 1'b0)
next_datastate = READ_DATA;
else
next_datastate = DATA_IDLE;
end
 
 
end
WRITE_FLASH : begin
if (flash_write_cnt>265 )
if (flash_write_cnt>265 )
next_datastate = DATA_IDLE;
else
else
next_datastate = WRITE_FLASH;
end
 
WRITE_DATA : begin
if (transf_cnt >= `BIT_BLOCK)
next_datastate= DATA_IDLE;
else
next_datastate=WRITE_DATA;
begin
if (stop == 1'b0)
next_datastate=WRITE_DATA;
else
next_datastate = DATA_IDLE;
end
end
 
304,7 → 327,7
CardStatus[8]<=0;
end
else
CardStatus[8]<=0;
CardStatus[8]<=1;
startUppCnt<=startUppCnt+1;
OCR[31]<=Busy;
321,12 → 344,13
always @ (posedge sdClk) begin
case(state)
IDLE: begin
mult_write <= 0;
mult_read <=0;
crcIn<=0;
crcEn<=0;
crcRst<=1;
oeCmd<=0;
stop<=0;
cmdRead<=0;
appendCrc<=0;
ValidCmd<=0;
376,10 → 400,13
3 : response_S <= 48;
7 : response_S <= 48;
8 : response_S <= 0;
9 : response_S <= 136;
14 : response_S <= 0;
16 : response_S <= 48;
17 : response_S <= 48;
18 : response_S <= 48;
24 : response_S <= 48;
25 : response_S <= 48;
33 : response_S <= 48;
55 : response_S <= 48;
41 : response_S <= 48;
446,10 → 473,36
end
end
8 : response_CMD[127:96] <= 0; //V1.0 card
9 : begin
if (lastCMD != 41 && outDelayCnt==0) begin
$fdisplay(sdModel_file_desc, "**Error in sequnce, ACMD 41 should precede 2 in Startup state") ;
//$display(sdModel_file_desc, "**Error in sequnce, ACMD 41 should precede 2 in Startup state") ;
CardStatus[3]<=1;
end
response_CMD[127:8] <= CSD;
appendCrc<=0;
CardStatus[12:9] <=2;
end
12: begin
response_CMD[127:96] <= CardStatus ;
stop<=1;
mult_write <= 0;
mult_read <=0;
CardStatus[12:9] <= `TRAN;
end
 
 
16 : begin
response_CMD[127:96] <= CardStatus ;
end
 
 
 
 
 
17 : begin
if (outDelayCnt==0) begin
if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate
466,6 → 519,25
end
end
 
18 : begin
if (outDelayCnt==0) begin
if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate
CardStatus[12:9] <=`DATAS;//Put card in data state
response_CMD[127:96] <= CardStatus ;
mult_read <= 1;
BlockAddr = inCmd[39:8];
if (BlockAddr%512 !=0)
$display("**Block Misalign Error");
end
else begin
response_S <= 0;
response_CMD[127:96] <= 0;
end
end
end
24 : begin
if (outDelayCnt==0) begin
488,8 → 560,31
response_CMD[127:96] <= 0;
end
end
end
end
25 : begin
if (outDelayCnt==0) begin
if (CardStatus[12:9] == `TRAN) begin //If card is in transferstate
if (CardStatus[8]) begin //If Free write buffer
CardStatus[12:9] <=`RCV;//Put card in Rcv state
response_CMD[127:96] <= CardStatus ;
BlockAddr = inCmd[39:8];
mult_write <= 1;
if (BlockAddr%512 !=0)
$display("**Block Misalign Error");
end
else begin
response_CMD[127:96] <= CardStatus;
$fdisplay(sdModel_file_desc, "**Error Try to blockwrite when No Free Writebuffer") ;
$display("**Error Try to blockwrite when No Free Writebuffer") ;
end
end
else begin
response_S <= 0;
response_CMD[127:96] <= 0;
end
end
end
 
33 : response_CMD[127:96] <= 48;
55 :
begin
597,7 → 692,11
case (dataState)
DATA_IDLE: begin
 
crcDat_rst<=1;
crcDat_en<=0;
crcDat_in<=0;
 
end
READ_WAITS: begin
614,9 → 713,9
InbuffStatus<=1;
if (transf_cnt<`BIT_BLOCK_REC) begin
if (wptr)
Inbuff[block_cnt][7:4] <= dat;
Inbuff[block_cnt][3:0] <= dat;
else
Inbuff[block_cnt][3:0] <= dat;
Inbuff[block_cnt][7:4] <= dat;
if (!add_wrong_data_crc)
crcDat_in<=dat;
679,7 → 778,7
transf_cnt<=0;
data_send_index<=0;
outdly_cnt<=0;
flash_write_cnt<=0;
end
784,6 → 883,7
flash_blockwrite_cnt<=flash_blockwrite_cnt+2;
FLASHmem[BlockAddr+(flash_blockwrite_cnt)]<=Inbuff[flash_blockwrite_cnt];
FLASHmem[BlockAddr+(flash_blockwrite_cnt+1)]<=Inbuff[flash_blockwrite_cnt+1];
end
else begin
datOut<=1;
798,7 → 898,7
 
initial
begin
sdModel_file_desc = $fopen("../log/sd_model.log");
sdModel_file_desc = $fopen("../out/sd_model.log");
if (sdModel_file_desc < 2)
begin
$display("*E Could not open/create testbench log file in /log/ directory!");
822,7 → 922,7
oeDat<=0;
cmdOut<=0;
cmdWrite<=0;
startUppCnt<=0;
InbuffStatus<=0;
datOut<=0;
inCmd<=0;
840,6 → 940,7
OCR<= `OCRSTART;
CardStatus <= `STATUSSTART;
CID<=`CIDSTART;
CSD<=`CSDSTART;
response_CMD<=0;
outDelayCnt<=0;
crcDat_rst<=1;

powered by: WebSVN 2.1.0

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