summaryrefslogtreecommitdiff
path: root/gr-radar-mono/src/fpga/tb/radar_tb.v
diff options
context:
space:
mode:
Diffstat (limited to 'gr-radar-mono/src/fpga/tb/radar_tb.v')
-rw-r--r--gr-radar-mono/src/fpga/tb/radar_tb.v182
1 files changed, 182 insertions, 0 deletions
diff --git a/gr-radar-mono/src/fpga/tb/radar_tb.v b/gr-radar-mono/src/fpga/tb/radar_tb.v
new file mode 100644
index 0000000000..5551a1672c
--- /dev/null
+++ b/gr-radar-mono/src/fpga/tb/radar_tb.v
@@ -0,0 +1,182 @@
+// -*- verilog -*-
+//
+// USRP - Universal Software Radio Peripheral
+//
+// Copyright (C) 2007 Corgan Enterprises LLC
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301 USA
+//
+
+`timescale 1ns/1ps
+
+`include "../lib/radar.v"
+
+module radar_tb;
+
+ // System bus
+ reg clk;
+ reg rst;
+ reg ena;
+
+ // Configuration bus
+ reg [6:0] saddr;
+ reg [31:0] sdata;
+ reg s_strobe;
+
+ // DAC bus
+ reg tx_strobe;
+ wire [13:0] tx_dac_i;
+ wire [13:0] tx_dac_q;
+
+ // ADC bus
+ reg rx_strobe;
+ reg [15:0] rx_adc_i;
+ reg [15:0] rx_adc_q;
+
+ // FIFO bus
+ wire fifo_strobe;
+ wire [15:0] fifo_i;
+ wire [15:0] fifo_q;
+
+ // Configuration shadow registers
+ reg [31:0] mode;
+
+ radar uut
+ (.clk_i(clk),.saddr_i(saddr),.sdata_i(sdata),.s_strobe_i(s_strobe),
+ .tx_strobe_i(tx_strobe),.tx_dac_i_o(tx_dac_i),.tx_dac_q_o(tx_dac_q),
+ .rx_strobe_i(rx_strobe),.rx_adc_i_i(rx_adc_i),.rx_adc_q_i(rx_adc_q),
+ .rx_strobe_o(fifo_strobe),.rx_ech_i_o(fifo_i),.rx_ech_q_o(fifo_q));
+
+ // Drive tx_strobe @ half clock rate
+ always @(posedge clk)
+ tx_strobe <= ~tx_strobe;
+
+ // Start up initialization
+ initial
+ begin
+ clk = 0;
+ rst = 0;
+ ena = 0;
+ saddr = 0;
+ sdata = 0;
+ s_strobe = 0;
+ tx_strobe = 0;
+ rx_strobe = 1;
+ rx_adc_i = 0;
+ rx_adc_q = 0;
+ mode = 0;
+
+ @(posedge clk);
+ rst = 1;
+ @(posedge clk);
+ rst = 0;
+ @(posedge clk);
+ ena = 1;
+ end
+
+ always
+ #5 clk <= ~clk;
+
+ initial
+ begin
+ //$monitor($time, " clk=%b rst=%b", clk, uut.reset);
+
+ $dumpfile("radar_tb.vcd");
+ $dumpvars(0, radar_tb);
+ end
+
+ // Test tasks
+ task write_cfg_register;
+ input [6:0] regno;
+ input [31:0] value;
+
+ begin
+ @(posedge clk);
+ saddr <= regno;
+ sdata <= value;
+ s_strobe <= 1'b1;
+ @(posedge clk);
+ s_strobe <= 0;
+ end
+ endtask // write_cfg_register
+
+ // Application reset line
+ task set_reset;
+ input reset;
+
+ begin
+ mode = reset ? (mode | `bmFR_RADAR_MODE_RESET) : (mode & ~`bmFR_RADAR_MODE_RESET);
+ write_cfg_register(`FR_RADAR_MODE, mode);
+ end
+ endtask // reset
+
+ // Enable/disable transmitter
+ task enable_tx;
+ input enabled;
+
+ begin
+ mode = enabled ? (mode | `bmFR_RADAR_MODE_TX) : (mode & ~`bmFR_RADAR_MODE_TX);
+ write_cfg_register(`FR_RADAR_MODE, mode);
+ end
+ endtask // enable_tx
+
+ // Enable/disable receiver
+ task enable_rx;
+ input enabled;
+
+ begin
+ mode = enabled ? (mode | `bmFR_RADAR_MODE_RX) : (mode & ~`bmFR_RADAR_MODE_RX);
+ write_cfg_register(`FR_RADAR_MODE, mode);
+ end
+ endtask // enable_rx
+
+ // Waveform amplitude
+ task set_amplitude;
+ input [13:0] amp;
+
+ begin
+ write_cfg_register(`FR_RADAR_AMPL, amp);
+ end
+ endtask // set_amplitude
+
+ // Waveform frequency
+ task set_frequency;
+ input [31:0] freq;
+
+ begin
+ write_cfg_register(`FR_RADAR_FREQ1N, freq);
+ end
+ endtask // frequency
+
+ // Test transmitter functionality
+ task test_tx;
+ begin
+ #20 set_reset(1);
+ #20 set_amplitude(16'd9946);
+ #20 set_frequency(32'h08000000);
+ #20 enable_tx(1);
+ #20 enable_rx(0);
+ #20 set_reset(0);
+ #10000;
+ end
+ endtask // test_tx
+
+ // Execute tests
+ initial
+ begin
+ #20 test_tx;
+ #100 $finish;
+ end
+endmodule