2021-02-02 19:09:52 +03:00

71 lines
1.4 KiB
Systemverilog

`timescale 1ps/1ps
module tb_mcp3201;
logic clock = 1'b0;
logic reset = 1'b1;
/* Master clock 10MHz (100ns period) */
always #(100ns/2) clock <= ~clock;
logic spi_clk;
logic spi_ssn;
logic spi_miso;
logic [11:0] data;
logic strb;
spi_sclk_gen #(.CLOCK_FREQ(10000000), .SCLK_FREQ(50000 * 17)) spi_clk_g
(.clock, .reset,
.sclk_o(spi_clk));
mcp3201 DUT
(.clock, .reset,
.spi_clk_i(spi_clk),
.spi_ssn_o(spi_ssn),
.spi_miso_i(spi_miso),
.data_o(data),
.strb_o(strb));
always_ff @ (posedge clock)
if (strb)
$display("%15b", data);
logic [14:0] ds;
initial begin
reset = 1'b1;
repeat(10) @(posedge clock);
reset = 1'b0;
/* Send word 0 */
wait(spi_ssn == 1'b0);
ds = 15'bzz0_1010_1010_1010;
for (int i = 0; i < 15; i ++) begin
@(negedge spi_clk) spi_miso = ds[14];
ds = ds << 1;
end
/* Send word 1 */
wait(spi_ssn == 1'b1);
wait(spi_ssn == 1'b0);
ds = 15'bzz0_0101_0101_0101;
for (int i = 0; i < 15; i ++) begin
@(negedge spi_clk) spi_miso = ds[14];
ds = ds << 1;
end
wait(spi_ssn == 1'b1);
repeat(10) @(posedge clock);
$finish;
end
initial begin
$dumpfile("tb_mcp3201.vcd");
$dumpvars;
end
endmodule // tb_mcp3201