Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
17252 Discussions

CDC-50001 - 1-Bit Asynchronous Transfer Not Synchronized

OrF
Employee
4,032 Views

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 ? 

https://community.intel.com/t5/Intel-Quartus-Prime-Software/CDC-50001-1-Bit-Asynchronous-Transfer-Not-Synchronized/m-p/1609971

 

Labels (1)
0 Kudos
25 Replies
ShengN_Intel
Employee
3,223 Views

Hi,


May be you can try assignment Synchronizer Identification: Forced to make those registers synchronizer.


Thanks,

Regards,

Sheng


0 Kudos
ShengN_Intel
Employee
3,182 Views

Hi,


May I know any further concern or update?


Thanks,

Regards,

Sheng


0 Kudos
OrF
Employee
3,175 Views

I'm checking it and update if it help or not  - it will take 1-2 days. 

Or.

0 Kudos
OrF
Employee
3,148 Views

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

0 Kudos
ShengN_Intel
Employee
3,142 Views

Hi Or,


May be try Synchronizer Identification: Forced if asynchronous


Or set_instance_assignment (Synchronizer Identification) straight away to those registers


Thanks,

Regards,

Sheng


0 Kudos
OrF
Employee
3,127 Views

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?

0 Kudos
OrF
Employee
3,116 Views

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 ; ;
+---------------------------+---------------------------------------------------+-------------------+-------------------+-----------------------+--------+

OrF_0-1728483858017.png

 

0 Kudos
ShengN_Intel
Employee
3,086 Views

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


0 Kudos
OrF
Employee
3,072 Views

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.

 

0 Kudos
ShengN_Intel
Employee
3,065 Views

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?


0 Kudos
OrF
Employee
3,039 Views

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"

0 Kudos
ShengN_Intel
Employee
3,010 Views

Hi,


Could you provide .qar file for taking a look?


Thanks,

Regards,

Sheng


0 Kudos
OrF
Employee
2,959 Views

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.

0 Kudos
ShengN_Intel
Employee
2,859 Views

Hi,

 

After interchange the clock between die_ready_Z and sync1_in_Z, sync2_in (screenshots)

Screenshot 2024-10-17 130614.pngScreenshot 2024-10-17 125830.png

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

 

0 Kudos
OrF
Employee
2,740 Views

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.

OrF_0-1729411761359.png

 

OrF_1-1729411794666.png

 


Or

0 Kudos
ShengN_Intel
Employee
2,616 Views

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:

ShengN_Intel_0-1729832028129.png

Tech map viewer screenshot:

ShengN_Intel_1-1729832119441.png

 

Code changes screenshot:

ShengN_Intel_2-1729832232109.png

Tech map viewer screenshot:

ShengN_Intel_3-1729832302908.png

 

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,

 

 

0 Kudos
OrF
Employee
2,568 Views

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,

0 Kudos
ShengN_Intel
Employee
2,533 Views

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


0 Kudos
ShengN_Intel
Employee
2,526 Views

Hi Or,


I sent the screenshots to you though email.


0 Kudos
OrF
Employee
2,520 Views

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.

0 Kudos
Reply