| /* |
| SLICEM at the following: |
| SLICE_XxY* |
| Where Y any value |
| x |
| Always even (ie 100, 102, 104, etc) |
| In our ROI |
| x = 6, 8, 10, 12, 14 |
| |
| SRL16E: LOC + BEL |
| SRLC32E: LOC + BEL |
| RAM64X1S: LOCs but doesn't BEL |
| */ |
| |
| module top(input clk, stb, di, output do); |
| localparam integer DIN_N = 256; |
| localparam integer DOUT_N = 256; |
| |
| 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; |
| dout_shr <= dout; |
| end |
| end |
| |
| assign do = dout_shr[DOUT_N-1]; |
| |
| roi roi ( |
| .clk(clk), |
| .din(din), |
| .dout(dout) |
| ); |
| endmodule |
| |
| module roi(input clk, input [255:0] din, output [255:0] dout); |
| //`define G1 |
| `ifdef G1 |
| //ok |
| my_NDI1MUX_NMC31 #(.LOC("SLICE_X12Y100")) |
| my_NDI1MUX_NMC31(.clk(clk), .din(din[ 0 +: 8]), .dout(dout[ 0 +: 8])); |
| /* |
| //Can't find a valid solution |
| my_NDI1MUX_NDI1 #(.LOC("SLICE_X12Y101")) |
| my_NDI1MUX_NDI1(.clk(clk), .din(din[ 8 +: 32]), .dout(dout[ 8 +: 8])); |
| */ |
| my_NDI1MUX_NI #(.LOC("SLICE_X12Y102")) |
| my_NDI1MUX_NI(.clk(clk), .din(din[ 40 +: 8]), .dout(dout[ 40 +: 8])); |
| |
| //ok |
| my_ADI1MUX_BMC31 #(.LOC("SLICE_X14Y100")) |
| my_ADI1MUX_BMC31(.clk(clk), .din(din[ 64 +: 8]), .dout(dout[ 64 +: 8])); |
| //ok |
| my_ADI1MUX_AI #(.LOC("SLICE_X14Y101")) |
| my_ADI1MUX_AI(.clk(clk), .din(din[ 72 +: 8]), .dout(dout[ 72 +: 8])); |
| /* |
| //bad |
| my_ADI1MUX_BDI1 #(.LOC("SLICE_X14Y102")) |
| my_ADI1MUX_BDI1(.clk(clk), .din(din[ 80 +: 16]), .dout(dout[ 80 +: 16])); |
| */ |
| |
| my_BDI1MUX_DI #(.LOC("SLICE_X14Y103")) |
| my_BDI1MUX_DI(.clk(clk), .din(din[ 96 +: 16]), .dout(dout[ 96 +: 16])); |
| `endif |
| |
| `define G2 |
| `ifdef G2 |
| my_NDI1MUX_NI_NMC31 #(.LOC("SLICE_X12Y100"), .C31(0), .B31(0), .A31(0)) |
| my0(.clk(clk), .din(din[ 128 +: 8]), .dout(dout[ 128 +: 8])); |
| my_NDI1MUX_NI_NMC31 #(.LOC("SLICE_X12Y101"), .C31(0), .B31(0), .A31(1)) |
| my1(.clk(clk), .din(din[ 136 +: 8]), .dout(dout[ 136 +: 8])); |
| my_NDI1MUX_NI_NMC31 #(.LOC("SLICE_X12Y102"), .C31(0), .B31(1), .A31(0)) |
| my2(.clk(clk), .din(din[ 144 +: 8]), .dout(dout[ 144 +: 8])); |
| my_NDI1MUX_NI_NMC31 #(.LOC("SLICE_X12Y103"), .C31(1), .B31(0), .A31(0)) |
| my3(.clk(clk), .din(din[ 152 +: 8]), .dout(dout[ 152 +: 8])); |
| my_NDI1MUX_NI_NMC31 #(.LOC("SLICE_X12Y104"), .C31(1), .B31(1), .A31(1)) |
| my4(.clk(clk), .din(din[ 160 +: 8]), .dout(dout[ 160 +: 8])); |
| |
| //Sets rarely seen mux position |
| my_RAM64X1D_2 #(.LOC("SLICE_X14Y100")) |
| c0(.clk(clk), .din(din[ 0 +: 8]), .dout(dout[ 0 +: 8])); |
| `endif |
| |
| endmodule |
| |
| //NI => 1 |
| module my_NDI1MUX_NI_NMC31 (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = "SLICE_X6Y100"; |
| parameter C31 = 0; |
| parameter B31 = 0; |
| parameter A31 = 0; |
| |
| wire [3:0] q31; |
| |
| wire [3:0] lutd; |
| assign lutd[3] = din[7]; |
| assign lutd[2] = C31 ? q31[3] : din[7]; |
| assign lutd[1] = B31 ? q31[2] : din[7]; |
| assign lutd[0] = A31 ? q31[1] : din[7]; |
| |
| (* LOC=LOC, BEL="D6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutd ( |
| .Q(dout[0]), |
| .Q31(q31[3]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(lutd[3])); |
| (* LOC=LOC, BEL="C6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutc ( |
| .Q(dout[1]), |
| .Q31(q31[2]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(lutd[2])); |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[2]), |
| .Q31(q31[1]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(lutd[1])); |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[3]), |
| .Q31(q31[0]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(lutd[0])); |
| endmodule |
| |
| module my_RAM64X1D_2 (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = ""; |
| |
| (* LOC=LOC, KEEP, DONT_TOUCH *) |
| RAM64X1D #( |
| .INIT(64'h0), |
| .IS_WCLK_INVERTED(1'b0) |
| ) ramb ( |
| .DPO(dout[1]), |
| .D(din[0]), |
| .WCLK(clk), |
| .WE(din[2]), |
| .A0(din[3]), |
| .A1(din[4]), |
| .A2(din[5]), |
| .A3(din[6]), |
| .A4(din[7]), |
| .A5(din[0]), |
| .DPRA0(din[1]), |
| .DPRA1(din[2]), |
| .DPRA2(din[3]), |
| .DPRA3(din[4]), |
| .DPRA4(din[5]), |
| .DPRA5(din[6])); |
| |
| (* LOC=LOC, KEEP, DONT_TOUCH *) |
| RAM64X1D #( |
| .INIT(64'h0), |
| .IS_WCLK_INVERTED(1'b0) |
| ) rama ( |
| .DPO(dout[0]), |
| .D(din[0]), |
| .WCLK(clk), |
| .WE(din[2]), |
| .A0(din[3]), |
| .A1(din[4]), |
| .A2(din[5]), |
| .A3(din[6]), |
| .A4(din[7]), |
| .A5(din[0]), |
| .DPRA0(din[1]), |
| .DPRA1(din[2]), |
| .DPRA2(din[3]), |
| .DPRA3(din[4]), |
| .DPRA4(din[5]), |
| .DPRA5(din[6])); |
| endmodule |
| |
| /**************************************************************************** |
| Tries to set all three muxes at once |
| ****************************************************************************/ |
| |
| module my_NDI1MUX_NMC31 (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = "SLICE_X6Y100"; |
| wire [3:0] q31; |
| |
| (* LOC=LOC, BEL="D6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutd ( |
| .Q(dout[0]), |
| .Q31(q31[3]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL="C6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutc ( |
| .Q(dout[1]), |
| .Q31(q31[2]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| //.D(din[7])); |
| .D(q31[3])); |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[2]), |
| .Q31(q31[1]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| //.D(din[7])); |
| .D(q31[2])); |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[3]), |
| .Q31(q31[0]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| //.D(din[7])); |
| .D(q31[1])); |
| endmodule |
| |
| /* |
| //Cannot loc instance 'roi/my_NDI1MUX_NDI1/lutc' at site SLICE_X6Y100, |
| //Bel does not match with the valid locations at which this inst can be placed |
| |
| module my_NDI1MUX_NDI1 (input clk, input [31:0] din, output [7:0] dout); |
| parameter LOC = "SLICE_X6Y100"; |
| wire [3:0] q31; |
| |
| (* LOC=LOC, BEL="D6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutd ( |
| .Q(dout[0]), |
| .Q31(q31[3]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL="C6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutc ( |
| .Q(dout[1]), |
| .Q31(q31[2]), |
| .A(din[12:8]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[15])); |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[2]), |
| .Q31(q31[1]), |
| .A(din[20:16]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| //.D(din[23])); |
| .D(q31[2])); |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[3]), |
| .Q31(q31[0]), |
| .A(din[28:24]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| //.D(din[31])); |
| .D(q31[2])); |
| endmodule |
| */ |
| |
| |
| module my_NDI1MUX_NI (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = "SLICE_X6Y100"; |
| |
| (* LOC=LOC, BEL="D6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutd ( |
| .Q(dout[0]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL="C6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutc ( |
| .Q(dout[1]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[2]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[3]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| endmodule |
| |
| /**************************************************************************** |
| Individual mux tests |
| ****************************************************************************/ |
| |
| module my_ADI1MUX_AI (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = ""; |
| |
| wire mc31c; |
| |
| /* |
| //Dummy entry to make more similar to my_ADI1MUX_BMC31 |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[1]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| */ |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lut ( |
| .Q(dout[0]), |
| .Q31(mc31c), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| endmodule |
| |
| //ok |
| module my_ADI1MUX_BMC31 (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = ""; |
| |
| wire mc31b; |
| |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[0]), |
| .Q31(mc31b), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[1]), |
| .Q31(dout[2]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(mc31b)); |
| |
| endmodule |
| |
| /* |
| Bad |
| See my_NDI1MUX_NDI1 for a more serious effort |
| */ |
| module my_ADI1MUX_BDI1 (input clk, input [15:0] din, output [15:0] dout); |
| parameter LOC = ""; |
| parameter BELO="C6LUT"; |
| parameter BELI="A6LUT"; |
| |
| wire mc31c; |
| //wire da = din[6]; |
| |
| (* LOC=LOC, BEL=BELO *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[0]), |
| .Q31(mc31c), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(din[7])); |
| (* LOC=LOC, BEL=BELI *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[1]), |
| .Q31(dout[2]), |
| .A(din[4:0]), |
| .CE(din[5]), |
| .CLK(din[6]), |
| .D(mc31c)); |
| endmodule |
| |
| module my_BDI1MUX_DI (input clk, input [7:0] din, output [7:0] dout); |
| parameter LOC = "SLICE_X6Y100"; |
| wire di = din[7]; |
| wire wemux = din[5]; |
| |
| (* LOC=LOC, BEL="D6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutd ( |
| .Q(dout[0]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(wemux), |
| .CLK(clk), |
| .D(di)); |
| (* LOC=LOC, BEL="C6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutc ( |
| .Q(dout[1]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(wemux), |
| .CLK(clk), |
| .D(din[7])); |
| (* LOC=LOC, BEL="B6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) lutb ( |
| .Q(dout[2]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(wemux), |
| .CLK(clk), |
| .D(di)); |
| (* LOC=LOC, BEL="A6LUT" *) |
| SRLC32E #( |
| .INIT(32'h00000000), |
| .IS_CLK_INVERTED(1'b0) |
| ) luta ( |
| .Q(dout[3]), |
| .Q31(), |
| .A(din[4:0]), |
| .CE(wemux), |
| .CLK(clk), |
| .D(din[7])); |
| endmodule |
| |