| 
									
										
										
										
											2025-05-02 11:03:14 +02:00
										 |  |  | `timescale 1ns / 1ps | 
					
						
							| 
									
										
										
										
											2025-05-02 15:51:18 +02:00
										 |  |  | // `default_nettype none | 
					
						
							| 
									
										
										
										
											2025-05-02 11:03:14 +02:00
										 |  |  | module tb_top_uart_rx_tx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Signaux | 
					
						
							|  |  |  |     reg clk = 0; | 
					
						
							|  |  |  |     reg [7:0] data_in = 0; | 
					
						
							|  |  |  |     wire [7:0] rx_data;           // rx_data est maintenant la donnée reçue | 
					
						
							|  |  |  |     wire rx_data_valid;           // rx_data_valid est la validité des données reçues | 
					
						
							|  |  |  |     wire tx;                      // Signal tx à connecter à rx pour le test | 
					
						
							|  |  |  |     reg rx_data_ready;           // rx_data_ready sert a indiquer de passer à la réception suivante | 
					
						
							|  |  |  |     reg tx_data_valid; | 
					
						
							|  |  |  |     reg read_fifo = 0; | 
					
						
							|  |  |  |       | 
					
						
							|  |  |  |     // Instance du module à tester | 
					
						
							|  |  |  |     uart_top top_inst ( | 
					
						
							|  |  |  |         .clk(clk), | 
					
						
							|  |  |  |         .rst(1'b0),              // Assurez-vous de définir un reset dans le testbench | 
					
						
							|  |  |  |         .uart_rx(rx),            // Connecte tx au rx pour le test | 
					
						
							|  |  |  |         .uart_tx(tx),            // Signal de transmission UART | 
					
						
							|  |  |  |         .rx_data(rx_data),       // Données reçues | 
					
						
							|  |  |  |         .rx_data_valid(rx_data_valid),  // Données reçues valides | 
					
						
							|  |  |  |         .rx_data_ready(rx_data_ready),  // Prêt à recevoir (observe ce signal, ne le connecte pas en entrée) | 
					
						
							|  |  |  |         .tx_data(data_in),       // Données à transmettre | 
					
						
							|  |  |  |         .tx_data_valid(tx_data_valid),    // Transmission valide (toujours activée dans ce test) | 
					
						
							|  |  |  |         .tx_data_ready(),         // Prêt pour la transmission (non utilisé dans ce test) | 
					
						
							|  |  |  |         .read_fifo(read_fifo) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Boucle le tx sur rx | 
					
						
							|  |  |  |     assign rx = tx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     always #18.5 clk = ~clk; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Simulation principale | 
					
						
							|  |  |  |     initial begin | 
					
						
							|  |  |  |         $display("Debut de la simulation"); | 
					
						
							|  |  |  |         $dumpfile("uart_loopback.vcd"); // Pour GTKWave | 
					
						
							|  |  |  |         $dumpvars(0, tb_top_uart_rx_tx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Attendre un peu | 
					
						
							|  |  |  |         #200; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rx_data_ready = 1; // Indique que le module est prêt à recevoir des données | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Envoi d'une valeur | 
					
						
							|  |  |  |         data_in = 8'hA5;  // Exemple de data | 
					
						
							|  |  |  |         tx_data_valid = 1;  | 
					
						
							|  |  |  |         #20;  | 
					
						
							|  |  |  |         tx_data_valid = 0;  | 
					
						
							|  |  |  |         rx_data_ready = 0; // Indique que le module n'est pas prêt à recevoir des données | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         #200; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Attendre la réception (valeur valid = 1) | 
					
						
							|  |  |  |         $display("Attente de rx_data_valid"); | 
					
						
							|  |  |  |         wait(rx_data_valid == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         read_fifo = 1; // Indique que la FIFO doit être lue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Affichage des résultats | 
					
						
							|  |  |  |         $display("Data envoyee : 0x%h", data_in); | 
					
						
							|  |  |  |         $display("Data recue   : 0x%h", rx_data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         read_fifo = 0; // Réinitialiser le signal de lecture de FIFO | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (rx_data == data_in) | 
					
						
							|  |  |  |             $display("Test reussi !"); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             $display("Test echoue..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Fin de simulation | 
					
						
							|  |  |  |         #200; | 
					
						
							|  |  |  |         $finish; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | endmodule |