// Testbench fuer D-FlipFlop. Dieses module erzeugt Signale, mit denen das D-FF geprüft wird.
`timescale 1ns/1ps	//Anweisung für den Simulator: Ein Zeitschritt ist 1ns lang. es soll mit einer
					//Genauigkeit von 1ps simuliert werden.

module tb_d_ff;		//Dies ist das sogenannte top-level module, das direkt vom Simulator ausgeführt wird.
					//Daher hat es keine Ein- oder Ausgänge.

	reg CLK_50_TB;	//50 MHz Taktsignal
	reg DATA_TB;	//Datensignal
	wire Q_TB;		//Nichtinvertierender Ausgang
	assign Qn_TB = ~Q_TB;
	//wire Qn_TB;		//Invertierender Ausgang
	
	//Initialisierung der regs
	
	initial		//Der Initialblock startet einmal beim Beginn der Simulation
	begin
		CLK_50_TB = 1'b0;	//Die Signale, die die Testbech erzeugt, werden initialisiert
		DATA_TB = 1'b0;
		
		//Erzeugung der Signalfolge für DATA_TB
		#15 DATA_TB = 1'b1;		//15 Zeiteinheiten nach Simulationsbeginn wird DATA_TB 1
		#20 DATA_TB = 1'b0;		//20 Simulationseinheiten später wird DATA_TB wieder 0
		#17 DATA_TB = ~DATA_TB;		//Weitere 17 Zeiteinheiten später wird DATA_TB invertiert.
		#3 DATA_TB = 1'b0;
		#3 DATA_TB = 1'b1;
		#3 DATA_TB = 1'b0;
		#3 DATA_TB = 1'b1;
		#3 DATA_TB = 1'b0;
		#3 DATA_TB = 1'b1;
		#10 DATA_TB = 1'b0;
	end
	
	//Alwaysblock zum erzeugen des Taktsignals
	
	always
	begin
		CLK_50_TB = ~CLK_50_TB;
		#10;	// Zeiteinheiten Verzögerung -> 20ns Periode -> 50 MHz Taktfrequenz
	end
	
	//Instanzierung des modules d_ff unter dem Namen d_ff_test
	d_ff d_ff_test(
		.D(DATA_TB),
		.CLK(CLK_50_TB),
		.Q(Q_TB),
		.Qn(Qn_TB));
endmodule //testbench