| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | `timescale 1ns/1ps | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module TB(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | initial | 
					
						
							|  |  |  | begin | 
					
						
							|  |  |  |      $fsdbDumpfile("TB.fsdb"); | 
					
						
							|  |  |  |      $fsdbDumpvars(0, TB); | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |     reg         clk; | 
					
						
							|  |  |  |     reg         rst_n; | 
					
						
							|  |  |  |     reg  [15:0] din; | 
					
						
							|  |  |  |     reg         enable; | 
					
						
							|  |  |  |     reg  [21:0] cnt; | 
					
						
							|  |  |  |     wire [15:0] dout0; | 
					
						
							|  |  |  |     wire [15:0] dout1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |     s2p_2 uut ( | 
					
						
							|  |  |  |         .clk    (clk), | 
					
						
							|  |  |  |         .rst_n  (rst_n), | 
					
						
							|  |  |  |         .din    (din), | 
					
						
							|  |  |  |         .en (enable), | 
					
						
							|  |  |  |         .dout0 (dout0), | 
					
						
							|  |  |  |         .dout1 (dout1) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | reg[15:0]  din_r1; | 
					
						
							|  |  |  | always  @(posedge clk or negedge rst_n)begin | 
					
						
							|  |  |  |     if(rst_n==1'b0)begin | 
					
						
							|  |  |  |         din_r1 <= 0; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     else begin | 
					
						
							|  |  |  |         din_r1 <= din; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | wire signed [15:0] diff; | 
					
						
							|  |  |  | assign diff = din - din_r1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | reg[15:0]  dout1_r1; | 
					
						
							|  |  |  | reg[15:0]  dout1_r2; | 
					
						
							|  |  |  | always  @(posedge clk or negedge rst_n)begin | 
					
						
							|  |  |  |     if(rst_n==1'b0)begin | 
					
						
							|  |  |  |         dout1_r1 <= 0; | 
					
						
							|  |  |  |         dout1_r2 <= 0; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     else begin | 
					
						
							|  |  |  |         dout1_r1 <= dout1; | 
					
						
							|  |  |  |         dout1_r2 <= dout1_r1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | wire  signed [15:0] diff12; | 
					
						
							|  |  |  | wire  signed [15:0] diff23; | 
					
						
							|  |  |  | assign  diff12 = dout0 - dout1_r2; | 
					
						
							|  |  |  | assign  diff23 = dout1 - dout0; | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |     initial begin | 
					
						
							|  |  |  |         rst_n = 0; | 
					
						
							|  |  |  |         enable = 0; | 
					
						
							|  |  |  |         clk = 1'b0; | 
					
						
							|  |  |  |         din = 16'h0000; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |         #20; | 
					
						
							|  |  |  |         rst_n = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |         #10; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							|  |  |  |     always #5 clk = ~clk;  | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |     always @(posedge clk or negedge rst_n) begin | 
					
						
							|  |  |  |         if (rst_n == 1'b0) begin | 
					
						
							|  |  |  |             cnt <= 22'd0; | 
					
						
							|  |  |  |         end else begin | 
					
						
							|  |  |  |             cnt <= cnt + 22'd1; | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  | reg [15:0] enable_cnt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | always @(posedge clk or negedge rst_n) begin | 
					
						
							|  |  |  |     if (rst_n == 1'b0) begin | 
					
						
							|  |  |  |         enable <= 0; | 
					
						
							|  |  |  |         din <= 16'd0; | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |         enable_cnt <= 0;   | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |     end else begin | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |          | 
					
						
							|  |  |  |         if (cnt < 1000) begin   | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |             if (enable_cnt == 0) begin | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |                 if ($urandom % 2 == 0) begin  | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |                     enable <= 1; | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |                     enable_cnt <= $urandom % 10 + 5;   | 
					
						
							|  |  |  |                     din <= $urandom;  | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |                 end else begin | 
					
						
							|  |  |  |                     enable <= 0; | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |                     din <= 16'd0;   | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |                 end | 
					
						
							|  |  |  |             end else begin | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |                  | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |                 enable <= 1; | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |                 enable_cnt <= enable_cnt - 1;  | 
					
						
							|  |  |  |                 din <= $urandom;  | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |             end | 
					
						
							|  |  |  |         end else begin | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |             enable <= 0;   | 
					
						
							|  |  |  |             din <= 16'd0;   | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |         end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |     initial begin | 
					
						
							| 
									
										
										
										
											2025-03-03 18:10:00 +08:00
										 |  |  |         wait(cnt[11] == 1);  | 
					
						
							| 
									
										
										
										
											2025-02-26 15:50:49 +08:00
										 |  |  |         $finish; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | endmodule |