diff --git a/tests/verilator/sdcard/sd_card.v b/tests/verilator/sdcard/sd_card.v index 95e5a18..2156b24 100644 --- a/tests/verilator/sdcard/sd_card.v +++ b/tests/verilator/sdcard/sd_card.v @@ -309,18 +309,25 @@ end // spi receiver reg illegal_write_state /* synthesis noprune */; - +reg synced; + always @(posedge sd_sck or posedge sd_cs) begin // cs is active low if(sd_cs == 1) begin bit_cnt <= 3'd0; + synced <= 1'b0; end else begin illegal_write_state <= 1'b0; new_cmd_rcvd <= 1'b0; buffer_write_strobe <= 1'b0; req_io_wr <= 1'b0; - bit_cnt <= bit_cnt + 3'd1; - + + // wait for first 0 bit until start counting bits + if(synced || !sd_sdi) begin + synced <= 1'b1; + bit_cnt <= bit_cnt + 3'd1; + end + // assemble byte if(bit_cnt != 7) sbuf[6:0] <= { sbuf[5:0], sd_sdi }; diff --git a/tests/verilator/sdcard/sd_card_tb.cpp b/tests/verilator/sdcard/sd_card_tb.cpp index b44005e..de9e93f 100644 --- a/tests/verilator/sdcard/sd_card_tb.cpp +++ b/tests/verilator/sdcard/sd_card_tb.cpp @@ -156,6 +156,19 @@ u08 spiTransferFF() { return spiTransferByte(0xff); } +void spiTx1(int i) { + while(i--) { + top->sd_sdi = 1; + + dump(); + top->sd_sck = 1; + dump(); + top->sd_sck = 0; + dump(); + } + dump(); +} + #define DIR_INIT_MEMSIZE 16*1024 u08 mem[DIR_INIT_MEMSIZE]; char ROM_DIR[]="/atari800/rom"; diff --git a/tests/verilator/sdcard/spi.h b/tests/verilator/sdcard/spi.h index 8508a84..6e18b88 100644 --- a/tests/verilator/sdcard/spi.h +++ b/tests/verilator/sdcard/spi.h @@ -60,6 +60,7 @@ u08 spiTransferByte(u08 data); // operates on a whole word (16-bits of data). u08 spiTransferFF(); void spiTransferTwoFF(); +void spiTx1(int i); void spiDisplay(int i);