/*
 * mc97_rfi_tb.v
 *
 * vim: ts=4 sw=4
 *
 */

`default_nettype none

module mc97_rfi_tb;

	localparam integer GEN_FREQ = 15; /* Hz */

	// Signals
	// -------

	// Tick
	reg  [15:0] tick_cnt;
	wire        tick;

	// Tone Generation
	real phase;
	real phase_inc = 6.28 * GEN_FREQ / 8000;
	real tmp;

	// DUT connections
	reg  [15:0] pcm_data = 0;
	wire        pcm_stb;

	wire        rfi;

	// Clock reset
	reg clk = 1'b0;
	reg rst = 1'b1;


	// Setup recording
	// ---------------

	initial begin
		$dumpfile("mc97_rfi_tb.vcd");
		$dumpvars(0,mc97_rfi_tb);
		# 600000000 $finish;
	end

	always #500 clk <= !clk; // 1 MHz

	initial begin
		#2000 rst = 0;
	end


	// Generate tone
	// -------------

	// Tick at 8000 Hz
	always @(posedge clk)
		if (rst)
			tick_cnt <= 0;
		else
			tick_cnt <= tick ? 16'd123 : (tick_cnt - 1);

	assign tick = tick_cnt[15];

	// Tone
	always @(posedge clk)
		if (rst)
			phase <= 0.0;
		else if (tick)
			phase <= phase + phase_inc;

	always @(*)
	begin
		tmp = $cos(phase) * (1 << 24) / GEN_FREQ;

		if (tmp > 32767)
			pcm_data = 32767;
		else if (tmp < -32768)
			pcm_data = -32768;
		else
			pcm_data = tmp;
	end

	assign pcm_stb = tick;


	// DUT
	// ---

	mc97_rfi #(
		.CLK_FREQ(1_000_000),
		.F_MIN(10),
		.F_MAX(100)
	) rfi_I (
		.pcm_data (pcm_data),
		.pcm_stb  (pcm_stb),
		.rfi      (rfi),
		.clk      (clk),
		.rst      (rst)
	);

endmodule // mc97_rfi_tb