• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Functional Verification
  3. Elaboration Error ICDPAV on xcelium

Stats

  • Locked Locked
  • Replies 5
  • Subscribers 65
  • Views 22730
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Elaboration Error ICDPAV on xcelium

BrcmHarish
BrcmHarish over 6 years ago

Hi,

I am facing this elaboration error message when using xcelium:

xmelab: *E,ICDPAV  (......) Illegal combination of driver and procedural assignment to variable dmp_oob_aout detected (output clockvar found in clocking block .....)

assign  signal_1  = signal_2;

In clocking block "signal_1" is declared as logic.  In the above assignment, "signal_2" is declared as wire.  I was not seeing this error msg when I used "ncsim". This started coming as soon as I moved to xcelium.  Any thoughts on this ?

Regards,

Harish

  • Cancel
Parents
  • StephenH
    StephenH over 6 years ago

    Hi Harish.

    Incisive (ncsim) didn't have adequate checks for multiple drivers, that's why the error didn't occur for you in ncsim. Extra checking was added into Xcelium to catch these scenarios.

    Note that your description is slightly misleading, because you cannot declare signal types (logic) inside a clocking block, you can only declare directionality and delays in a clocking block. If you paste a more accurate example it would be possible to explain to you exactly why you got the error in your code. If you can't share the example, login to support.cadence.com and search on ICDPAV to see more detailed explanations of the problems this check is trying to catch.

    Finally, there is a switch, to be used only once you have fully checked that your code is "safe", -warn_multiple_drivers. This switch downgrades ICDPAV to a warning so that compilation can continue. Please don't use it without checking your code first though; the error was added for good reason and it's likely that your code has a problem.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • BrcmHarish
    BrcmHarish over 6 years ago in reply to StephenH

    Hi Stephen,

    Thanks for responding to my post. Good to know the xcelium has got more checks built-in now. 

    Regarding the code in clocking block, you are right I didn't convey the message correctly.  You can see the correct logic as mentioned below:

    interface xyz (input logic clock);

        logic    signal_1;

        ......

        clocking master_cb @(posedge clock);

            output    signal_1;

            .....

        endclocking: master_cb

        clocking slave_cb @(posedge clock);

            input    signal_1;

            .....

        endclocking: slave_cb

        clocking  monitor_cb @(posedge clock);

             input   signal_1;

             .....

         endclocking: monitor_cb

         modport   slave_mp  ( input   signal_1 ...... );

         modport   master_mp (output   signal_1 ......);

    endinterface: xyz

    Few observations:

    1. I dont see any multiple drivers on this signal.  Else my simulations using ncsim / ncelab would have shown some issues.

    2. By changing the declaration from "logic" to "wire" I could see elab going through fine on xcelium. 

    I will also go through the documentation as you suggested.

    Thank You, 

    Harish

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • StephenH
    StephenH over 6 years ago in reply to BrcmHarish

    Hi Harish.

    Sorry, I may have confused you by mentioning "multiple drivers" without a full explanation. The ICDPAV check is explicitly looking for cases where a variable has a mix of procedural assignments (initial or always blocks) and continuous assignments. IEEE1800-2012 clause 14.16.2 explains the behaviour, including why your "fix" of changing from a variable (logic) to a net (wire) is working.

    Basically, if the clocking block output drives a variable, then you can only make procedural assignments to the variable, no continuous assignment is permitted (e.g. connecting the variable to a module's output port). By changing your signal to a net (wire) you change the clocking block to use a continuous assignment from an implicit temporary variable, meaning that normal rules for signal strength resolution come into force and the multiple driver situation is resolved. Note that the elaborator is doing a static check to implement the rule, so the simple presence of a continuous assignment on the variable is enough to violate the LRM, even if the value driven would not cause contention.

    LRM rule from 14.16.2: "It shall be illegal to write to a variable with a continuous assignment, a procedural continuous assignment, or a primitive when that variable is associated with an output clockvar."

    Regards,
    Steve

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Suryansh Singh
    Suryansh Singh over 6 years ago in reply to StephenH

    Hello Stephen,

    I am facing exactly the same issue. I Came here looking for the solution and tried to specify -warn_multiple_drivers as an argument with xrun. But I get a message 

    "ERROR: Unknown command line argument"

    I checked the xrun documents but did not find the argument. Could you please help here?

    I did not open a new thread as the issue is exactly the same.

    Regards,

    Suryansh 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • StephenH
    StephenH over 6 years ago in reply to Suryansh Singh

    Hi Suryansh.

    In fact that was a typo in my original post, there is no 's' on the end of the switch, it should be: -warn_multiple_driver

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • StephenH
    StephenH over 6 years ago in reply to Suryansh Singh

    Hi Suryansh.

    In fact that was a typo in my original post, there is no 's' on the end of the switch, it should be: -warn_multiple_driver

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information