-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspi_transmitter_tb.v
More file actions
123 lines (98 loc) · 2.31 KB
/
Copy pathspi_transmitter_tb.v
File metadata and controls
123 lines (98 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Testbench for SPI module. It consists of the single SPI
// transmitter and fifo module. During the test, TEST_WORD is written in
// fifo module. When SPI ransmitter receive start signal it starts transmission.
// Transmitted data are automatically check.
`timescale 1us / 1ns
module spi_transmitter_tb;
// Testbench uses a 1 MHz clock
parameter CLK_PERIOD = 1.0; // In us
parameter [23:0] TEST_WORD = 24'b1110_1010_0011_1010_0011_0101;
reg reset;
reg clock;
reg start_transmit;
reg [23:0] rx_test = 0;
wire fifo_empty;
wire fifo_read;
wire [23:0] data;
wire sdo;
wire sclk;
wire sync_n;
integer i = 0;
// Testing modules
spi_transmitter spi_transmitter_dut(
.clock (clock),
.reset (reset),
// FIFO connection
.data (data),
.fifo_read (fifo_read),
.fifo_empty (fifo_empty),
// Control
.start_transmit (start_transmit),
.spi_busy (),
// DAC connetcion
.sdo (sdo),
.sclk (sclk),
.sync_n (sync_n)
);
fifo_buffer fifo_buffer_dut(
.clock (clock),
.reset (reset),
// Write and read data ports
.write_data (),
.data_in (),
.read_data (fifo_read),
.data_out (data),
// Status ports
.full (),
.empty (fifo_empty)
);
// Clock signal
always #(CLK_PERIOD/2) clock <= ~clock;
// Initialisation
task init();
begin
clock <= 0;
reset <= 0;
start_transmit <= 0;
end
endtask
// Configure fifo module for test
task fifo_config();
begin
fifo_buffer_dut.mem[0] <= TEST_WORD;
fifo_buffer_dut.mem[1] <= TEST_WORD;
fifo_buffer_dut.mem[2] <= TEST_WORD;
fifo_buffer_dut.write_pointer <= 6'b000011;
end
endtask
task reset_pulse();
begin
#(CLK_PERIOD) reset <= 1;
#(CLK_PERIOD) reset <= 0;
#(CLK_PERIOD);
end
endtask
// Receive word from transmitter
always @(negedge sync_n) begin
// Skip half of the clock cycle
#(CLK_PERIOD/2);
// Receive word
for (i=23; i>-1; i=i-1) begin
rx_test[i] <= sdo;
#(CLK_PERIOD);
end
// Skip half of the clock cycle
#(CLK_PERIOD/2);
// Checking if the transmission was successful.
if (rx_test == TEST_WORD) $display("Transmission succeed.");
else $display("Transmission failure!");
i = 0;
end
// Main simulation cycle
initial begin
init();
reset_pulse();
fifo_config();
start_transmit <= 1;
end
endmodule