Forum Discussion
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
);
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?
15 Replies
- sstrell
Super 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
Occasional 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
Super 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
Super 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.
- ShengN_altera
Super Contributor
May I know do you have any further concern on the previous post IOPLL related clock constraints | Altera Community?
- UserID4331231
Occasional 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
Super 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.
- ShengN_altera
Super Contributor
Can show the timing analyzer?
- UserID4331231
Occasional 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.
- ShengN_altera
Super Contributor
May I know the RAM block is which IP?
- UserID4331231
Occasional 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));defparamaltera_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
Super Contributor
Can you try enable the outdata register?
- UserID4331231
Occasional Contributor
how do i do that ?
- ShengN_altera
Super 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"
- ShengN_altera
Super Contributor
Any further update on the previous suggestion?