minitests: Add IODELAY minitests

Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/minitests/delay/Makefile b/minitests/delay/Makefile
new file mode 100644
index 0000000..1d13e21
--- /dev/null
+++ b/minitests/delay/Makefile
@@ -0,0 +1 @@
+include ../util/common.mk
diff --git a/minitests/delay/top.v b/minitests/delay/top.v
new file mode 100644
index 0000000..45e6bec
--- /dev/null
+++ b/minitests/delay/top.v
@@ -0,0 +1,168 @@
+module top(input clk, stb, di, output do);
+    localparam integer DIN_N = 160;
+    localparam integer DOUT_N = 160;
+
+    reg [DIN_N-1:0] din;
+    wire [DOUT_N-1:0] dout;
+
+    reg [DIN_N-1:0] din_shr;
+    reg [DOUT_N-1:0] dout_shr;
+
+    always @(posedge clk) begin
+        din_shr <= {din_shr, di, dout[0]};
+        dout_shr <= {dout_shr, din_shr[DIN_N-1]};
+        if (stb) begin
+            din <= din_shr;
+        end
+    end
+	assign do = dout_shr[0];
+    roi roi (
+        .clk(clk),
+        .din(din),
+        .dout(dout)
+    );
+endmodule
+
+module roi(input clk, input [159:0] din, output [159:0] dout);
+
+	IDELAYCTRL #(
+		.SIM_DEVICE("ULTRASCALE")  // Must be set to "ULTRASCALE"
+	)
+	IDELAYCTRL_inst (
+		.RDY(dout[159]), // 1-bit output: Ready output
+		.REFCLK(clk),    // 1-bit input: Reference clock input
+		.RST(din[159])   // 1-bit input: Active high reset input. Asynchronous assert, synchronous deassert to
+		                 // REFCLK.
+	);
+
+	my_IDELAY
+	#(
+		.LOC("BITSLICE_RX_TX_X0Y305"),
+        .CASCADE("NONE"),               // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
+        .DELAY_FORMAT("TIME"),          // Units of the DELAY_VALUE (COUNT, TIME)
+        .DELAY_SRC("DATAIN"),           // Delay input (DATAIN, IDATAIN)
+        .DELAY_TYPE("FIXED"),           // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
+        .DELAY_VALUE(0),                // Input delay value setting
+        .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
+        .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
+        .REFCLK_FREQUENCY(300.0),       // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
+        .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
+                                        // ULTRASCALE_PLUS_ES2)
+        .UPDATE_MODE("ASYNC")           // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
+	)
+	inst_0 (
+		.clk(clk),
+		.din(din[1:0]),
+		.dout(dout[0])
+	);
+
+	my_ODELAY
+	#(
+		.LOC("BITSLICE_RX_TX_X0Y306"),
+        .CASCADE("NONE"),               // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
+        .DELAY_FORMAT("TIME"),          // Units of the DELAY_VALUE (COUNT, TIME)
+        .DELAY_TYPE("FIXED"),           // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
+        .DELAY_VALUE(0),                // Input delay value setting
+        .IS_CLK_INVERTED(1'b0),         // Optional inversion for CLK
+        .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
+        .REFCLK_FREQUENCY(300.0),       // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
+        .SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
+                                        // ULTRASCALE_PLUS_ES2)
+        .UPDATE_MODE("ASYNC")           // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
+	)
+	inst_1 (
+		.clk(clk),
+		.din(din[  2 +: 2]),
+		.dout()
+	);
+
+endmodule
+
+// ---------------------------------------------------------------------
+module my_IDELAY (input clk, input [1:0] din, output dout);
+   parameter LOC = "";
+   parameter CASCADE = "NONE";
+   parameter DELAY_FORMAT = "TIME";
+   parameter DELAY_SRC = "DATAIN";
+   parameter DELAY_TYPE = "FIXED";
+   parameter DELAY_VALUE = 0;
+   parameter IS_CLK_INVERTED = 1'b0;
+   parameter IS_RST_INVERTED = 1'b0;
+   parameter REFCLK_FREQUENCY = 300.0;
+   parameter SIM_DEVICE = "ULTRASCALE_PLUS";
+   parameter UPDATE_MODE = "ASYNC";
+
+   (* LOC=LOC *)
+   IDELAYE3 #(
+      .CASCADE(CASCADE),                    // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
+      .DELAY_FORMAT(DELAY_FORMAT),          // Units of the DELAY_VALUE (COUNT, TIME)
+      .DELAY_SRC(DELAY_SRC),                // Delay input (DATAIN, IDATAIN)
+      .DELAY_TYPE(DELAY_TYPE),              // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
+      .DELAY_VALUE(DELAY_VALUE),            // Input delay value setting
+      .IS_CLK_INVERTED(IS_CLK_INVERTED),    // Optional inversion for CLK
+      .IS_RST_INVERTED(IS_RST_INVERTED),    // Optional inversion for RST
+      .REFCLK_FREQUENCY(REFCLK_FREQUENCY),  // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
+      .SIM_DEVICE(SIM_DEVICE),              // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
+                                            // ULTRASCALE_PLUS_ES2)
+      .UPDATE_MODE(UPDATE_MODE)             // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
+   )
+   IDELAYE3_inst (
+      .CASC_OUT(),       // 1-bit output: Cascade delay output to ODELAY input cascade
+      .CNTVALUEOUT(),    // 9-bit output: Counter value output
+      .DATAOUT(dout),    // 1-bit output: Delayed data output
+      .CASC_IN(),        // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
+      .CASC_RETURN(),    // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
+      .CE(1'b0),         // 1-bit input: Active high enable increment/decrement input
+      .CLK(clk),         // 1-bit input: Clock input
+      .CNTVALUEIN(),     // 9-bit input: Counter value input
+      .DATAIN(din[0]),   // 1-bit input: Data input from the logic
+      .EN_VTC(1'b1),     // 1-bit input: Keep delay constant over VT
+      .IDATAIN(),        // 1-bit input: Data input from the IOBUF
+      .INC(1'b0),        // 1-bit input: Increment / Decrement tap delay input
+      .LOAD(1'b0),       // 1-bit input: Load DELAY_VALUE input
+      .RST(din[1])       // 1-bit input: Asynchronous Reset to the DELAY_VALUE
+   );
+endmodule
+
+module my_ODELAY (input clk, input [1:0] din, output dout);
+   parameter LOC = "";
+   parameter CASCADE = "NONE";
+   parameter DELAY_FORMAT = "TIME";
+   parameter DELAY_TYPE = "FIXED";
+   parameter DELAY_VALUE = 0;
+   parameter IS_CLK_INVERTED = 1'b0;
+   parameter IS_RST_INVERTED = 1'b0;
+   parameter REFCLK_FREQUENCY = 300.0;
+   parameter SIM_DEVICE = "ULTRASCALE_PLUS";
+   parameter UPDATE_MODE = "ASYNC";
+
+   (* KEEP, DONT_TOUCH, LOC=LOC *)
+   ODELAYE3 #(
+      .CASCADE(CASCADE),                    // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
+      .DELAY_FORMAT(DELAY_FORMAT),          // Units of the DELAY_VALUE (COUNT, TIME)
+      .DELAY_TYPE(DELAY_TYPE),              // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
+      .DELAY_VALUE(DELAY_VALUE),            // Input delay value setting
+      .IS_CLK_INVERTED(IS_CLK_INVERTED),    // Optional inversion for CLK
+      .IS_RST_INVERTED(IS_RST_INVERTED),    // Optional inversion for RST
+      .REFCLK_FREQUENCY(REFCLK_FREQUENCY),  // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
+      .SIM_DEVICE(SIM_DEVICE),              // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
+                                            // ULTRASCALE_PLUS_ES2)
+      .UPDATE_MODE(UPDATE_MODE)             // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
+   )
+   ODELAYE3_inst (
+      .CASC_OUT(),       // 1-bit output: Cascade delay output to ODELAY input cascade
+      .CNTVALUEOUT(),    // 9-bit output: Counter value output
+      .DATAOUT(dout),    // 1-bit output: Delayed data output
+      .CASC_IN(),        // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
+      .CASC_RETURN(),    // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
+      .CE(1'b0),         // 1-bit input: Active high enable increment/decrement input
+      .CLK(clk),         // 1-bit input: Clock input
+      .CNTVALUEIN(),     // 9-bit input: Counter value input
+      .EN_VTC(1'b1),     // 1-bit input: Keep delay constant over VT
+      .INC(1'b0),        // 1-bit input: Increment / Decrement tap delay input
+      .LOAD(1'b0),       // 1-bit input: Load DELAY_VALUE input
+	   .ODATAIN(din[0]),  // 1-bit input: Data input
+      .RST(din[1])       // 1-bit input: Asynchronous Reset to the DELAY_VALUE
+   );
+endmodule
+