updated wiki url
[debian/gnuradio] / usrp2 / fpga / top / u2_rev3_2rx_iad / dsp_core_tb.v
1 `timescale 1ns / 100ps
2
3 module dsp_core_tb;
4
5 ///////////////////////////////////////////////////////////////////////////////////
6 // Sim-wide wires/busses                                                         //
7 ///////////////////////////////////////////////////////////////////////////////////
8    
9    // System control bus
10    reg                clk = 0;
11    reg                rst = 1;
12    
13    // Configuration bus
14    reg                set_stb = 0;  
15    reg          [7:0] set_addr = 0; 
16    reg         [31:0] set_data = 0; 
17
18    // ADC input bus
19    wire signed [13:0] adc_a;
20    wire signed [13:0] adc_b;
21    wire               adc_ovf_a;
22    wire               adc_ovf_b;
23    
24    // RX sample bus
25    reg                run = 1;
26    wire        [31:0] sample;
27    wire               stb;
28    
29 ///////////////////////////////////////////////////////////////////////////////////
30 // Simulation control                                                            //
31 ///////////////////////////////////////////////////////////////////////////////////
32    
33    // Set up output files
34    initial begin
35       $dumpfile("dsp_core_tb.vcd");
36       $dumpvars(0,dsp_core_tb);
37    end
38
39    // Update display every 10 us
40    always #1000 $monitor("Time in us ",$time/1000);
41
42    // Generate master clock 50% @ 100 MHz
43    always
44      #5 clk = ~clk;
45
46 ///////////////////////////////////////////////////////////////////////////////////
47 // Unit(s) under test                                                            //
48 ///////////////////////////////////////////////////////////////////////////////////
49    
50    reg [13:0] amplitude = 13'h1fff;
51    reg [15:0] impulse_len = 0;
52    reg [15:0] zero_len = 0;
53    reg        adc_ena = 0;
54
55    initial #500 @(posedge clk) adc_ena = 1;
56
57    impulse adc
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) );
64
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
67    dsp_core_rx rx_path
68      (.clk(clk),.rst(rst),
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),
72       .io_rx(16'b0),
73       .run(adc_ena),.sample(sample),.strobe(stb),
74       .debug() );
75
76    reg  [31:0] master_time = 0;
77    always @(posedge clk)
78      master_time <= master_time + 1;
79
80    reg         wr_ready    = 1;
81    reg         wr_full     = 0;
82
83    wire [31:0] wr_dat;
84    wire        wr_write;
85    wire        wr_done;
86    wire        wr_error;
87    wire [15:0] fifo_occupied;
88    wire        fifo_full;
89    wire        fifo_empty;
90    
91    rx_control rx_buffer
92     (.clk(clk),.rst(rst),
93      .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
94      .master_time(master_time),
95      .overrun(), // unconnected output
96      .wr_dat_o(wr_dat),
97      .wr_write_o(wr_write),
98      .wr_done_o(wr_done),
99      .wr_error_o(wr_error),
100      .wr_ready_i(wr_ready),
101      .wr_full_i(wr_full),
102      .sample(sample),
103      .run(), // unconnected output, supposed to drive 'run'
104      .strobe(stb),
105      .fifo_occupied(fifo_occupied),
106      .fifo_full(fifo_full),
107      .fifo_empty(fifo_empty),
108      .debug_rx() // unconnected output
109      );
110
111
112    
113 ///////////////////////////////////////////////////////////////////////////////////
114 // Simulation output/checking                                                    //
115 ///////////////////////////////////////////////////////////////////////////////////
116
117    integer rx_file;
118    
119    initial
120      rx_file = $fopen("rx.dat", "wb");
121    
122    always @(posedge clk)
123      begin
124         // Write RX sample I&Q in format Octave can load
125         if (stb)
126           begin
127              $fwrite(rx_file, sample[31:16]);
128              $fputc(32, rx_file);
129              $fwrite(rx_file, sample[15:0]);
130              $fputc(13, rx_file);
131           end
132      end
133    
134 ///////////////////////////////////////////////////////////////////////////////////
135 // Tasks                                                                         //
136 ///////////////////////////////////////////////////////////////////////////////////
137
138    task power_on;
139      begin
140         @(posedge clk)
141           rst = #1 1'b1;
142         @(posedge clk)
143           rst = #1 1'b0;
144      end
145    endtask // power_on
146    
147    task set_impulse_len;
148       input [15:0] len;
149       @(posedge clk) impulse_len = len-1;
150    endtask
151  
152    task set_zero_len;
153       input [15:0] len;
154       @(posedge clk) zero_len = len-1;
155    endtask
156
157    // Strobe configuration bus with addr, data
158    task write_cfg_register;
159       input [7:0]  regno;
160       input [31:0] value;
161       
162       begin
163          @(posedge clk);
164          set_addr <= regno;
165          set_data <= value;
166          set_stb  <= 1'b1;
167          @(posedge clk);
168          set_stb  <= 1'b0;
169       end
170    endtask // write_cfg_register
171
172    // Set RX DDC frequency
173    task set_ddc_freq;
174       input [31:0] freq;
175
176       write_cfg_register(160, freq);
177    endtask // set_ddc_freq
178
179    // Set RX IQ scaling registers
180    task set_rx_scale_iq;
181       input [15:0] scale_i;
182       input [15:0] scale_q;
183
184       write_cfg_register(161, {scale_i,scale_q});
185    endtask // set_rx_scale_iq
186    
187    // Set RX MUX control
188    task set_rx_muxctrl;
189       input [3:0] muxctrl;
190
191       write_cfg_register(168, muxctrl);
192    endtask // set_rx_muxctrl
193    
194    // Set RX CIC decim and halfband enables
195    task set_decim;
196       input hb1_ena;
197       input hb2_ena;
198       input [7:0] decim;
199
200       write_cfg_register(162, {hb1_ena,hb2_ena,decim});
201    endtask // set_decim
202       
203    
204 ///////////////////////////////////////////////////////////////////////////////////
205 // Individual tests                                                              //
206 ///////////////////////////////////////////////////////////////////////////////////
207
208    task test_rx;
209       begin
210          set_impulse_len(10);
211          set_zero_len(990);
212          set_rx_muxctrl(1);
213          set_ddc_freq(32'h10000000);
214          set_rx_scale_iq(1243, 1243);
215          set_decim(1, 1, 1);
216
217          #100000 $finish;
218       end
219    endtask // test_rx
220    
221       
222 ///////////////////////////////////////////////////////////////////////////////////
223 // Top-level test                                                                //
224 ///////////////////////////////////////////////////////////////////////////////////
225
226    // Execute tests
227    initial
228      begin
229         power_on();
230         test_rx();
231      end
232
233 endmodule // dsp_core_tb