As I understood the timing analyser treats level-sensitive latches similar to registers. When looking into the documentation the only option that you can execute to have a correct timing analysis of the latches is all the way at the end of synthesis while reporting the timing results. For this you can use the following command:
But in my opinion this does not solve the problem. It only provides a way to report better timing.
When you have a path from a positive register to a positive (open-high), level-sensitive latch in your design, it has a default setup clock relationship of zero clock periods, plus any time borrow value. As I understand it the "dynamic borrow" option is not used during timing optimisations while doing the place and route. This means that the result is a netlist where the tool tried to fix a setup violation that does not needed fixing and by this ignoring the other real issues in the design (hold time violations for example)
It it possible to use the "-dynamic_borrow" timing analysis option during place and route timing optimisations?
Or at least use a correct timing analysis of a latch instead of the current simplification?
You may take a look at:
https://www.intel.com/content/www/us/en/programmable/documentation/psq1513989797346.html -> 18.104.22.168. Time Borrowing with Latches
The way to solve it is by: set_max_time_borrow 3 [get_registers lat*]
I haven't tried this yet but when reading the documentation I did not think this would do anything.
It states that "the time borrowing never exceeds the maximum borrow value. However, you can specify a smaller maximum borrow time with the set_max_time_borrow SDC constraint."
And before this it is said that "the Timing Analyzer automatically computes the maximum amount of time borrowing available for each latch. Typically, the maximum amount of time borrowing available is roughly equivalent to half the clock period."
So this means that by default around half the clock period is taken as borrow time and it could be further constraint with the SDC command.
It does not state that this setting will enable correct borrow time calculation during place and route timing optimisations as is clearly said in the beginning of this section: "Implementation of latch time borrowing requires that you enable Dynamic borrowing mode (update_timing_netlist -dynamic_borrow). Otherwise, the Timing Analyzer calculates zero time borrowing for latches
So when reading this paragraph I interpret it as ignoring all borrow time unless you use update_timing_netlist -dynamic_borrow (also the set_max_time_borrow SDC command would then have no effect because the maximum borrow time is zero)
We do not receive any response from you in the email. Please post a response in the next 15 days to allow me to continue to support you. After 15 days, this thread will be transitioned to community support. The community users will be able to help you with your follow-up questions.
Here is a simple example.
I created a circuit where data goes from a negedge flipflop, to a negative (open-low), level-sensitive latch, to a posedge flipflop.
In the timing analyser you can see that the setup time from the negedge flipflop to the negative (open-low), level-sensitive latch is as good as nothing. I expect that the setup time should be a bit less than half the clock period. Even with the "-dynamic_borrow" option I don't see anything change which I found strange.
Can you explain this?
This could have a lot of impact on the rest of the timing when the tool tries to fix this with clock skewing