tachibana/test_bench/spi_regfile_tb.v
2021-06-24 12:14:40 +02:00

128 lines
No EOL
2.6 KiB
Verilog

`timescale 1ns / 1ps
module spi_regfile_tb();
localparam period = 10;
parameter WORDSIZE = 8;
reg clk, rst;
reg sck, sdi, ncs;
wire sdo;
reg [15:0] spi_data_in;
wire [15:0] spi_data_out;
wire [15:0] spi_status_word = 16'h3141;
wire [15:0] spi_cmd_word;
wire spi_cmd_begin, spi_cmd_active, spi_cmd_step;
wire [19:0] spi_cmd_idx;
initial begin
clk = 0;
/* rst set below */
sck = 0;
sdi = 0;
ncs = 1;
forever #period clk = ~clk;
end
integer i;
integer j;
integer k;
integer testcase;
reg [WORDSIZE-1:0] sim_rxdata [1:4];
reg [WORDSIZE-1:0] sim_txdata [1:4];
reg [WORDSIZE-1:0] sim_txbuf;
initial begin
sim_rxdata[1] = 16'h523a;
sim_rxdata[2] = 16'hbeef;
sim_rxdata[3] = 16'h7721;
sim_rxdata[4] = 16'h0108;
sim_txdata[1] = 16'h1234;
sim_txdata[2] = 16'h5678;
sim_txdata[3] = 16'h9abc;
sim_txdata[4] = 16'hdef9;
for (j=1; j<=4; j=j+1) begin
$display("TC-%d: rx/tx %d word", j, j);
testcase = j;
rst = 1;
repeat(2) @(posedge clk);
rst = 0;
@(posedge clk);
spi_data_in = sim_txdata[1];
@(posedge clk);
ncs = 0;
@(posedge clk);
if (spi_cmd_begin) $finish;
if (spi_cmd_active) $finish;
if (spi_cmd_step) $finish;
for (k=1; k<=j; k=k+1) begin
sim_txbuf = 0;
for (i=1; i<=WORDSIZE; i=i+1) begin
sdi = sim_rxdata[k][WORDSIZE-i];
sck = 0;
@(posedge clk);
sck = 1;
sim_txbuf[WORDSIZE-i] = sdo;
if (i == WORDSIZE) begin
spi_data_in = sim_txdata[k+1];
end
if (spi_cmd_step) $finish;
@(posedge clk);
end
if (!spi_cmd_active) $finish;
if (k == 1 && !spi_cmd_begin) $finish;
if (k > 1 && spi_cmd_begin) $finish;
if (k == 1 && spi_cmd_step) $finish;
if (k > 1 && !spi_cmd_step) $finish;
if (spi_cmd_word != sim_rxdata[1]) $finish;
if (k > 1 && spi_data_out != sim_rxdata[k]) $finish;
if (k == 1 && sim_txbuf != 16'h3141) $finish;
if (k > 1 && sim_txbuf != sim_txdata[k]) $finish;
if (spi_cmd_idx != k-1) $finish;
end
sck = 0;
@(posedge clk);
ncs = 1;
@(posedge clk);
if (spi_cmd_active) $finish;
if (spi_cmd_step) $finish;
if (spi_cmd_begin) $finish;
repeat(10) @(posedge clk);
end
$finish;
end
spi_regfile spi_regfile_dut (
.clk(clk), .rst(rst),
.sck(sck), .sdi(sdi), .sdo(sdo), .ncs(ncs),
.spi_data_in(spi_data_in),
.spi_data_out(spi_data_out),
.spi_status_word(spi_status_word),
.spi_cmd_word(spi_cmd_word),
.spi_cmd_begin(spi_cmd_begin),
.spi_cmd_active(spi_cmd_active),
.spi_cmd_step(spi_cmd_step),
.spi_cmd_idx(spi_cmd_idx)
);
endmodule