Forum Discussion

Robert_H_Intel's avatar
Robert_H_Intel
Icon for New Contributor rankNew Contributor
4 years ago

IO_OBUF polarity not matching RTL

I am working on a design using an Agilex F-series part (AGFB014R24B2E3V) and am having issues with tri-stated outputs. The RTL in question is:

assign TRIG[0] = (lb_enable_dd) ? clk_fast : 1'bz;

When I test my board, I found it to be inverted. If I set lb_enable_dd high, it was hi-z, low gave me clk_fast on my TRIG[0] output. When I opened the Technology Map View (post-fit) I noticed the IO_OBUF primitive had a inverter on the OE input that didn't seem to be compensated for in compile.

Things I have tried:

- Tested both 21.2 and 21.3 versions of the tools.

- Switching to a non-tristating output. This works as expected, no polarity issues.

assign TRIG[0] = (lb_enable_dd) ? clk_fast : 1'b0;

- Tried generating the buffer using the GPIO Intel FPGA IP core from the library.

trig_out trig_out (
.din ({lb_rxclk_det[0], clk_fast, lb_enable_dd, clk_fast}),
.oe ({4{lb_enable_dd}}),
.pad_out (TRIG[3:0])
);

Same inverter present on the IO_OBUF. Even when I open the datasheet for that IP core it says OE should be active high.

Thoughts?

24 Replies

  • nkolme's avatar
    nkolme
    Icon for New Contributor rankNew Contributor

    Hi Sheng,

    Can you tell me what the progress is on this issue? The link you provided is no longer valid. As per your last email, the fix was planned for Q22.3 but I can still see incorrect behavior in 22.4.0 Pro Edition. If there is a workaround or a patch, that would be great as I am avoiding upgrading Quartus versions due to other unrelated support issues.

    Thanks,

    Nadine

    • ShengN_altera's avatar
      ShengN_altera
      Icon for Super Contributor rankSuper Contributor

      Hi,

      Sorry for delay reply,

      Engineering had confirmed that the behaviour is correct check below:

      The bubble is to indicate the inversion to compensate for the active low oe port of the obuf. So, what you see in the tech map view is actually correct.

      I see the RPI is not set for out1 to invert the core signal to OE. However, we use RBC to set the programmable invert for the OE inside fm_gpio to compensate for OE being active low. So, it should work fine.

      And we also have BCM simulation of a design similar to the sample test design and it is working fine.

      set up running BCM simulation for design tri_test.zip.

      Looking at the result, the behaviour of the OE is expected.

      The RTL is:

      assign out1 = (en1) ? clk1 : 1'bz;

      The simulation waveform is:

      You can see when en1 is low, out1 is Z regardless of clk1.

      You can also see when en1 is high, out1 follows clk1.

  • FvM's avatar
    FvM
    Icon for Super Contributor rankSuper Contributor

    Hi,

    in initial post of this thread, it's stated that Quartus is implementing wrong en signal polarity for tri-stated outputs. In following discussion, actual device behaviour is never mentioned, instead only wrong technology map is shown.

    I see now that all Quartus versions (Std and Pro), up to most recent have wrong polarity of en port in technology map viewer, as seen below for Quartus Std. 24.1

    module tri_test0 ( 
    input  logic      in1,
    input  logic	  en1,
    output logic      out1
    );
    
    assign out1  =  (en1) ? in1 : 1'bz;
    
    endmodule

    RTL Viewer

    Technology Map Viewer

    Implemented hardware is however behaving according to RTL description, the fault is only in technology map viewer.

    Inverting en1 in code flips all polarities, RTL map and hardware behaviour are still correct, technology map is wrong.

    module tri_test0 ( 
    input  logic      in1,
    input  logic	  n_en1,
    output logic      out1
    );
    
    assign out1  =  (!n_en1) ? in1 : 1'bz;
    
    endmodule​



    I have no Agilex 7 board at hand to check if it shows wrong hardware behaviour as claimed in post #1, either with previous or recent Quartus Pro versions.

    I feel that Intel should clarify if there actually has been wrong hardware behaviour of tri-state output with Agilex 7 or other devices in any Quartus version. And also if obviously wrong polarity display in technology map viewer is planned to be fixed.

    Regards
    Frank


    • ShengN_altera's avatar
      ShengN_altera
      Icon for Super Contributor rankSuper Contributor

      Hi,

      Sorry for delay reply,

      Engineering had confirmed that the behaviour is correct check below:

      The bubble is to indicate the inversion to compensate for the active low oe port of the obuf. So, what you see in the tech map view is actually correct.

      I see the RPI is not set for out1 to invert the core signal to OE. However, we use RBC to set the programmable invert for the OE inside fm_gpio to compensate for OE being active low. So, it should work fine.

      And we also have BCM simulation of a design similar to the sample test design and it is working fine.

      set up running BCM simulation for design tri_test.zip.

      Looking at the result, the behaviour of the OE is expected.

      The RTL is:

      assign out1 = (en1) ? clk1 : 1'bz;

      The simulation waveform is:

      You can see when en1 is low, out1 is Z regardless of clk1.

      You can also see when en1 is high, out1 follows clk1.

      • FvM's avatar
        FvM
        Icon for Super Contributor rankSuper Contributor

        @ShengN_Intel
        "The bubble is to indicate the inversion to compensate for the active low oe port of the obuf. So, what you see in the tech map view is actually correct."
        Active low port unfortunately isn't indicated in the symbol, otherwise it would be designated nOE, OE# or similar. I see what you mean, but technology map schematic doesn't comply with commonly understood logic symbol presentation, although it's used "since ever" in Quartus. It's prone to misunderstanding as shown by this thread.
        Best regards
        Frank