OpenCores
URL https://opencores.org/ocsvn/spi_core_dsp_s3ean_kits/spi_core_dsp_s3ean_kits/trunk

Subversion Repositories spi_core_dsp_s3ean_kits

[/] [spi_core_dsp_s3ean_kits/] [trunk/] [rtl/] [verilog/] [spi_top_tb2.v] - Rev 2

Compare with Previous | Blame | View Log

`include "timescale.v"
`include "spi_defines.v"
//	spi_top tb
module spi_top_tb2();
 
	//
	// FOR SPI_TOP COMPLETED SUNDAY NOV 15th
	//
 
	//parameters
	parameter CLKPERIOD = 20;
	//
	// Control words
	//
 
	parameter CTRL_PREP		= 	14'h0E18; //TXC=0, SAMPLE = 0,| LSB=1, TXN=1, RXN=1, GO=0,| WR=0, LEN=24bits
	parameter CTRL_TXC		=	14'h2E18; //TXC=1, SAMPLE = 0,| LSB=1, TXN=1, RXN=1, GO=0,| WR=0, LEN=24bits 
	parameter CTRL_GOSAMPLE	=	14'h1F18; //TXC=0, SAMPLE = 1,| LSB=1, TXN=1, RXN=1, GO=1,| WR=0, LEN=24bits
	parameter CTRL_GOWRITE	=	14'h0F98; //TXC=0, SAMPLE = 0,| LSB=1, TXN=1, RXN=1, GO=1,| WR=1, LEN=24bits
	parameter CTRL_GOALL	=	14'h1F98; //TXC=0, SAMPLE = 1,| LSB=1, TXN=1, RXN=1, GO=1,| WR=1, LEN=24bits
 
	parameter DIV_VALUE		=	24'h000010; //dec 16
 
	parameter DAC_A			=	4'h0; // choose dac A
	parameter DAC_COMMAND	=	4'h3; // write to adn update dac n
	parameter FINISHTIME	=	186*1000; //17 ns per write...
 
	// dut inputs
	reg clk;
	reg rst;
	reg ampDAC;
	reg load_div;
	reg load_ctrl;
	reg [23:0] data_in;
	// interconnect wires
	wire spi_mosi;
	wire amp_miso;
	wire dac_miso;
	wire adc_miso;
	wire spi_clk;	
	wire [1:0] ss_o;
	wire conv;
 
	reg fin, fin1;
	reg [23:0] data_tbw; //data to be written
	reg [11:0] dac_data_in;
 
	//output wires
	wire [7:0] 	gain_state;
	wire [3:0] 	dac_command;
	wire [3:0] 	dac_n;
	wire [11:0] dac_data;
	wire 		go;
	wire [13:0] chanA;
	wire [13:0] chanB;
	wire 		adcValid;
 
	// events
	event write_command, reset, write_div, write_dac, write_amp, read_adc, rw_DSP;
 
	// dut outputs
 
	/*
	// dut
	/*spi_top spi_core (.clk(), .rst(), .ampDAC(), .data_in(), .chanA(), .chanB(), .adcValud(), .load_div(),
		 	.load_ctrl(), . go(), .conv, ss_pad_o(), 
			.sclk_pad_o(), .mosi_pad_o(), .miso_pad_i()); */
	spi_top spi_core (.clk(clk), 
					.rst(rst), 
					.ampDAC(ampDAC), 
					.data_in(data_in),
					.chanA(chanA),
					.chanB(chanB),
					.adcValid(adcValid),
					.load_div(load_div),
				 	.load_ctrl(load_ctrl),
				  	.go(go), 
					.conv(conv),
				 	.ss_pad_o(ss_o), 
					.sclk_pad_o(spi_clk),
					.mosi_pad_o(spi_mosi),
					.miso_pad_i(adc_miso));
 
	// spi models
	// dac(.spi_clk(), .reset(), .cs(), .din(), .dout(), .command(), .dacN(), .dacDATA());
	// amp(.spi_clk(), .reset(), .cs(), .din(), .dout(), .gain_state());
	// adc(.sdo(), .spi_clk(), .clk(), .rst(), .conv() );
	dac dac_test (.spi_clk(spi_clk), 
	.reset(rst), .cs(ss_o[0]), .din(spi_mosi), 
					.dout(dac_miso), 
					.command(dac_command), 
					.dacN(dac_n), 
					.dacDATA(dac_data));
	amp amp_test (.spi_clk(spi_clk), 
					.reset(rst), 
					.cs(ss_o[1]), 
					.din(spi_mosi), 
					.dout(amp_miso),
				 	.gain_state(gain_state));
	adc adc_test(.sdo(adc_miso), 
					.spi_clk(spi_clk),
				 	.clk(clk), 
					.rst(rst), 
					.conv(conv));
	// dut stimulus
	// 1 reset
	// 2 write the divider
	// 3 write the control
	// 4 write a word to the amp
	// 5 write a word to the dac
	// 6 read a word from the adc
	// 6 write a procedure for checking the words written
 
	//clk
	always
		#(CLKPERIOD/2) clk = ~clk;
 
	//initial conditions
	initial
	begin
		load_div	=0;
		load_ctrl	=0;
		clk			=1;
		ampDAC		=0;
		rst			=0;
		fin 		=0;
		fin1		=0;
		data_in		=24'b0;
		dac_data_in	='b0;
		#FINISHTIME ;
		$display ("Finishing simulation due to simulation constraint.");
		$display ("Time is - %d",$time);
		$finish;
	end
 
	// CTRL_PREP		TXC=0, SAMPLE = 0,| LSB=1, TXN=1, RXN=1, GO=0,| WR=0, LEN=24bits
	// CTRL_TXC			TXC=1, SAMPLE = 0,| LSB=1, TXN=1, RXN=1, GO=0,| WR=0, LEN=24bits 
	// CTRL_GOSAMPLE	TXC=0, SAMPLE = 1,| LSB=1, TXN=1, RXN=1, GO=1,| WR=0, LEN=24bits
	// CTRL_GOWRITE		TXC=0, SAMPLE = 0,| LSB=1, TXN=1, RXN=1, GO=1,| WR=1, LEN=24bits
	// CTRL_GOALL		TXC=0, SAMPLE = 1,| LSB=1, TXN=1, RXN=1, GO=1,| WR=1, LEN=24bits
	// events: write_command, reset, write_div, write_word;
 
	//event ordering
	initial
	begin
		$display("Starting simulation");
		#CLKPERIOD	-> reset;
		wait(fin)
		fin =0;
 
		$display("Reset finished");
		data_in=CTRL_PREP;
		#CLKPERIOD	-> write_command;
		wait(fin)
		fin =0;
 
		data_in=DIV_VALUE;
		#CLKPERIOD  -> write_div;
		wait(fin)
		fin =0;
 
		data_tbw =24'h110000; //write 0x11 to AMP
		#CLKPERIOD 	-> write_amp;
		wait(fin)
		fin =0;
 
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> write_dac;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> write_dac;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> write_dac;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> write_dac;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> write_dac;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> write_dac;
		wait(fin)
		fin =0;
		#CLKPERIOD 	-> read_adc;
		wait(fin)
		fin =0;
		#CLKPERIOD 	-> read_adc;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> rw_DSP;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> rw_DSP;
		wait(fin)
		fin =0;
		dac_data_in=dac_data_in+1;
		data_tbw = {DAC_COMMAND, DAC_A,dac_data_in,4'b0};
		#CLKPERIOD 	-> rw_DSP;
		wait(fin)
		fin =0;
 
		#CLKPERIOD;
		#CLKPERIOD;
		$display ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		$display ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		#CLKPERIOD;
		$display("Finishing up at time %7d", $time);
		$display ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		$display ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
 
		$finish;
	end
 
	//event definitions
	always @(reset)
	begin
		$display ("entering reset at time %6d",$time);
		#10;
		rst=1;
		#100;
		rst=0;
		$display ("leaving event at time %6d",$time);
		fin =1;
	end
 
	always @(write_div)
	begin
		$display("writing value %3d to divider register",data_in);
		load_div=1;
		#CLKPERIOD;
		load_div=0;
		$display("leaving write_div at time %6d",$time);
		fin =1;
	end
 
	always @(write_command)
	begin
		$display("writing word %4h to control register",data_in);
		load_ctrl=1;
		#CLKPERIOD;
		load_ctrl=0;
		$display("leaving write_command at time %6d",$time);
		fin =1;
	end
 
	always @(write_amp)
	begin
		$display("writing word %4h to tx AMP at time %6d",data_tbw, $time);
		data_in = CTRL_TXC;
		$display("writing word %4h to control register",data_in);
		load_ctrl=1;
		#CLKPERIOD;
		load_ctrl=0;
		$display ("returned to write_word event at time %5d",$time);
		data_in = data_tbw;
		#CLKPERIOD;
		load_ctrl=1;
		ampDAC =0;
		data_in = CTRL_GOWRITE;
		#CLKPERIOD;
		load_ctrl=0;
		$display("waiting for go to go low...");
		wait(!go)
		$display("go went low at time %6d",$time);
		#CLKPERIOD;
		fin =1;
	end
 
	always @(write_dac)
	begin
		$display("writing word %4h to tx DAC at time %6d",data_tbw, $time);
		data_in = CTRL_TXC;
		$display("writing word %4h to control register",data_in);
		load_ctrl=1;
		#CLKPERIOD;
		load_ctrl=0;
		$display ("returned to write_word event at time %6d",$time);
		data_in = data_tbw;
		#CLKPERIOD;
		load_ctrl=1;
		ampDAC =1;
		data_in = CTRL_GOWRITE;
		#CLKPERIOD;
		load_ctrl=0;
		$display("waiting for go to go low...");
		wait(!go)
		$display("go went low at time %6d",$time);
		#CLKPERIOD;
		fin =1;
	end
 
	always @(read_adc)
	begin
		$display ("Reading from the ADC");
		#CLKPERIOD;
		load_ctrl=1;
		data_in = CTRL_GOSAMPLE;
		#CLKPERIOD;
		load_ctrl=0;
		#2;
		$display("waiting for go to go low...");
		wait(!go)
		$display("go went low at time %6d",$time);
		#CLKPERIOD;
		fin =1;
	end
 
	always @(rw_DSP)
	begin
		$display("writing word %4h to tx DAC and SAMPLING at time %6d",data_tbw, $time);
		data_in = CTRL_TXC;
		$display("writing word %4h to control register",data_in);
		load_ctrl=1;
		#CLKPERIOD;
		load_ctrl=0;
		$display ("returned to write_word event at time %6d",$time);
		data_in = data_tbw;
		#CLKPERIOD;
		load_ctrl=1;
		ampDAC =1;
		data_in = CTRL_GOALL;
		#CLKPERIOD;
		load_ctrl=0;
		$display("waiting for go to go low...");
		#2;
		wait(!go)
		$display("go went low at time %6d",$time);
		#CLKPERIOD;
		fin =1;	
	end
	//monitor
	//dump the activity
	initial
	begin
		$dumpfile ("waves.vcd");
		$dumpvars(0,spi_top_tb2);
	end
 
endmodule

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.