layowblue
Advanced Member level 4
- Joined
- Mar 21, 2014
- Messages
- 115
- Helped
- 19
- Reputation
- 38
- Reaction score
- 18
- Trophy points
- 18
- Activity points
- 791
Always latch at one edge, read on the other. For example latch at rising edge, read at falling edge. This will make life easier, and you won't be needing to go after timing analysis (provided that your simulation works fine and you're certain of the work-flow).
As ads-ee mentioned this is a bad deviced for FPGA design. You find the scheme in external interfaces where the delay skew is possibly larger than setup and hold times. Synchronous serial busses are often using it. But inside a FPGA, clock networks have pretty low skew and you get typically suffcient hold time margin without constraining the circuit, just using the propagation delay of FFs.Always latch at one edge, read on the other. For example latch at rising edge, read at falling edge. This will make life easier.
2) For ads-ee: We are not using ISE for synthesis, we used synplify_premier instead. Do you know of similar problem for this tool? Also, you mentioned about jitter, but I believe the tool should have default settings for jitters. I will double check with FPGA team for it, but I believe they should have set it correctly as this part is usually a script tcl used by the whole company.
This statement doesn't make a lot of sense. How is BRAM causing congestion issues? A BRAM is a single IP block on the die a FIFO controller if it's designed correctly (like using the FIFO generator) should use only a small amount of logic near the BRAM.For the FIFO, I'm not using BRAM, cause it's causing congestion issue, then placing error. No all FIFO bits are flops.
Well I need to say that I experienced this issue with Xilinx (interestingly not Altera, Lattice was also OK). What I'm saying goes against the theory, but it must be coming from a deficiency in Xilinx ISE. The design worked perfectly fine on Altera (Cyclone 4, with proper constraints), not on Spartan 6 however (with proper timing constraints). I still don't understand the reason behind it, but it's a patter I use now, and so far no problems any more. The behavior was odd, some registers failed to clock-in the data (later on discovered in Debug), while others registers were OK. My personal guess is path-delay that ISE fails to calculate correctly for some reason (or in specific situations).
Anyway, if you ever came across a complex state-machine design, and saw abnormal behavior even though the ISE confirmed the MHz and STA was OK, you may want to try this pattern
When the OP said no BRAM, I had assumed it was a tiny fifo, maybe 8 elements. But it sounds like this is not the case.
There may still be legitimate reasons why BRAM can't be used, eg, multi-write or possibly too many multi-reads that it would use too many BRAM.
Once again it is NOT a synthesis option:
It is a process property of Implement Design
View attachment 114622
The person responsible for running implementation of the entire design needs to tell you what options they are using. If they use -logic_opt (the 5th option) you could be seeing the exact same issue I ran into.
- - - Updated - - -
You could also resort to generating a simulation gate level netlist and SDF. Then run a full timing simulation on the entire FPGA, perhaps that would show some issue with the register FIFO.
So you are using Vivado!? Why didn't you mention that after post #7, when I asked what tool you were using?
Why should I waste my time trying to help, when you won't even tell us what tool chain you're using?
Besides learning how to debug something you also need to learn how to ask a question with useful information that alows someone to help.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?