Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
11 years ago

Random single hold violations on Arria V design that doesn't push timing or util. ???

Hi - I have a design that uses about 20% of the FPGA Fabric on an ArriaVSoc. I've added my own logic to the GHRD. It doesn't push timing (my logic is 100MHz or less), or utilization (see above, even memory utilization is < 30%), but about 50% of the builds fail with a single hold violation. About 1/3 the time it's on altera_reserved_tck, and the other 2/3 it's in a random place in my portion of the design (but never in the same place twice). Messing with the seed eventually fixes it (until next time), but it takes about an hour to build, so re-building is a pain I have Placement and routing effort turned up (4.0 and max). The thing that in all cases it looks like a buffer would have fixed it. is this a bug? Is there a fix? Is there a workaround? I'm running the latest Quartus 13 on CentOS.

Thanks!

/j

17 Replies

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    would prefer not to - delay buffers != registers - it adds analog (timing) delays to fix hold vios all over the chip. The solution here was to let it implement a few of the multipliers in LUTs

    best

    /j
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Hold violations are cause by routes between registers being too long. To fix them, you make the distance between the reg's shorter. If this becomes too hard, because there are too many luts between the reg's, or the regs are inside the multiplers that cannot move, the easiest way to fix it is to add another stage in the pipeline between the multipliers to allow the fitter to shorten the distance between registers.

    LUT based multipliers will have poorer timing performance that the hard ones.
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    --- Quote Start ---

    there are no analogue buffers in FPGAs.

    --- Quote End ---

    so how does Quartus fix timing violations caused by clock skew? (sorry, I'm an ASIC guy where adding delay buffers is how you fix hold vios).

    --- Quote Start ---

    LUT based multipliers will have poorer timing performance that the hard ones..

    --- Quote End ---

    you think? :-)

    /j
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    --- Quote Start ---

    so how does Quartus fix timing violations caused by clock skew? (sorry, I'm an ASIC guy where adding delay buffers is how you fix hold vios).

    --- Quote End ---

    Basically, it will try and move the registers around, and maybe try a different routing.

    There are no buffers in FPGAs. Unlike Asics - generates clocks in FPGAs are a bad idea. they can have massive skew on them as the routing is not up to scratch. Clock enables are the much prefered/recommended method

    In the olden days, designers used to use LUTs to delay signals to account for skew or delay. AHDL even has an LCELL function that would insert an extra LUT for you at the HDL level. But as chips clocked faster, this trick became less reliable as the effects of temperature , placement and routing had a much greater effect on the delay than the LUTs themselves, so you have no reliable way to delay a signal enough.

    So, in FPGA land, the only way to fix hold violations is to make the route shorter. Easiest way to make the gap shorter is to reduce the logic between registers. Or when it comes to DSPs or RAMs, add extra pipelining. It's quite common when you get to the limits of the chip fmax, you can only have 1 or 2 luts between registers, and even then as the chip gets full, extra pipeline states are required to account for the routing delay and congestion around the chip.