Imported Upstream version 3.2.2
[debian/gnuradio] / gr-radar-mono / src / fpga / tb / radar_tb.v
1 // -*- verilog -*-
2 //
3 //  USRP - Universal Software Radio Peripheral
4 //
5 //  Copyright (C) 2007 Corgan Enterprises LLC
6 //
7 //  This program is free software; you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License as published by
9 //  the Free Software Foundation; either version 2 of the License, or
10 //  (at your option) any later version.
11 //
12 //  This program is distributed in the hope that it will be useful,
13 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 //  GNU General Public License for more details.
16 //
17 //  You should have received a copy of the GNU General Public License
18 //  along with this program; if not, write to the Free Software
19 //  Foundation, Inc., 51 Franklin Street, Boston, MA  02110-1301  USA
20 //
21
22 `timescale 1ns/1ps
23
24 `include "../lib/radar.v"
25
26 module radar_tb;
27
28    // System bus
29    reg         clk;
30    reg         rst;
31    reg         ena;
32    
33    // Configuration bus
34    reg [6:0]   saddr;
35    reg [31:0]  sdata;
36    reg         s_strobe;
37
38    // DAC bus
39    wire        tx_strobe;
40    wire [13:0] tx_dac_i;
41    wire [13:0] tx_dac_q;
42
43    // ADC bus
44    reg [15:0]  rx_adc_i;
45    reg [15:0]  rx_adc_q;
46    
47    // FIFO bus
48    wire        fifo_strobe;
49    wire [15:0] fifo_i;
50    wire [15:0] fifo_q;
51    
52    // Configuration shadow registers
53    reg [31:0]  mode;
54    
55    radar uut
56      (.clk_i(clk),.saddr_i(saddr),.sdata_i(sdata),.s_strobe_i(s_strobe),
57       .tx_strobe_o(tx_strobe),.tx_dac_i_o(tx_dac_i),.tx_dac_q_o(tx_dac_q),
58       .rx_adc_i_i(rx_adc_i),.rx_adc_q_i(rx_adc_q),
59       .rx_strobe_o(fifo_strobe),.rx_ech_i_o(fifo_i),.rx_ech_q_o(fifo_q));
60
61    // Start up initialization
62    initial
63      begin
64         clk = 0;
65         rst = 0;
66         ena = 0;
67         saddr = 0;
68         sdata = 0;
69         s_strobe = 0;
70         rx_adc_i = 0;
71         rx_adc_q = 0;
72         mode = 0;
73         
74         @(posedge clk);
75         rst = 1;
76         @(posedge clk);
77         rst = 0;
78         @(posedge clk);
79         ena = 1;
80      end
81    
82    always
83      #5 clk <= ~clk;
84    
85    initial
86      begin
87         //$monitor($time, " clk=%b rst=%b", clk, uut.reset);
88         
89         $dumpfile("radar_tb.vcd");
90         $dumpvars(0, radar_tb);
91      end
92
93    // Test tasks
94    task write_cfg_register;
95       input [6:0]  regno;
96       input [31:0] value;
97       
98       begin
99          @(posedge clk);
100          saddr <= regno;
101          sdata <= value;
102          s_strobe <= 1'b1;
103          @(posedge clk);
104          s_strobe <= 0;
105       end
106    endtask // write_cfg_register
107    
108    // Application reset line
109    task set_reset;
110       input reset;
111       
112       begin
113          mode = reset ? (mode | `bmFR_RADAR_MODE_RESET) : (mode & ~`bmFR_RADAR_MODE_RESET);
114          write_cfg_register(`FR_RADAR_MODE, mode);
115       end
116    endtask // reset
117    
118    // Waveform on time
119    task set_ton;
120       input [23:0] t_on;
121
122       begin
123          write_cfg_register(`FR_RADAR_TON, t_on);
124       end
125    endtask // set_ton
126
127    // Transmitter switching time
128    task set_tsw;
129       input [23:0] t_sw;
130
131       begin
132          write_cfg_register(`FR_RADAR_TSW, t_sw);
133       end
134    endtask // t_sw
135
136    // Receiver look time
137    task set_tlook;
138       input [23:0] t_look;
139
140       begin
141          write_cfg_register(`FR_RADAR_TLOOK, t_look);
142       end
143    endtask // set_tlook
144
145    // Inter-pulse idle time
146    task set_tidle;
147       input [23:0] t_idle;
148
149       begin
150          write_cfg_register(`FR_RADAR_TIDLE, t_idle);
151       end
152    endtask // set_tidle
153
154    // Chirp amplitude
155    task set_ampl;
156       input [31:0] ampl;
157
158       begin
159          write_cfg_register(`FR_RADAR_AMPL, ampl);
160       end
161    endtask // set_ampl
162
163    // Chirp start frequency
164    task set_fstart;
165       input [31:0] fstart;
166
167       begin
168          write_cfg_register(`FR_RADAR_FSTART, fstart);
169       end
170    endtask // set_fstart
171    
172    // Chirp frequency increment
173    task set_fincr;
174       input [31:0] fincr;
175
176       begin
177          write_cfg_register(`FR_RADAR_FINCR, fincr);
178       end
179    endtask // set_fincr
180
181    // Chirp frequency increment
182    task set_atrdel;
183       input [31:0] atrdel;
184
185       begin
186          write_cfg_register(`FR_RADAR_ATRDEL, atrdel);
187       end
188    endtask // set_fincr
189
190    // Test transmitter functionality
191    task test_tx;
192       begin
193          #20 set_reset(1);
194
195          #20 set_ton(320-1);    // 5us on time
196          #20 set_tsw(26-1);     // 406ns switching time
197          #20 set_tlook(640-1);  // 10us look time
198          #20 set_tidle(2854-1); // 60us pulse period
199          
200          #20 set_ampl(16'd9946);
201          #20 set_fstart(32'h80000000); // -16 to 16 MHz
202          #20 set_fincr (32'h0199999A);
203          #20 set_atrdel(32'h00400046); // 64 TX clks, 70 RX clks         
204          #20 set_reset(0);
205          #200000;
206       end
207    endtask // test_tx
208    
209    // Execute tests
210    initial
211      begin
212         #20 test_tx;
213         #100 $finish;
214      end
215 endmodule