- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm trying to re-open this ticket - I didn't found how ,
but anyway I tried to change the default Quartus SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 (instead of 3)
and still get the same warning , any way to debug it ?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
May be you can try assignment Synchronizer Identification: Forced to make those registers synchronizer.
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
May I know any further concern or update?
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm checking it and update if it help or not - it will take 1-2 days.
Or.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Unfortunately, the issue persists. I am still encountering the CDC50001 failure on the same path. To clarify:
I added the following two global assignments and verified they are set correctly in the GUI:
set_global_assignment -name SYNCHRONIZER_IDENTIFICATION FORCED
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2
Is there any other way to ensure these settings are captured by Quartus?
or next steps for debug the issue ?
Thanks,
Or
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Or,
May be try Synchronizer Identification: Forced if asynchronous
Or set_instance_assignment (Synchronizer Identification) straight away to those registers
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Yes, your solution “Forced if asynchronous” solved the issue or at least removed many warnings. I will investigate the two that are left. However, since the entire process was trial and error, could you explain why this last attempt resolved the issue? What does it mean, and how is it different from the other configurations?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In addition to my previous message, I have investigated the two warnings. The first warning pertains to an internal transfer within the memory of the synchronous FIFO, which I can disregard. The second warning is related to an issue similar to what was resolved by the “Forced if asynchronous” solution; however, this instance remains unresolved. As shown in the attached picture, there is a synchronization of 2 bits, as discussed in the original thread, but it is not being ignored this time. Could you provide any insights into why this might be happening?
+---------------------------+---------------------------------------------------+-------------------+-------------------+-----------------------+--------+
; CDC-50001 - 1-Bit Asynchronous Transfer Not Synchronized ;
+---------------------------+---------------------------------------------------+-------------------+-------------------+-----------------------+--------+
; From ; To ; From Clock ; To Clock ; Reason ; Waived ;
+---------------------------+---------------------------------------------------+-------------------+-------------------+-----------------------+--------+
+-------------------------------------------------------------------------------------------------------------------------------------------------------
; evt_dib_ip_i|die_ready_Z ; evt_dib_ip_i|die_ready_sync_i|sync1_in_Z ; pll_clk ; rx_clk (INVERTED) ; Asynchronous transfer ; ;
+---------------------------+---------------------------------------------------+-------------------+-------------------+-----------------------+--------+
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
'Forced if Asynchronous' - the Timing Analyzer identifies synchronization register chains if the software detects an asynchronous signal transfer, even if there is combinational logic or only one register in the chain
Can you try set_instance_assignment (Synchronization Identification) directly to those remaining registers?
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I will check the “set_instance_assignment (Synchronization Identification) directly to those remaining registers” as suggested. However, it seems from your response that we might be overlooking the issue. As I mentioned, there are synchronizers in place, so the software should detect them as such, given that there is no logic between the registers. This raises a concern about a potential bug or design flaw. If the constraints you suggest are merely to clean up the report, I am not particularly concerned about that. My primary goal is to understand whether there is actual synchronization or if the tool is detecting an unsynchronized path.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Yes, we might be overlooking the issue. Probably need to look closely into that concern.
Btw, please let me know also whether set_instance_assignment can merely clean up the report?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I’ve tried multiple combinations of the set_instance_assignment command,
but nothing seems to work. Below are the commands I used in the TCL window of the Timing Analyzer tool.
After entering the commands, I clicked on Report DRC, but nothing changed.
I also tried clicking Reset Design, Update Timing Netlist, and finally Report DRC again, but still no changes.
Do I need to re-synthesize the design?
Here are the commands I tried:
set_instance_assignment -entity evt_dib_ip_i|die_ready_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED IF ASYNCHRONOUS"
set_instance_assignment -entity evt_dib_ip_i|die_ready_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED IF ASYNCHRONOee"
set_instance_assignment -entity evt_dib_ip_i|die_ready_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED"
set_instance_assignment -entity evt_dib_ip_i|die_ready_sync_i|sync1_in_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED IF ASYNCHRONOUS"
set_instance_assignment -entity evt_dib_ip_i|die_ready_sync_i|sync1_in_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED"
set_instance_assignment -to evt_dib_ip_i|die_ready_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED IF ASYNCHRONOUS"
set_instance_assignment -to evt_dib_ip_i|die_ready_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED"
set_instance_assignment -to evt_dib_ip_i|die_ready_sync_i|sync1_in_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED IF ASYNCHRONOUS"
set_instance_assignment -to evt_dib_ip_i|die_ready_sync_i|sync1_in_Z -name SYNCHRONIZER_IDENTIFICATION "FORCED"
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Could you provide .qar file for taking a look?
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
The QAR is attached. The current version I’ve uploaded includes the following constraints:
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2
set_global_assignment -name SYNCHRONIZER_IDENTIFICATION FORCED
Feel free to experiment with the other trial and error attributes you’ve suggested.
Thanks,
Or.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
After interchange the clock between die_ready_Z and sync1_in_Z, sync2_in (screenshots)
The remaining CDC-50001 warnings are cleared.
Based on CDC-50001 descriptions:
If you do not intend a violating transfer to be asynchronous, ensure that the launch clock of the transfer is correct and is related to the latch clock of the transfer
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Bottom line:
I don’t understand the suggested solution.
The places you edited are synchronizers. As a synchronizer, the intention is to put one FF on the source clock domain and two FFs on the target clock domain, as it is in the original design (see the first picture below).
In the instance die_ready_Z, the first FF is on the clock domain of pll_clk and it is only one FF. The next two FFs are on the clock which arrives from the DIB dib_rx_data_2_18_in_i_0_0 (the target clock domain).
You will see that the Q (output) of sync2_in is going to FFs which use the same clock domain (dib_rx_data_2_18_in_i_0_0). I didn’t include this in the picture as it complicates the view.
I don’t understand the solution you described (see the second picture). You switched clocks? Why? This does not sync it to the target clock domain.
Bottom line: This thread is about recognizing synchronizers. I don’t understand from your solution why Quartus didn’t recognize these standard synchronizers and why I need to adopt your solution.
Or
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Or,
The problem found is not enough synchronizer. You may increase the synchronizer by using Parameterizable Macro (ipm_cdc_1clk_sync) check this link https://www.intel.com/content/www/us/en/docs/programmable/772350/24-2/synchronizer-using-single-clock-parameterizable-23701.html
Code changes screenshot:
Tech map viewer screenshot:
Code changes screenshot:
Tech map viewer screenshot:
Then the CDC-50001 warnings are disappeared.
Based on the future version 24.3 CDC-50001 description (screenshot below), Protect single-bit asynchronous data transfers by a synchronizer chain. Use the CDC parameterizable macros: Single Clock Parameterizable Macro (ipm_cdc_1clk_sync) or Two Clocks Parameterizable Macro (ipm_cdc_2clks_sync). ...To do this, ensure that the destination of an asynchronous transfer forms a chain of two or more registers,
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I’m having trouble understanding what’s wrong with my design. Are you suggesting that Quartus might have a bug?
I’ve already included 2 stages of flip-flops, and the synchronizer macro you added introduces 3 more stages.
So, do I need to synchronize with 5 flip-flops to eliminate the warning? Or is this a bug in the current version of Quartus?
Thanks,
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Or,
I have further identify that the root cause is the asynchronous reset prevents the synchronization of the flip-flop.
Asynchronous resets are sometimes avoided in synchronizer chains, as they can interfere with the metastability mitigation synchronizers provide. An asynchronous reset applied to a synchronizer can cause the register to enter a metastable state when the reset is deasserted, potentially propagating unreliable signals through the chain. So if the registers have an asynchronous reset, the tool sometime may not recognize the chain as a synchronizer.
For a reliable synchronizer, don't use asynchronous reset like below code changes (screenshot):
Then the CDC-50001 warning disappear.
Just left this warning (screenshot below):
This is clearly not enough flip-flops for synchronizer (screenshot below):
Thanks,
Regards,
Sheng
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Or,
I sent the screenshots to you though email.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your answer looks reasonable, and I will try it with my design. I will also check the unsynchronized area you pointed out. I’ll update you in a few days.

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page