minitests: Add OSERDES minitest

Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/minitests/serdes/oserdes/Makefile b/minitests/serdes/oserdes/Makefile
new file mode 100644
index 0000000..baa7935
--- /dev/null
+++ b/minitests/serdes/oserdes/Makefile
@@ -0,0 +1 @@
+include ../../util/common.mk
diff --git a/minitests/serdes/oserdes/top.v b/minitests/serdes/oserdes/top.v
new file mode 100644
index 0000000..df93aa6
--- /dev/null
+++ b/minitests/serdes/oserdes/top.v
@@ -0,0 +1,81 @@
+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_shr <= {dout_shr, din_shr[DIN_N-1]};
+        if (stb) begin
+            din <= din_shr;
+        end
+    end
+
+    assign do = dout[DOUT_N-1];
+
+    roi roi (
+        .clk(clk),
+        .din(din),
+        .dout(dout)
+    );
+endmodule
+
+module roi(input clk, input [159:0] din, output [159:0] dout);
+	my_OSERDES
+	#(
+		.LOC("BITSLICE_RX_TX_X0Y305"),
+		.DATA_WIDTH(8),
+        .INIT(1'b0),
+		.IS_CLKDIV_INVERTED(1'b0),
+		.IS_CLK_INVERTED(1'b0),
+		.IS_RST_INVERTED(1'b0),
+		.SIM_DEVICE("ULTRASCALE_PLUS")
+	)
+	inst_0 (
+		.clk(clk),
+		.din(din[  0 +: 4]),
+		.dout(dout[ 0 +: 2])
+	);
+endmodule
+
+// ---------------------------------------------------------------------
+module my_OSERDES (input clk, input [3:0] din, output [1:0] dout);
+
+   parameter LOC = "";
+   parameter DATA_WIDTH = 1;
+   parameter INIT = 1'b0;
+   parameter IS_CLKDIV_INVERTED = 1'b0;
+   parameter IS_CLK_INVERTED = 1'b0;
+   parameter IS_RST_INVERTED = 1'b0;
+   parameter SIM_DEVICE = "ULTRASCALE_PLUS";
+
+   (* LOC=LOC *)
+   OSERDESE3 #(
+      .DATA_WIDTH(DATA_WIDTH),                // Parallel data width (4,8)
+      .INIT(INIT),                            // Initialization value of the OSERDES flip-flops
+      .IS_CLKDIV_INVERTED(IS_CLKDIV_INVERTED),// Optional inversion for CLKDIV
+      .IS_CLK_INVERTED(IS_CLK_INVERTED),      // Optional inversion for CLK
+      .IS_RST_INVERTED(IS_RST_INVERTED),      // Optional inversion for RST
+      .SIM_DEVICE(SIM_DEVICE)                 // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
+                                              // ULTRASCALE_PLUS_ES2)
+   )
+   OSERDESE3_inst (
+      .OQ(oq),         // 1-bit output: Serial Output Data
+      .T_OUT(t),      // 1-bit output: 3-state control output to IOB
+      .CLK(clk),            // 1-bit input: High-speed clock
+      .CLKDIV(din[0]),      // 1-bit input: Divided Clock
+      .D(din[1]),           // 8-bit input: Parallel Data Input
+      .RST(din[2]),         // 1-bit input: Asynchronous Reset
+      .T(din[3])            // 1-bit input: Tristate input from fabric
+   );
+   OBUFT OBUFT_inst (
+      .O(dout[0]), // 1-bit output: Buffer output (connect directly to top-level port)
+      .I(oq), // 1-bit input: Buffer input
+      .T(t)  // 1-bit input: 3-state enable input
+   );
+endmodule