mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	Adding tests for dynamic part select optimisation
This commit is contained in:
		
							parent
							
								
									e86ba3b94d
								
							
						
					
					
						commit
						87910732f1
					
				
					 7 changed files with 161 additions and 0 deletions
				
			
		
							
								
								
									
										19
									
								
								tests/arch/common/dynamic_part_select/forloop_select.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tests/arch/common/dynamic_part_select/forloop_select.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| module forloop_select #(parameter WIDTH=256, SELW=4) | ||||
|    (input                  clk , | ||||
|     input [9:0] 	   ctrl , | ||||
|     input [15:0] 	   din , | ||||
|     input 		   en, | ||||
|     output reg [WIDTH-1:0] dout); | ||||
|     | ||||
|    reg [SELW-1:0] 	   sel; | ||||
|    localparam SLICE = WIDTH/(SELW**2); | ||||
|     | ||||
|    always @(posedge clk) | ||||
|      begin | ||||
|         if (en) begin | ||||
|            for (sel = 0; sel < 4'hf; sel=sel+1'b1) | ||||
|              dout[(ctrl*sel)+:SLICE] <= din; | ||||
|         end | ||||
|      end | ||||
| endmodule | ||||
| 
 | ||||
							
								
								
									
										19
									
								
								tests/arch/common/dynamic_part_select/multiple_blocking.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tests/arch/common/dynamic_part_select/multiple_blocking.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| module multiple_blocking #(parameter WIDTH=256, SELW=2) | ||||
|    (input 	         clk , | ||||
|     input [9:0] 	 ctrl , | ||||
|     input [15:0] 	 din , | ||||
|     input [SELW-1:0] 	 sel , | ||||
|     output reg [WIDTH:0] dout); | ||||
| 
 | ||||
|    localparam SLICE = WIDTH/(SELW**2); | ||||
|    reg [9:0] 		 a; | ||||
|    reg [SELW-1:0] 	 b; | ||||
|    reg [15:0] 		 c; | ||||
|    always @(posedge clk) begin | ||||
|       a = ctrl + 1; | ||||
|       b = sel - 1; | ||||
|       c = ~din; | ||||
|       dout = dout + 1; | ||||
|       dout[a*b+:SLICE] = c; | ||||
|    end | ||||
| endmodule | ||||
							
								
								
									
										14
									
								
								tests/arch/common/dynamic_part_select/nonblocking.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								tests/arch/common/dynamic_part_select/nonblocking.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| module nonblocking #(parameter WIDTH=256, SELW=2) | ||||
|    (input 	           clk , | ||||
|     input [9:0] 	   ctrl , | ||||
|     input [15:0] 	   din , | ||||
|     input [SELW-1:0] 	   sel , | ||||
|     output reg [WIDTH-1:0] dout); | ||||
| 
 | ||||
|    localparam SLICE = WIDTH/(SELW**2); | ||||
|    always @(posedge clk) begin | ||||
|       dout <= dout + 1; | ||||
|       dout[ctrl*sel+:SLICE] <= din ; | ||||
|    end | ||||
|     | ||||
| endmodule | ||||
							
								
								
									
										13
									
								
								tests/arch/common/dynamic_part_select/original.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/arch/common/dynamic_part_select/original.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| module original #(parameter WIDTH=256, SELW=2) | ||||
|    (input 	        clk , | ||||
|     input [9:0] 	   ctrl , | ||||
|     input [15:0] 	   din , | ||||
|     input [SELW-1:0] 	   sel , | ||||
|     output reg [WIDTH-1:0] dout); | ||||
|     | ||||
|    localparam SLICE = WIDTH/(SELW**2); | ||||
|    always @(posedge clk) | ||||
|      begin | ||||
| 	dout[ctrl*sel+:SLICE] <= din ; | ||||
|      end | ||||
| endmodule | ||||
							
								
								
									
										24
									
								
								tests/arch/common/dynamic_part_select/reset_test.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								tests/arch/common/dynamic_part_select/reset_test.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| module reset_test #(parameter WIDTH=256, SELW=2) | ||||
|    (input                  clk , | ||||
|     input [9:0] 	   ctrl , | ||||
|     input [15:0] 	   din , | ||||
|     input [SELW-1:0] 	   sel , | ||||
|     input wire 		   reset, | ||||
|     output reg [WIDTH-1:0] dout); | ||||
|     | ||||
|    reg [5:0] 		   i; | ||||
|    wire [SELW-1:0] 	   rval = {reset, {SELW-1{1'b0}}}; | ||||
|    localparam SLICE = WIDTH/(SELW**2); | ||||
|    // Doing exotic reset. masking 2 LSB bits to 0, 6 MSB bits to 1 for | ||||
|    // whatever reason. | ||||
|    always @(posedge clk) begin | ||||
|       if (reset) begin: reset_mask | ||||
|          for (i = 0; i < 16; i=i+1) begin | ||||
|             dout[i*rval+:SLICE] <= 32'hDEAD; | ||||
|          end | ||||
|       end | ||||
|       //else begin | ||||
|       dout[ctrl*sel+:SLICE] <= din; | ||||
|       //end | ||||
|    end | ||||
| endmodule | ||||
							
								
								
									
										13
									
								
								tests/arch/common/dynamic_part_select/reversed.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/arch/common/dynamic_part_select/reversed.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| module reversed #(parameter WIDTH=256, SELW=2) | ||||
|    (input                  clk , | ||||
|     input [9:0] 	   ctrl , | ||||
|     input [15:0] 	   din , | ||||
|     input [SELW-1:0] 	   sel , | ||||
|     output reg [WIDTH-1:0] dout); | ||||
|     | ||||
|    localparam SLICE = WIDTH/(SELW**2); | ||||
|    always @(posedge clk) begin | ||||
|       dout[(1024-ctrl*sel)-:SLICE] <= din; | ||||
|    end | ||||
| endmodule | ||||
| 
 | ||||
							
								
								
									
										59
									
								
								tests/arch/xilinx/dynamic_part_select.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								tests/arch/xilinx/dynamic_part_select.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | |||
| #### Original testcase ### | ||||
| read_verilog ../common/dynamic_part_select/original.v | ||||
| hierarchy -top original | ||||
| prep -flatten -top original | ||||
| design -save gold | ||||
|   | ||||
| equiv_opt -run :prove -map +/xilinx/cells_sim.v synth_xilinx -noiopad | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| sat -verify -prove-asserts -show-public -seq 10 -prove-skip 1 miter | ||||
|   | ||||
| ### Multiple blocking assingments ### | ||||
| read_verilog ../common/dynamic_part_select/multiple_blocking.v | ||||
| hierarchy -top multiple_blocking | ||||
| prep -flatten -top multiple_blocking | ||||
| design -save gold | ||||
|   | ||||
| equiv_opt -run :prove -map +/xilinx/cells_sim.v synth_xilinx -noiopad | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| sat -verify -prove-asserts -show-public -seq 10 -prove-skip 1 miter | ||||
|   | ||||
| ### Non-blocking to the same output register ### | ||||
| read_verilog ../common/dynamic_part_select/nonblocking.v | ||||
| hierarchy -top nonblocking | ||||
| prep -flatten -top nonblocking | ||||
| design -save gold | ||||
|   | ||||
| equiv_opt -run :prove -map +/xilinx/cells_sim.v synth_xilinx -noiopad | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| sat -verify -prove-asserts -show-public -seq 10 -prove-skip 1 miter | ||||
| 
 | ||||
| ### For-loop select, one dynamic input | ||||
| read_verilog ../common/dynamic_part_select/forloop_select.v | ||||
| hierarchy -top forloop_select | ||||
| prep -flatten -top forloop_select | ||||
| design -save gold | ||||
|   | ||||
| equiv_opt -run :prove -map +/xilinx/cells_sim.v synth_xilinx -noiopad | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| sat -verify -prove-asserts -show-public -seq 5 -prove-skip 1 miter | ||||
| 
 | ||||
| ### Double loop (part-select, reset) ###  | ||||
| read_verilog ../common/dynamic_part_select/reset_test.v | ||||
| hierarchy -top reset_test | ||||
| prep -flatten -top reset_test | ||||
| design -save gold | ||||
|   | ||||
| equiv_opt -run :prove -map +/xilinx/cells_sim.v synth_xilinx -noiopad | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| sat -verify -prove-asserts -show-public -seq 10 -prove-skip 1 miter | ||||
| 
 | ||||
| ### Reversed part-select case ### | ||||
| read_verilog ../common/dynamic_part_select/reversed.v | ||||
| hierarchy -top reversed | ||||
| prep -flatten -top reversed | ||||
| design -save gold | ||||
|   | ||||
| equiv_opt -run :prove -map +/xilinx/cells_sim.v synth_xilinx -noiopad | ||||
| miter -equiv -make_assert -flatten gold gate miter | ||||
| sat -verify -prove-asserts -show-public -seq 20 -prove-skip 1 miter | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue