Forum Discussion

UserID4331231's avatar
UserID4331231
Icon for Occasional Contributor rankOccasional Contributor
14 days ago

IOPLL related clock constraints

Hello Every one 

I am struggling with creating clock constraint and need help.

I have agilix 10 FPGA design at project level top module I have input "iopll_clk_clk". this input is mapped to clock capable input pin on FPGA and is connected to 50MHz on board clock source. The toplevel module has iopll instantiation as following 

pcie_ed_iopll_0 iopll_0 (

.refclk  (iopll_clk_clk),            //   input,  width = 1,  refclk.clk

.locked  (),                         //  output,  width = 1,  locked.export

.rst     (resetip_ninit_done_reset), //   input,  width = 1,   reset.reset

.outclk0 (iopll_0_outclk0_clk)       //  output,  width = 1, outclk0.clk

);
"iopll_0_outclk0_clk" is supposed to be used as clock input for inner logic only.

in Platform designer IOPLL is IP is configured to output only one clock at 300MHz.

 in the project SDC file I have following constraints 

#iopll Clock
create_clock -period 20 [get_ports iopll_clk_clk]

#derive_pll_clocks -create_base_clocks - Tried it but not supported for Agilex 10

create_generated_clock  -multiply_by 6 -source  [get_ports iopll_clk_clk] -name  iopll_0_outclk0 [get_pins iopll_0|iopll_0_outclk0] - this is line 17

Here while compiling the design during fitter stage i see following warning messages.

Warning(332174): Ignored filter at intel_rtile_pcie_ed.sdc.terp(17): iopll_0|iopll_0_outclk0 could not be matched with a pin 
Warning(332049): Ignored create_generated_clock at intel_rtile_pcie_ed.sdc.terp(17): Argument <targets> with value [get_pins {iopll_0|iopll_0_outclk0}] contains zero elements 

This tells me that the IOPLL clocks are not constrained properly and Quartus wont be able to evaluate clock paths correctly for internally generated 300MHz clock. 


can you help me in figuring out what am i doing wrong here? How can I correctly constraint that iopll is fed with 50MHz clock and its output is 300MHz clock?

14 Replies

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

    Agilex 10 is not a current device family (I presume you mean Agilex 3, 5, 7, or 9), but assuming you are using some Agilex device, simply remove derive_pll_clocks and remove that create_generated_clock constraint.  The tool automatically derives PLL output clocks for these devices so no need to add the constraints.  You can even remove create_clock because the IP has you specify the reference clock anyway.

    And you said the PLL output pin was iopll_0_outclk0_clk, not iopll_0_outclk0, so that's probably why you're getting the warning.

  • UserID4331231's avatar
    UserID4331231
    Icon for Occasional Contributor rankOccasional Contributor

    Sorry, it is Agilex 7 i series FPGA.  

    Yes i did configure IOPLL ip block parameters in platform designer. it is parameterized to have 50MHz input clock and one output clock at 300MHz. I will remove both lines (as above in original post) from sdc file and re-run compilation. At the end of SOF generation sometime, quatus pops up Timing analyzer Summary window and I see  summary of violations. How do I get to details per path violations details? 

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

      I'm not sure if you are talking about in the Quartus Compilation Report or in the Timing Analyzer, but you would need to open the Timing Analyzer and generate detailed slack/path reports for failing paths.  Start by creating summary reports (setup, hold, recovery, removal) and then right-click failing clock domain and generated detailed reports from there.

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

    For Agilex 7 iopll not need manual sdc. The pll will derive clock using auto generated sdc. Below are the statement:

    https://www.intel.com/content/www/us/en/docs/programmable/683243/23-3/derive-pll-clocks-derive-pll-clocks.html Note: Only Intel® Arria® 10 and Intel® Cyclone® 10 GX devices support the Derive PLL Clocks (derive_pll_clocks) constraint. For all other supported devices, the Timing Analyzer automatically derives PLL clocks from constraints bound to the related IP.

  • UserID4331231's avatar
    UserID4331231
    Icon for Occasional Contributor rankOccasional Contributor

    Yes, I still need help.

    I have removed timing constraints related to IOPLL, I have completed generate programming files step.

    in Messages tab I don't see any message indicating any timing violations. I see Green Correct symbols without warning triangle next to Plan , Place , Route, Retime and fitter (Finalize) steps. Does this means the design has no timing violations at all? 

    I opened Tasks> Timing analyzer.

    The setup summary violations numbers I am seeing has not changed even after I change compilation parameters from balanced to best performance.  I am really questioning, is this the correct and latest set up summary report? and if it is,  how come setup violations remained exactly same despite choosing "best performance" compilation options Vs "balanced" option in previous compilation run? 

    In  Timing analyzer console I see 

    • warning message  - Timing requirements not met
    • info message - Automatically attempting to load the "Design Closure Summary" from the compliation timing reports. To change this behavior, see Timer Analyzer Settings.
    • info message - Not able to find relevant "Design Closure Summary" in compilation timing reports. Either the report was not generated for this snapshot or a timing change has occured since compilation.

    Once compilation was over I have not changes any timing constraints or any project related files; I have simply clicked on Timing analyzer to review timing reports.

    I am bit puzzled about the last info message, what does the message mean? does this mean that latest run has no violations and its showing me old timing summary results?

    if it is correctly showing timing violations from latest run, how come setup violations remained exactly same despite choosing "best performance" compilation options Vs "balanced" option in previous compilation run?

     

     

     

     

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

      "in Messages tab I don't see any message indicating any timing violations. I see Green Correct symbols without warning triangle next to Plan , Place , Route, Retime and fitter (Finalize) steps. Does this means the design has no timing violations at all? "

      No that just means those stages of the compiler completed successfully.

      Show your complete .sdc file and screenshots of what you are seeing in the Timing Analyzer with details about the paths failing timing.  Also run the unconstrained paths report to verify that your design is fully constrained for timing.  Nothing is completely valid unless the design is fully constrained.

  • UserID4331231's avatar
    UserID4331231
    Icon for Occasional Contributor rankOccasional Contributor

    I am attaching  setup report here.

    I see most of the violation paths are from RAM block - to AVMM interconnect internal buffer.  I need help removing these violations. The "custom_mem_bridge_2port_0"  is dual ported memory ip wrapped into some logic which adds fanout as it provides copy of AVMM signals from mentoring purpose only,  there is no combination logic here. just additional fanouts to S1 and S2 ports goint into DFF inputs and DFF output are used to get copy of AVMM activities for monitoring purpose.

     

     

     

  • UserID4331231's avatar
    UserID4331231
    Icon for Occasional Contributor rankOccasional Contributor
    module "custom_mem_bridge_2port_0" definition includes instantiation for dual ported memory as following.
     
     
     altera_syncram  altera_syncram_component (
        .address_a    (address),
                    .address_b    (address2),
                    .byteena_a    (byteenable),
                    .byteena_b    (byteenable2),
                    .clock0    (clk),
                    .clocken0    (ram_clocken0),
                    .data_a    (writedata),
    .data_b    (writedata2),
    .q_a    (q_a),
                    .q_b    (q_b),
                    .rden_a    (read),
                    .rden_b    (read2),
                    .wren_a    (wren_a),
                    .wren_b    (wren_b),
                    .aclr0    (1'b0),
                    .aclr1    (1'b0),
    .address2_a    (1'b1),
                    .address2_b    (1'b1),
                    .addressstall_a    (1'b0),
                    .addressstall_b    (1'b0),
                    .clock1    (1'b1),
                    .clocken1    (1'b1),
                    .clocken2    (1'b1),
                    .clocken3    (1'b1),
    .eccencbypass    (1'b0),
                    .eccencparity    (8'b0),
                    .eccstatus    (),
                    .sclr    (1'b0)
                    );
    defparam
    altera_syncram_component.intended_device_family  = "Agilex 7",
            altera_syncram_component.lpm_type  = "altera_syncram",
            altera_syncram_component.operation_mode  = "BIDIR_DUAL_PORT",
            altera_syncram_component.ram_block_type  = "AUTO",
            altera_syncram_component.byte_size  = 8,
            altera_syncram_component.numwords_a  = 1024,
            altera_syncram_component.numwords_b  = 1024,
    altera_syncram_component.width_a  = 64,
            altera_syncram_component.width_b  = 64,
    altera_syncram_component.widthad_a  = 10,
            altera_syncram_component.widthad_b  = 10,
            altera_syncram_component.width_byteena_a  = 8,
            altera_syncram_component.width_byteena_b  = 8,
            altera_syncram_component.address_reg_b  = "CLOCK0",
            altera_syncram_component.byteena_reg_b  = "CLOCK0",
            altera_syncram_component.indata_reg_b  = "CLOCK0",
    altera_syncram_component.outdata_reg_a  = "UNREGISTERED",
            altera_syncram_component.outdata_aclr_a  = "NONE",
            altera_syncram_component.outdata_sclr_a  = "NONE",
      altera_syncram_component.outdata_reg_b  = "UNREGISTERED",
            altera_syncram_component.outdata_aclr_b  = "NONE",
            altera_syncram_component.outdata_sclr_b  = "NONE",
            altera_syncram_component.clock_enable_input_a  = "NORMAL",
            altera_syncram_component.clock_enable_output_a  = "BYPASS",
            altera_syncram_component.clock_enable_input_b  = "NORMAL",
            altera_syncram_component.clock_enable_output_b  = "BYPASS",
    altera_syncram_component.read_during_write_mode_port_a  = "NEW_DATA_NO_NBE_READ",
            altera_syncram_component.read_during_write_mode_port_b  = "NEW_DATA_NO_NBE_READ",
            altera_syncram_component.read_during_write_mode_mixed_ports  = "DONT_CARE",
            altera_syncram_component.init_file  = INIT_FILE,
            altera_syncram_component.init_file_layout  = "Port_A";
    • ShengN_altera's avatar
      ShengN_altera
      Icon for Super Contributor rankSuper Contributor

      May I know you're using port a and b? For example: altera_syncram_component.outdata_reg_b  = "UNREGISTERED" -> altera_syncram_component.outdata_reg_b  = "CLOCK0"