5 ///////////////////////////////////////////////////////////////////////////////////
6 // Sim-wide wires/busses //
7 ///////////////////////////////////////////////////////////////////////////////////
15 reg [7:0] set_addr = 0;
16 reg [31:0] set_data = 0;
19 wire signed [13:0] adc_a;
20 wire signed [13:0] adc_b;
29 ///////////////////////////////////////////////////////////////////////////////////
30 // Simulation control //
31 ///////////////////////////////////////////////////////////////////////////////////
33 // Set up output files
35 $dumpfile("dsp_core_tb.vcd");
36 $dumpvars(0,dsp_core_tb);
39 // Update display every 10 us
40 always #1000 $monitor("Time in us ",$time/1000);
42 // Generate master clock 50% @ 100 MHz
46 ///////////////////////////////////////////////////////////////////////////////////
47 // Unit(s) under test //
48 ///////////////////////////////////////////////////////////////////////////////////
50 reg [13:0] amplitude = 13'h1fff;
51 reg [15:0] impulse_len = 0;
52 reg [15:0] zero_len = 0;
55 initial #500 @(posedge clk) adc_ena = 1;
58 (.clk(clk),.rst(rst),.ena(adc_ena),
59 .dc_offset_a(0),.dc_offset_b(0),
60 .amplitude(amplitude),
61 .impulse_len(impulse_len),.zero_len(zero_len),
62 .adc_a(adc_a),.adc_b(adc_b),
63 .adc_ovf_a(adc_ovf_a),.adc_ovf_b(adc_ovf_b) );
65 initial rx_path.rx_dcoffset_a.integrator = 0; // so sim doesn't propagate X's
66 initial rx_path.rx_dcoffset_b.integrator = 0; // generated before reset
69 .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
70 .adc_a(adc_a),.adc_ovf_a(adc_ovf_a),
71 .adc_b(adc_b),.adc_ovf_b(adc_ovf_b),
73 .run(adc_ena),.sample(sample),.strobe(stb),
76 reg [31:0] master_time = 0;
78 master_time <= master_time + 1;
87 wire [15:0] fifo_occupied;
93 .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
94 .master_time(master_time),
95 .overrun(), // unconnected output
97 .wr_write_o(wr_write),
99 .wr_error_o(wr_error),
100 .wr_ready_i(wr_ready),
103 .run(), // unconnected output, supposed to drive 'run'
105 .fifo_occupied(fifo_occupied),
106 .fifo_full(fifo_full),
107 .fifo_empty(fifo_empty),
108 .debug_rx() // unconnected output
113 ///////////////////////////////////////////////////////////////////////////////////
114 // Simulation output/checking //
115 ///////////////////////////////////////////////////////////////////////////////////
120 rx_file = $fopen("rx.dat", "wb");
122 always @(posedge clk)
124 // Write RX sample I&Q in format Octave can load
127 $fwrite(rx_file, sample[31:16]);
129 $fwrite(rx_file, sample[15:0]);
134 ///////////////////////////////////////////////////////////////////////////////////
136 ///////////////////////////////////////////////////////////////////////////////////
147 task set_impulse_len;
149 @(posedge clk) impulse_len = len-1;
154 @(posedge clk) zero_len = len-1;
157 // Strobe configuration bus with addr, data
158 task write_cfg_register;
170 endtask // write_cfg_register
172 // Set RX DDC frequency
176 write_cfg_register(160, freq);
177 endtask // set_ddc_freq
179 // Set RX IQ scaling registers
180 task set_rx_scale_iq;
181 input [15:0] scale_i;
182 input [15:0] scale_q;
184 write_cfg_register(161, {scale_i,scale_q});
185 endtask // set_rx_scale_iq
187 // Set RX MUX control
191 write_cfg_register(168, muxctrl);
192 endtask // set_rx_muxctrl
194 // Set RX CIC decim and halfband enables
200 write_cfg_register(162, {hb1_ena,hb2_ena,decim});
204 ///////////////////////////////////////////////////////////////////////////////////
205 // Individual tests //
206 ///////////////////////////////////////////////////////////////////////////////////
213 set_ddc_freq(32'h10000000);
214 set_rx_scale_iq(1243, 1243);
222 ///////////////////////////////////////////////////////////////////////////////////
224 ///////////////////////////////////////////////////////////////////////////////////
233 endmodule // dsp_core_tb