Adding EzLogic challenge of 0ctf on. Will add sim guide later.
This commit is contained in:
		
							parent
							
								
									d2610bfbe1
								
							
						
					
					
						commit
						9e22bdef3b
					
				
							
								
								
									
										1404
									
								
								0ctf/EzLogic/EzLogic.vvp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1404
									
								
								0ctf/EzLogic/EzLogic.vvp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1519
									
								
								0ctf/EzLogic/EzLogic_tb.vcd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1519
									
								
								0ctf/EzLogic/EzLogic_tb.vcd
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22
									
								
								0ctf/EzLogic/behavioral models/BUFG.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								0ctf/EzLogic/behavioral models/BUFG.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // BUFG primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /*verilator coverage_off*/ | ||||||
|  | module BUFG | ||||||
|  | ( | ||||||
|  |     input  I, | ||||||
|  |     output O /* verilator clocker */ | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  |     assign O = I; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /*verilator coverage_on*/ | ||||||
							
								
								
									
										38
									
								
								0ctf/EzLogic/behavioral models/CARRY4.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								0ctf/EzLogic/behavioral models/CARRY4.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // CARRY4 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module CARRY4 | ||||||
|  | ( | ||||||
|  |     // Carry cascade input | ||||||
|  |     input  wire       CI, | ||||||
|  |     //  | ||||||
|  |     input  wire       CYINIT, | ||||||
|  |     // Carry MUX data input | ||||||
|  |     input  wire [3:0] DI, | ||||||
|  |     // Carry MUX select line | ||||||
|  |     input  wire [3:0] S, | ||||||
|  |     // Carry out of each stage of the chain | ||||||
|  |     output wire [3:0] CO, | ||||||
|  |     // Carry chain XOR general data out | ||||||
|  |     output wire [3:0] O | ||||||
|  | ); | ||||||
|  |     wire _w_CO0 = S[0] ? CI | CYINIT : DI[0]; | ||||||
|  |     wire _w_CO1 = S[1] ?      _w_CO0 : DI[1]; | ||||||
|  |     wire _w_CO2 = S[2] ?      _w_CO1 : DI[2]; | ||||||
|  |     wire _w_CO3 = S[3] ?      _w_CO2 : DI[3]; | ||||||
|  | 
 | ||||||
|  |     assign CO   = { _w_CO3, _w_CO2, _w_CO1, _w_CO0 }; | ||||||
|  | 
 | ||||||
|  |     assign O    =  S ^ { _w_CO2, _w_CO1, _w_CO0, CI | CYINIT }; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										69
									
								
								0ctf/EzLogic/behavioral models/FDCE.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								0ctf/EzLogic/behavioral models/FDCE.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // FDCE primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module FDCE | ||||||
|  | #( | ||||||
|  |     parameter [0:0] IS_C_INVERTED   = 1'b0, | ||||||
|  |     parameter [0:0] IS_D_INVERTED   = 1'b0, | ||||||
|  |     parameter [0:0] IS_CLR_INVERTED = 1'b0, | ||||||
|  |     parameter [0:0] INIT            = 1'b0 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     // Clock | ||||||
|  |     input  wire C, | ||||||
|  |     // Clock enable | ||||||
|  |     input  wire CE, | ||||||
|  |     // Asynchronous clear | ||||||
|  |     input  wire CLR, | ||||||
|  |     // Data in | ||||||
|  |     input  wire D, | ||||||
|  |     // Data out | ||||||
|  |     output wire Q | ||||||
|  | ); | ||||||
|  |     reg    _r_Q; | ||||||
|  |      | ||||||
|  |     wire   _w_CLR = CLR ^ IS_CLR_INVERTED; | ||||||
|  |     wire   _w_D   = D   ^ IS_D_INVERTED; | ||||||
|  |      | ||||||
|  |     initial begin : INIT_STATE | ||||||
|  |         _r_Q = INIT[0]; | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     generate | ||||||
|  |         if (IS_C_INVERTED) begin : GEN_CLK_NEG | ||||||
|  |             always @(negedge C or posedge _w_CLR) begin | ||||||
|  |              | ||||||
|  |                 if (_w_CLR) begin | ||||||
|  |                     _r_Q <= 1'b0; | ||||||
|  |                 end | ||||||
|  |                 else if (CE) begin | ||||||
|  |                     _r_Q <= _w_D; | ||||||
|  |                 end | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |         else begin : GEN_CLK_POS | ||||||
|  |             always @(posedge C or posedge _w_CLR) begin | ||||||
|  |              | ||||||
|  |                 if (_w_CLR) begin | ||||||
|  |                     _r_Q <= 1'b0; | ||||||
|  |                 end | ||||||
|  |                 else if (CE) begin | ||||||
|  |                     _r_Q <= _w_D; | ||||||
|  |                 end | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     endgenerate | ||||||
|  |      | ||||||
|  |     assign Q = _r_Q; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										21
									
								
								0ctf/EzLogic/behavioral models/GND.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								0ctf/EzLogic/behavioral models/GND.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // GND primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module GND | ||||||
|  | ( | ||||||
|  |     output wire G | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  |     assign G = 1'b0; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										6
									
								
								0ctf/EzLogic/behavioral models/IBUF.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								0ctf/EzLogic/behavioral models/IBUF.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | module IBUF( | ||||||
|  |     input wire I, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     assign O = I; | ||||||
|  | endmodule | ||||||
							
								
								
									
										24
									
								
								0ctf/EzLogic/behavioral models/LUT1.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								0ctf/EzLogic/behavioral models/LUT1.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // LUT1 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module LUT1 | ||||||
|  | #( | ||||||
|  |     parameter [1:0] INIT = 2'b00 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     input  wire I0, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     assign O = INIT[I0]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT2.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT2.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // LUT2 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module LUT2 | ||||||
|  | #( | ||||||
|  |     parameter [3:0] INIT = 4'b0000 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [1:0] _w_idx = { I1, I0 }; | ||||||
|  | 
 | ||||||
|  |     assign O = INIT[_w_idx]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT3.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT3.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // LUT3 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module LUT3 | ||||||
|  | #( | ||||||
|  |     parameter [7:0] INIT = 8'b00000000 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, I2, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [2:0] _w_idx = { I2, I1, I0 }; | ||||||
|  | 
 | ||||||
|  |     assign O = INIT[_w_idx]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT4.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT4.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // LUT4 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module LUT4 | ||||||
|  | #( | ||||||
|  |     parameter [15:0] INIT = 16'h0000 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, I2, I3, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [3:0] _w_idx = { I3, I2, I1, I0 }; | ||||||
|  |      | ||||||
|  |     assign O = INIT[_w_idx]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT5.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT5.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // LUT5 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module LUT5 | ||||||
|  | #( | ||||||
|  |     parameter [31:0] INIT = 32'h00000000 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, I2, I3, I4, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [4:0] _w_idx = { I4, I3, I2, I1, I0 }; | ||||||
|  |      | ||||||
|  |     assign O = INIT[_w_idx]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT6.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0ctf/EzLogic/behavioral models/LUT6.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // LUT6 primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module LUT6 | ||||||
|  | #( | ||||||
|  |     parameter [63:0] INIT = 64'h0000000000000000 | ||||||
|  | ) | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, I2, I3, I4, I5, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [5:0] _w_idx = { I5, I4, I3, I2, I1, I0 }; | ||||||
|  |      | ||||||
|  |     assign O = INIT[_w_idx]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										17
									
								
								0ctf/EzLogic/behavioral models/MUXF7.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								0ctf/EzLogic/behavioral models/MUXF7.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module MUXF7 | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, S, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [1:0] w_data = { I1, I0 }; | ||||||
|  | 
 | ||||||
|  |     assign O = w_data[S]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										17
									
								
								0ctf/EzLogic/behavioral models/MUXF8.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								0ctf/EzLogic/behavioral models/MUXF8.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module MUXF8 | ||||||
|  | ( | ||||||
|  |     input  wire I0, I1, S, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     wire [1:0] w_data = { I1, I0 }; | ||||||
|  | 
 | ||||||
|  |     assign O = w_data[S]; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										6
									
								
								0ctf/EzLogic/behavioral models/OBUF.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								0ctf/EzLogic/behavioral models/OBUF.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | module OBUF( | ||||||
|  |     input wire I, | ||||||
|  |     output wire O | ||||||
|  | ); | ||||||
|  |     assign O = I; | ||||||
|  | endmodule | ||||||
							
								
								
									
										21
									
								
								0ctf/EzLogic/behavioral models/VCC.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								0ctf/EzLogic/behavioral models/VCC.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | `ifdef verilator3 | ||||||
|  | `else | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | `endif | ||||||
|  | // | ||||||
|  | // VCC primitive for Xilinx FPGAs | ||||||
|  | // Compatible with Verilator tool (www.veripool.org) | ||||||
|  | // Copyright (c) 2019-2022 Frédéric REQUIN | ||||||
|  | // License : BSD | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | /* verilator coverage_off */ | ||||||
|  | module VCC | ||||||
|  | ( | ||||||
|  |     output wire P | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  |     assign P = 1'b1; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | /* verilator coverage_on */ | ||||||
							
								
								
									
										
											BIN
										
									
								
								0ctf/EzLogic/problem/.EzLogic_tb.v.swp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								0ctf/EzLogic/problem/.EzLogic_tb.v.swp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										91
									
								
								0ctf/EzLogic/problem/EzLogic_tb.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								0ctf/EzLogic/problem/EzLogic_tb.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | |||||||
|  | `timescale 1us / 100ns | ||||||
|  | 
 | ||||||
|  | module EzLogic_tb #( | ||||||
|  |     parameter FLAG_TO_TEST = "o0", | ||||||
|  |     parameter N = 42 | ||||||
|  | )(); | ||||||
|  |     reg clk; | ||||||
|  |     reg rst_n; | ||||||
|  |     reg valid_in; | ||||||
|  |     reg start; | ||||||
|  |     reg [7:0] data_in; | ||||||
|  |     reg [6:0] counter; | ||||||
|  |     reg [6:0] counter2; | ||||||
|  |     wire [7:0] data_out; | ||||||
|  |     wire valid_out; | ||||||
|  |     reg [0:8*N-1] data_out_all; | ||||||
|  |     wire success; | ||||||
|  | 
 | ||||||
|  |     wire [7:0] flag_test_arr [0:N-1]; | ||||||
|  |     genvar i; | ||||||
|  |     generate | ||||||
|  |         for (i=0;i<N;i=i+1) begin | ||||||
|  |             assign flag_test_arr[N-1-i] = FLAG_TO_TEST[(i*8)+:8]; | ||||||
|  |         end | ||||||
|  |     endgenerate | ||||||
|  | 
 | ||||||
|  |     EzLogic_top inst( | ||||||
|  |         .clk(clk), | ||||||
|  |         .rst_n(rst_n), | ||||||
|  |         .data_in(data_in), | ||||||
|  |         .valid_in(valid_in), | ||||||
|  |         .data_out(data_out), | ||||||
|  |         .valid_out(valid_out) | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     initial begin | ||||||
|  |         $dumpfile("EzLogic_tb.vcd"); | ||||||
|  |         $dumpvars(0, EzLogic_tb); | ||||||
|  |         clk = 0; | ||||||
|  |         rst_n = 0; | ||||||
|  |         data_in = 0; | ||||||
|  |         valid_in = 0; | ||||||
|  |         counter = 0; | ||||||
|  |         counter2 = 0; | ||||||
|  |         start = 0; | ||||||
|  |         data_out_all = 0; | ||||||
|  |         #4 | ||||||
|  |         rst_n = 1; | ||||||
|  |         start = 1; | ||||||
|  |         @(negedge start); | ||||||
|  |         #4 | ||||||
|  |         if (success) begin | ||||||
|  |             $display("Great! You've found the correct flag!"); | ||||||
|  |         end | ||||||
|  |         else begin | ||||||
|  |             $display("Binary Data: %b", data_out_all); | ||||||
|  |             $display("Binary Data: %b", data_std); | ||||||
|  |             $display("Hexadecimal Data: %h", data_out_all); | ||||||
|  |             $display("Haha, try again!"); | ||||||
|  |         end | ||||||
|  |         #20 | ||||||
|  |         $finish(); | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     always @(posedge clk) begin | ||||||
|  |         if (start == 1) begin | ||||||
|  |             if (counter < N) begin | ||||||
|  |                 counter <= counter + 1; | ||||||
|  |                 data_in <= flag_test_arr[counter]; | ||||||
|  |                 valid_in <= 1; | ||||||
|  |             end | ||||||
|  |             else begin | ||||||
|  |                 data_in <= 0; | ||||||
|  |                 valid_in <= 0; | ||||||
|  |                 start <= 0; | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     always @(posedge clk) begin | ||||||
|  |         if (valid_out) begin | ||||||
|  |             counter2 <= counter2 + 1; | ||||||
|  |             data_out_all[(counter2)*8 +: 8] <= data_out; | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     wire [0:8*N-1] data_std = 'h30789d5692f2fe23bb2c5d9e16406653b6cb217c952998ce17b7143788d949952680b4bce4c30a96c753; | ||||||
|  |     assign success = (data_std == data_out_all); | ||||||
|  | 
 | ||||||
|  |     always #1 clk = ~clk; | ||||||
|  | endmodule | ||||||
							
								
								
									
										270
									
								
								0ctf/EzLogic/problem/EzLogic_top_synth.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								0ctf/EzLogic/problem/EzLogic_top_synth.v
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,270 @@ | |||||||
|  | // Copyright 1986-2020 Xilinx, Inc. All Rights Reserved. | ||||||
|  | // -------------------------------------------------------------------------------- | ||||||
|  | // Tool Version: Vivado v.2020.2 (win64) Build 3064766 Wed Nov 18 09:12:45 MST 2020 | ||||||
|  | // Date        : Sat Aug 31 17:14:12 2024 | ||||||
|  | // Host        : DESKTOP-9V3OCBF running 64-bit major release  (build 9200) | ||||||
|  | // Command     : write_verilog -force EzLogic_top_synth.v | ||||||
|  | // Design      : EzLogic_top | ||||||
|  | // Purpose     : This is a Verilog netlist of the current design or from a specific cell of the design. The output is an | ||||||
|  | //               IEEE 1364-2001 compliant Verilog HDL file that contains netlist information obtained from the input | ||||||
|  | //               design files. | ||||||
|  | // Device      : xc7z010iclg225-1L | ||||||
|  | // -------------------------------------------------------------------------------- | ||||||
|  | `timescale 1 ps / 1 ps | ||||||
|  | 
 | ||||||
|  | (* STRUCTURAL_NETLIST = "yes" *) | ||||||
|  | module EzLogic_top | ||||||
|  |    (clk, | ||||||
|  |     rst_n, | ||||||
|  |     data_in, | ||||||
|  |     valid_in, | ||||||
|  |     data_out, | ||||||
|  |     valid_out); | ||||||
|  |   input clk; | ||||||
|  |   input rst_n; | ||||||
|  |   input [7:0]data_in; | ||||||
|  |   input valid_in; | ||||||
|  |   output [7:0]data_out; | ||||||
|  |   output valid_out; | ||||||
|  | 
 | ||||||
|  |   wire \<const0> ; | ||||||
|  |   wire \<const1> ; | ||||||
|  |   wire clk; | ||||||
|  |   wire clk_IBUF; | ||||||
|  |   wire clk_IBUF_BUFG; | ||||||
|  |   wire [7:0]data_in; | ||||||
|  |   wire [7:0]data_in_IBUF; | ||||||
|  |   wire [7:0]data_out; | ||||||
|  |   wire [7:0]data_out_OBUF; | ||||||
|  |   wire \data_reg[3]_i_2_n_0 ; | ||||||
|  |   wire \data_reg[3]_i_3_n_0 ; | ||||||
|  |   wire \data_reg[3]_i_4_n_0 ; | ||||||
|  |   wire \data_reg[3]_i_5_n_0 ; | ||||||
|  |   wire \data_reg[7]_i_2_n_0 ; | ||||||
|  |   wire \data_reg[7]_i_3_n_0 ; | ||||||
|  |   wire \data_reg[7]_i_4_n_0 ; | ||||||
|  |   wire \data_reg[7]_i_5_n_0 ; | ||||||
|  |   wire \data_reg[7]_i_6_n_0 ; | ||||||
|  |   wire \data_reg_reg[3]_i_1_n_0 ; | ||||||
|  |   wire \data_reg_reg[3]_i_1_n_1 ; | ||||||
|  |   wire \data_reg_reg[3]_i_1_n_2 ; | ||||||
|  |   wire \data_reg_reg[3]_i_1_n_3 ; | ||||||
|  |   wire \data_reg_reg[7]_i_1_n_1 ; | ||||||
|  |   wire \data_reg_reg[7]_i_1_n_2 ; | ||||||
|  |   wire \data_reg_reg[7]_i_1_n_3 ; | ||||||
|  |   wire [7:0]p_0_in; | ||||||
|  |   wire rst_n; | ||||||
|  |   wire rst_n_IBUF; | ||||||
|  |   wire valid_in; | ||||||
|  |   wire valid_in_IBUF; | ||||||
|  |   wire valid_out; | ||||||
|  |   wire valid_out_OBUF; | ||||||
|  | 
 | ||||||
|  |   GND GND | ||||||
|  |        (.G(\<const0> )); | ||||||
|  |   VCC VCC | ||||||
|  |        (.P(\<const1> )); | ||||||
|  |   BUFG clk_IBUF_BUFG_inst | ||||||
|  |        (.I(clk_IBUF), | ||||||
|  |         .O(clk_IBUF_BUFG)); | ||||||
|  |   IBUF clk_IBUF_inst | ||||||
|  |        (.I(clk), | ||||||
|  |         .O(clk_IBUF)); | ||||||
|  |   IBUF \data_in_IBUF[0]_inst  | ||||||
|  |        (.I(data_in[0]), | ||||||
|  |         .O(data_in_IBUF[0])); | ||||||
|  |   IBUF \data_in_IBUF[1]_inst  | ||||||
|  |        (.I(data_in[1]), | ||||||
|  |         .O(data_in_IBUF[1])); | ||||||
|  |   IBUF \data_in_IBUF[2]_inst  | ||||||
|  |        (.I(data_in[2]), | ||||||
|  |         .O(data_in_IBUF[2])); | ||||||
|  |   IBUF \data_in_IBUF[3]_inst  | ||||||
|  |        (.I(data_in[3]), | ||||||
|  |         .O(data_in_IBUF[3])); | ||||||
|  |   IBUF \data_in_IBUF[4]_inst  | ||||||
|  |        (.I(data_in[4]), | ||||||
|  |         .O(data_in_IBUF[4])); | ||||||
|  |   IBUF \data_in_IBUF[5]_inst  | ||||||
|  |        (.I(data_in[5]), | ||||||
|  |         .O(data_in_IBUF[5])); | ||||||
|  |   IBUF \data_in_IBUF[6]_inst  | ||||||
|  |        (.I(data_in[6]), | ||||||
|  |         .O(data_in_IBUF[6])); | ||||||
|  |   IBUF \data_in_IBUF[7]_inst  | ||||||
|  |        (.I(data_in[7]), | ||||||
|  |         .O(data_in_IBUF[7])); | ||||||
|  |   OBUF \data_out_OBUF[0]_inst  | ||||||
|  |        (.I(data_out_OBUF[0]), | ||||||
|  |         .O(data_out[0])); | ||||||
|  |   OBUF \data_out_OBUF[1]_inst  | ||||||
|  |        (.I(data_out_OBUF[1]), | ||||||
|  |         .O(data_out[1])); | ||||||
|  |   OBUF \data_out_OBUF[2]_inst  | ||||||
|  |        (.I(data_out_OBUF[2]), | ||||||
|  |         .O(data_out[2])); | ||||||
|  |   OBUF \data_out_OBUF[3]_inst  | ||||||
|  |        (.I(data_out_OBUF[3]), | ||||||
|  |         .O(data_out[3])); | ||||||
|  |   OBUF \data_out_OBUF[4]_inst  | ||||||
|  |        (.I(data_out_OBUF[4]), | ||||||
|  |         .O(data_out[4]));  OBUF \data_out_OBUF[5]_inst  | ||||||
|  |        (.I(data_out_OBUF[5]), | ||||||
|  |         .O(data_out[5])); | ||||||
|  |   OBUF \data_out_OBUF[6]_inst  | ||||||
|  |        (.I(data_out_OBUF[6]), | ||||||
|  |         .O(data_out[6])); | ||||||
|  |   OBUF \data_out_OBUF[7]_inst  | ||||||
|  |        (.I(data_out_OBUF[7]), | ||||||
|  |         .O(data_out[7])); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[3]_i_2  | ||||||
|  |        (.I0(data_out_OBUF[5]), | ||||||
|  |         .I1(data_in_IBUF[3]), | ||||||
|  |         .O(\data_reg[3]_i_2_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[3]_i_3  | ||||||
|  |        (.I0(data_out_OBUF[6]), | ||||||
|  |         .I1(data_in_IBUF[2]), | ||||||
|  |         .O(\data_reg[3]_i_3_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[3]_i_4  | ||||||
|  |        (.I0(data_out_OBUF[2]), | ||||||
|  |         .I1(data_in_IBUF[1]), | ||||||
|  |         .O(\data_reg[3]_i_4_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[3]_i_5  | ||||||
|  |        (.I0(data_out_OBUF[4]), | ||||||
|  |         .I1(data_in_IBUF[0]), | ||||||
|  |         .O(\data_reg[3]_i_5_n_0 )); | ||||||
|  |   LUT1 #( | ||||||
|  |     .INIT(2'h1))  | ||||||
|  |     \data_reg[7]_i_2  | ||||||
|  |        (.I0(rst_n_IBUF), | ||||||
|  |         .O(\data_reg[7]_i_2_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[7]_i_3  | ||||||
|  |        (.I0(data_out_OBUF[7]), | ||||||
|  |         .I1(data_in_IBUF[7]), | ||||||
|  |         .O(\data_reg[7]_i_3_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[7]_i_4  | ||||||
|  |        (.I0(data_out_OBUF[0]), | ||||||
|  |         .I1(data_in_IBUF[6]), | ||||||
|  |         .O(\data_reg[7]_i_4_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[7]_i_5  | ||||||
|  |        (.I0(data_out_OBUF[3]), | ||||||
|  |         .I1(data_in_IBUF[5]), | ||||||
|  |         .O(\data_reg[7]_i_5_n_0 )); | ||||||
|  |   LUT2 #( | ||||||
|  |     .INIT(4'h6))  | ||||||
|  |     \data_reg[7]_i_6  | ||||||
|  |        (.I0(data_out_OBUF[1]), | ||||||
|  |         .I1(data_in_IBUF[4]), | ||||||
|  |         .O(\data_reg[7]_i_6_n_0 )); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[0]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[0]), | ||||||
|  |         .Q(data_out_OBUF[0])); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[1]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[1]), | ||||||
|  |         .Q(data_out_OBUF[1])); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[2]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[2]), | ||||||
|  |         .Q(data_out_OBUF[2])); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[3]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[3]), | ||||||
|  |         .Q(data_out_OBUF[3])); | ||||||
|  |   (* ADDER_THRESHOLD = "35" *)  | ||||||
|  |   CARRY4 \data_reg_reg[3]_i_1  | ||||||
|  |        (.CI(\<const0> ), | ||||||
|  |         .CO({\data_reg_reg[3]_i_1_n_0 ,\data_reg_reg[3]_i_1_n_1 ,\data_reg_reg[3]_i_1_n_2 ,\data_reg_reg[3]_i_1_n_3 }), | ||||||
|  |         .CYINIT(\<const0> ), | ||||||
|  |         .DI({data_out_OBUF[5],data_out_OBUF[6],data_out_OBUF[2],data_out_OBUF[4]}), | ||||||
|  |         .O(p_0_in[3:0]), | ||||||
|  |         .S({\data_reg[3]_i_2_n_0 ,\data_reg[3]_i_3_n_0 ,\data_reg[3]_i_4_n_0 ,\data_reg[3]_i_5_n_0 })); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[4]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[4]), | ||||||
|  |         .Q(data_out_OBUF[4])); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[5]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[5]), | ||||||
|  |         .Q(data_out_OBUF[5])); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[6]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[6]), | ||||||
|  |         .Q(data_out_OBUF[6])); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     \data_reg_reg[7]  | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(valid_in_IBUF), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(p_0_in[7]), | ||||||
|  |         .Q(data_out_OBUF[7])); | ||||||
|  |   (* ADDER_THRESHOLD = "35" *)  | ||||||
|  |   CARRY4 \data_reg_reg[7]_i_1  | ||||||
|  |        (.CI(\data_reg_reg[3]_i_1_n_0 ), | ||||||
|  |         .CO({\data_reg_reg[7]_i_1_n_1 ,\data_reg_reg[7]_i_1_n_2 ,\data_reg_reg[7]_i_1_n_3 }), | ||||||
|  |         .CYINIT(\<const0> ), | ||||||
|  |         .DI({\<const0> ,data_out_OBUF[0],data_out_OBUF[3],data_out_OBUF[1]}), | ||||||
|  |         .O(p_0_in[7:4]), | ||||||
|  |         .S({\data_reg[7]_i_3_n_0 ,\data_reg[7]_i_4_n_0 ,\data_reg[7]_i_5_n_0 ,\data_reg[7]_i_6_n_0 })); | ||||||
|  |   IBUF rst_n_IBUF_inst | ||||||
|  |        (.I(rst_n), | ||||||
|  |         .O(rst_n_IBUF)); | ||||||
|  |   IBUF valid_in_IBUF_inst | ||||||
|  |        (.I(valid_in), | ||||||
|  |         .O(valid_in_IBUF)); | ||||||
|  |   OBUF valid_out_OBUF_inst | ||||||
|  |        (.I(valid_out_OBUF), | ||||||
|  |         .O(valid_out)); | ||||||
|  |   FDCE #( | ||||||
|  |     .INIT(1'b0))  | ||||||
|  |     valid_out_reg | ||||||
|  |        (.C(clk_IBUF_BUFG), | ||||||
|  |         .CE(\<const1> ), | ||||||
|  |         .CLR(\data_reg[7]_i_2_n_0 ), | ||||||
|  |         .D(valid_in_IBUF), | ||||||
|  |         .Q(valid_out_OBUF)); | ||||||
|  | endmodule | ||||||
							
								
								
									
										50
									
								
								0ctf/EzLogic/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								0ctf/EzLogic/readme.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | # EzLogic | ||||||
|  | ## Problem | ||||||
|  | Our task is to reverse engineer a flag checker implemented on an **FPGA**.The hardware system is constructed from a **netlist** synthesized by Xilinx Vivado, where the netlist serves a role similar to assembly language in the software domain, representing a lower-level, more hardware-specific description. The netlist is described using **Verilog**, enabling convenient simulation of the system. | ||||||
|  | 
 | ||||||
|  | ## Knowledge | ||||||
|  | If you find yourself new to Verilog or digital integrated circuit design, that's completely fine. We're here to help with a recommended Verilog syntax tutorial and an official manual covering all the foundational components used in the netlist.  | ||||||
|  | 
 | ||||||
|  | - Verilog Syntax: https://www.chipverify.com/tutorials/verilog | ||||||
|  | - FPGA Design Elements: https://docs.amd.com/r/en-US/ug953-vivado-7series-libraries/Design-Elements | ||||||
|  | 
 | ||||||
|  | ## Simulation | ||||||
|  | For system simulation, you can choose one of the following tools:  | ||||||
|  | - [Xilinx Vivado](https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools.html) (free version is enough) | ||||||
|  | - [Icarus Verilog](https://github.com/steveicarus/iverilog) and [gtkwave](http://gtkwave.sourceforge.net/) (open-source software) | ||||||
|  | 
 | ||||||
|  | ### Using Vivado | ||||||
|  | 1. Install Vivado HL WebPACK version (must select Zynq 7000 series boards support) | ||||||
|  | 2. Create a project (just click "next" to the end, nothing is needed to configure) | ||||||
|  | 3. In "sources" window, add the Verilog files (*.v) to **simulation sources** | ||||||
|  | 4. Run simulation (run until stops) | ||||||
|  | 5. Watch the value of signal `success` or check the output message in "Tcl Console" | ||||||
|  | 
 | ||||||
|  | ### Using Icarus Verilog | ||||||
|  | 1. Installing iverilog and gtkwave | ||||||
|  | ``` | ||||||
|  | sudo apt-get install iverilog gtkwave | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 2. Compilation | ||||||
|  | Note: Zynq 7000 FPGA primitives (FDCE, LUT, ...) are not supported by iverilog, so behavioral models for these components are provided for simulation purposes. | ||||||
|  | ``` | ||||||
|  | iverilog -s EzLogic_tb -o EzLogic.vvp ./problem/EzLogic_top_synth.v ./problem/EzLogic_tb.v  ./behavioral\ models/*.v | ||||||
|  | ``` | ||||||
|  | If successful, you can see `EzLogic.vvp` file in the folder. | ||||||
|  | 
 | ||||||
|  | 3. Running the Simulation | ||||||
|  | ``` | ||||||
|  | vvp EzLogic.vvp | ||||||
|  | ``` | ||||||
|  | The results of the check are printed on the terminal. | ||||||
|  | 
 | ||||||
|  | 4. Viewing in Graph Form | ||||||
|  | If you want to check internal signals, just use gtkwave. | ||||||
|  | ``` | ||||||
|  | gtkwave EzLogic.vcd | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Hints | ||||||
|  | - A schematic printout is included in `schematic` folder, which can greatly assist you in understanding the data pathways and program logic. (Only for EzLogic) | ||||||
|  | - Variable names are auto-generated by Vivado Synthesizer and don't necessarily mean anything; don't be confused by the names. | ||||||
							
								
								
									
										6257
									
								
								0ctf/EzLogic/schematic/schematic.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6257
									
								
								0ctf/EzLogic/schematic/schematic.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user