From: Eli on
Hello,

I'm running ISE 9.2.03i on a design for Spartan 3E (3s250e-4tq144).

For whoever wishes to skip the long description below, the idea is
simple: The tools should not agree to place pins with conflicting IO
standards, such as LVTTL and LVCMOS25, on the same bank. And suddenly
I caught the tools not noticing this. This clearly looks like a bug,
among others because slight tweaks with the source Verilog makes the
tools reject the conflict, as they should.

My question is if someone has had similar experience, and if there's a
way to be sure that the tools indeed detect collisions when they
occur.

And now to the long story, for those who want the details. A lot of
details, which I doubt if they're relevant. But anyhow.

Recently, I've been doing this pin placement back-and-forth with the
board designer. Since the logic isn't written yet, I've written dummy
logic for the I/O pins. So each time the board designer wants a
change, I make the change in the UCF file, run an implementation, and
see if there are complaints. If they do, I get an error like the
example at the bottom of this post (in case of an IO standard
violation), or errors about problems in clock routing. For a few
years, this has been my method to quickly approve pinouts, until this
method failed recently.

What I found out, is that the tools agreed to place LVTTL pins and
LVCMOS25 on the same bank, if they were defined as inouts (that is,
bidirectional). I verified this by looking at the pad report and with
FPGA editor. If I made both pins outputs, the tools refused, as they
should. Other irrelevant tweaks with the code (such as commenting out
irrelevant parts) also woke up the sleeping guard.

The method I use for checking is instantiating a module like at the
bottom of this message. The IOSTANDARD parameter is set at
instantiation to the desired standard. The module generates DDR flip-
flops for both input and output, so if placement and routing succeeds,
I know that the certain pin's placement is OK, and that IOB registers
with the given clock can be packed. Or so I thought.

I have, of course, other modules for input-only, output-only,
nonclocked IOs, differential IOs and such.

This looks like a bug in the tools. Unfortunately, I failed to make a
simple example which demonstrates the bug. It looks like the tools are
OK most of the time, but it's disturbing that they may fail on me even
once (and make me approve a faulty board design).

So has anyone encountered a similar problem?

Thanks in advance,
Eli

---------------------------


Example of error from placer.
============================

ERROR:Place:864 - Incompatible IOB's are locked to the same bank 3
Conflicting IO Standards are:
IO Standard 1: Name = LVCMOS25, VREF = NR, VCCO = 2.50, TERM = NONE
List of locked IOB's:
data<0>
data<1>

IO Standard 2: Name = LVTTL, VREF = NR, VCCO = 3.30, TERM = NONE
List of locked IOB's:
testpoints<1>
testpoints<3>

The test module
===============

module testiob #(parameter IOSTANDARD = "LVTTL")
(inout pin,
input clk);

wire in, out, T;
wire in_fall, in_rise;

reg in_fall_d, in_rise_d;

always @(posedge clk)
begin
in_fall_d <= in_fall;
in_rise_d <= in_rise;
end

// This is completely useless setting. It just puts the IOB in
place.
// It may drive the lines crazy if used for real

IOBUF #(.IOSTANDARD(IOSTANDARD)) iobuf
(.IO(pin), .I(out), .O(in), .T(T));

ODDR2 #(.SRTYPE("ASYNC")) out_ddr
(.Q (out),
.C0 (clk),
.C1 (!clk),
.CE (1'b1),
.R (1'b0),
.D0 (in_rise_d),
.D1 (in_fall_d),
.S (1'b0));

ODDR2 #(.SRTYPE("ASYNC")) T_ddr
(.Q (T),
.C0 (clk),
.C1 (!clk),
.CE (1'b1),
.R (1'b0),
.D0 (in_rise_d),
.D1 (in_fall_d),
.S (1'b0));

IDDR2 #(.SRTYPE("ASYNC")) in_ddr
(
.Q0 (in_rise),
.Q1 (in_fall),
.C0 (clk),
.C1 (!clk),
.CE (1'b1),
.D (in),
.R (1'b0),
.S (1'b0));

endmodule
From: d_s_klein on
On Apr 26, 1:59 pm, Eli <eli.billa...(a)gmail.com> wrote:
> Hello,
>
> I'm running ISE 9.2.03i on a design for Spartan 3E (3s250e-4tq144).
>
> For whoever wishes to skip the long description below, the idea is
> simple: The tools should not agree to place pins with conflicting IO
> standards, such as LVTTL and LVCMOS25, on the same bank. And suddenly
> I caught the tools not noticing this. This clearly looks like a bug,
> among others because slight tweaks with the source Verilog makes the
> tools reject the conflict, as they should.
>
> My question is if someone has had similar experience, and if there's a
> way to be sure that the tools indeed detect collisions when they
> occur.
>
> And now to the long story, for those who want the details. A lot of
> details, which I doubt if they're relevant. But anyhow.
>
> Recently, I've been doing this pin placement back-and-forth with the
> board designer. Since the logic isn't written yet, I've written dummy
> logic for the I/O pins. So each time the board designer wants a
> change, I make the change in the UCF file, run an implementation, and
> see if there are complaints. If they do, I get an error like the
> example at the bottom of this post (in case of an IO standard
> violation), or errors about problems in clock routing. For a few
> years, this has been my method to quickly approve pinouts, until this
> method failed recently.
>
> What I found out, is that the tools agreed to place LVTTL pins and
> LVCMOS25 on the same bank, if they were defined as inouts (that is,
> bidirectional). I verified this by looking at the pad report and with
> FPGA editor. If I made both pins outputs, the tools refused, as they
> should. Other irrelevant tweaks with the code (such as commenting out
> irrelevant parts) also woke up the sleeping guard.
>
> The method I use for checking is instantiating a module like at the
> bottom of this message. The IOSTANDARD parameter is set at
> instantiation to the desired standard. The module generates DDR flip-
> flops for both input and output, so if placement and routing succeeds,
> I know that the certain pin's placement is OK, and that IOB registers
> with the given clock can be packed. Or so I thought.
>
> I have, of course, other modules for input-only, output-only,
> nonclocked IOs, differential IOs and such.
>
> This looks like a bug in the tools. Unfortunately, I failed to make a
> simple example which demonstrates the bug. It looks like the tools are
> OK most of the time, but it's disturbing that they may fail on me even
> once (and make me approve a faulty board design).
>
> So has anyone encountered a similar problem?
>
> Thanks in advance,
>     Eli
>
> ---------------------------
>
> Example of error from placer.
> ============================
>
> ERROR:Place:864 - Incompatible IOB's are locked to the same bank 3
>    Conflicting IO Standards are:
>    IO Standard 1: Name = LVCMOS25, VREF = NR, VCCO = 2.50, TERM = NONE
>    List of locked IOB's:
>         data<0>
>         data<1>
>
>    IO Standard 2: Name = LVTTL, VREF = NR, VCCO = 3.30, TERM = NONE
>    List of locked IOB's:
>         testpoints<1>
>         testpoints<3>
>
> The test module
> ===============
>
> module testiob #(parameter IOSTANDARD = "LVTTL")
>    (inout pin,
>     input clk);
>
>    wire   in, out, T;
>    wire   in_fall, in_rise;
>
>    reg    in_fall_d, in_rise_d;
>
>    always @(posedge clk)
>      begin
>         in_fall_d <= in_fall;
>         in_rise_d <= in_rise;
>      end
>
>    // This is completely useless setting. It just puts the IOB in
> place.
>    // It may drive the lines crazy if used for real
>
>    IOBUF  #(.IOSTANDARD(IOSTANDARD)) iobuf
>      (.IO(pin), .I(out), .O(in), .T(T));
>
>    ODDR2 #(.SRTYPE("ASYNC")) out_ddr
>      (.Q (out),
>       .C0   (clk),
>       .C1   (!clk),
>       .CE (1'b1),
>       .R (1'b0),
>       .D0 (in_rise_d),
>       .D1 (in_fall_d),
>       .S (1'b0));
>
>    ODDR2 #(.SRTYPE("ASYNC")) T_ddr
>      (.Q (T),
>       .C0   (clk),
>       .C1   (!clk),
>       .CE (1'b1),
>       .R (1'b0),
>       .D0 (in_rise_d),
>       .D1 (in_fall_d),
>       .S (1'b0));
>
>    IDDR2 #(.SRTYPE("ASYNC")) in_ddr
>      (
>       .Q0   (in_rise),
>       .Q1   (in_fall),
>       .C0   (clk),
>       .C1   (!clk),
>       .CE   (1'b1),
>       .D    (in),
>       .R    (1'b0),
>       .S (1'b0));
>
> endmodule

Similar problem, yes. It is possible to specify an invalid IOTYPE
when instantiating an IOBUF. Not a single step in the chain detects
it - it goes all the way -through- bitgen without a single warning.

"Version 12 will fix it" (And it will pick winning lotto numbers
too!)

RK
From: Eli on
On Apr 26, 11:14 pm, d_s_klein <d_s_kl...(a)yahoo.com> wrote:

> Similar problem, yes.  It is possible to specify an invalid IOTYPE
> when instantiating an IOBUF.  Not a single step in the chain detects
> it - it goes all the way -through- bitgen without a single warning.
>

At least it sounds like this issue is consistent. What I encountered
is more like voodoo.
From: colin on
On 30 Apr, 10:04, Eli <eli.billa...(a)gmail.com> wrote:
> On Apr 26, 11:14 pm, d_s_klein <d_s_kl...(a)yahoo.com> wrote:
>
> > Similar problem, yes.  It is possible to specify an invalid IOTYPE
> > when instantiating an IOBUF.  Not a single step in the chain detects
> > it - it goes all the way -through- bitgen without a single warning.
>
> At least it sounds like this issue is consistent. What I encountered
> is more like voodoo.

I've just discovered that "DCI CASCADE" can be applied in the wrong
order for a VIRTEX5 I'm working with. The whole problem is that XILINX
does its regression testing on its software using DESIGNS THAT ARE
CORRECT. Whereas the vast majority of compilations that users do are
on designs that are wrong.

Colin
..
From: Patrick Maupin on
On Apr 26, 3:59 pm, Eli <eli.billa...(a)gmail.com> wrote:
> Hello,
>
> I'm running ISE 9.2.03i on a design for Spartan 3E (3s250e-4tq144).
>
> For whoever wishes to skip the long description below, the idea is
> simple: The tools should not agree to place pins with conflicting IO
> standards, such as LVTTL and LVCMOS25, on the same bank. And suddenly
> I caught the tools not noticing this. This clearly looks like a bug,
> among others because slight tweaks with the source Verilog makes the
> tools reject the conflict, as they should.
>
> My question is if someone has had similar experience, and if there's a
> way to be sure that the tools indeed detect collisions when they
> occur.
>
> And now to the long story, for those who want the details. A lot of
> details, which I doubt if they're relevant. But anyhow.
>
> Recently, I've been doing this pin placement back-and-forth with the
> board designer. Since the logic isn't written yet, I've written dummy
> logic for the I/O pins. So each time the board designer wants a
> change, I make the change in the UCF file, run an implementation, and
> see if there are complaints. If they do, I get an error like the
> example at the bottom of this post (in case of an IO standard
> violation), or errors about problems in clock routing. For a few
> years, this has been my method to quickly approve pinouts, until this
> method failed recently.
>
> What I found out, is that the tools agreed to place LVTTL pins and
> LVCMOS25 on the same bank, if they were defined as inouts (that is,
> bidirectional). I verified this by looking at the pad report and with
> FPGA editor. If I made both pins outputs, the tools refused, as they
> should. Other irrelevant tweaks with the code (such as commenting out
> irrelevant parts) also woke up the sleeping guard.
>
> The method I use for checking is instantiating a module like at the
> bottom of this message. The IOSTANDARD parameter is set at
> instantiation to the desired standard. The module generates DDR flip-
> flops for both input and output, so if placement and routing succeeds,
> I know that the certain pin's placement is OK, and that IOB registers
> with the given clock can be packed. Or so I thought.
>
> I have, of course, other modules for input-only, output-only,
> nonclocked IOs, differential IOs and such.
>
> This looks like a bug in the tools. Unfortunately, I failed to make a
> simple example which demonstrates the bug. It looks like the tools are
> OK most of the time, but it's disturbing that they may fail on me even
> once (and make me approve a faulty board design).
>
> So has anyone encountered a similar problem?
>
> Thanks in advance,
>     Eli
>
> ---------------------------
>
> Example of error from placer.
> ============================
>
> ERROR:Place:864 - Incompatible IOB's are locked to the same bank 3
>    Conflicting IO Standards are:
>    IO Standard 1: Name = LVCMOS25, VREF = NR, VCCO = 2.50, TERM = NONE
>    List of locked IOB's:
>         data<0>
>         data<1>
>
>    IO Standard 2: Name = LVTTL, VREF = NR, VCCO = 3.30, TERM = NONE
>    List of locked IOB's:
>         testpoints<1>
>         testpoints<3>
>
> The test module
> ===============
>
> module testiob #(parameter IOSTANDARD = "LVTTL")
>    (inout pin,
>     input clk);
>
>    wire   in, out, T;
>    wire   in_fall, in_rise;
>
>    reg    in_fall_d, in_rise_d;
>
>    always @(posedge clk)
>      begin
>         in_fall_d <= in_fall;
>         in_rise_d <= in_rise;
>      end
>
>    // This is completely useless setting. It just puts the IOB in
> place.
>    // It may drive the lines crazy if used for real
>
>    IOBUF  #(.IOSTANDARD(IOSTANDARD)) iobuf
>      (.IO(pin), .I(out), .O(in), .T(T));
>
>    ODDR2 #(.SRTYPE("ASYNC")) out_ddr
>      (.Q (out),
>       .C0   (clk),
>       .C1   (!clk),
>       .CE (1'b1),
>       .R (1'b0),
>       .D0 (in_rise_d),
>       .D1 (in_fall_d),
>       .S (1'b0));
>
>    ODDR2 #(.SRTYPE("ASYNC")) T_ddr
>      (.Q (T),
>       .C0   (clk),
>       .C1   (!clk),
>       .CE (1'b1),
>       .R (1'b0),
>       .D0 (in_rise_d),
>       .D1 (in_fall_d),
>       .S (1'b0));
>
>    IDDR2 #(.SRTYPE("ASYNC")) in_ddr
>      (
>       .Q0   (in_rise),
>       .Q1   (in_fall),
>       .C0   (clk),
>       .C1   (!clk),
>       .CE   (1'b1),
>       .D    (in),
>       .R    (1'b0),
>       .S (1'b0));
>
> endmodule

Xilinx pin configuration has been brain-dead forever. It is slightly
better now, but not enough that it could be classified as "good."

I haven't manually generated UCF files in over a decade. Back then,
the Xilinx tools would do *exactly* the wrong thing (from my
perspective): if your top-level design had a net that wasn't in the
UCF, the tools would blithely assign the net to some random pin on the
package (bad), and if your UCF had a pin that wasn't in your top-level
design (perhaps because you were defensively coding your UCF in
advance of your design because of the other issue), the tools would
abort and complain about not having the pin in the design.

The tools are a bit better now, giving you some options on these
things, but I still don't trust them.

ALSO, with the different I/O standards, you have to realize that you
are inviting issues if you don't carefully control the UCF to match
the board design.

The only right answer is a script that reads in the top level HDL, the
schematic netlist, and the Xilinx package file, and spits out a UCF
file. (Because I'm paranoid, I put "PROHIBIT" on all pins on the part
that aren't in the netlist; then if the design is built with changes
without rerunning the UCF script, it will barf.)

Regards,
Pat