I have been investigating the issue more closely in signal tap, trying to find the main source of the problem. I have noticed a few weird issues.
Just some more information:
The write portion of the memory controller is controlled by a PCI interface operating at 33 MHz. This clock is taken from the PCI bus.
The read portion of the memory is controlled by a VHDL microprocessor that I created operating at 500 MHz. This is a derived clock from a 50 MHz clock.
The memory controller/ SRAM is operating at 200 MHz clock, also derived from the 50 MHz clock.
The device is a Stratix IV FPGA.
I have noticed there are some very odd "failed paths" listed in the timing analyzer between logic that should be isolated... I.e. A failed path between different copies of the memory controller, which is very odd to me.
Since reads appear to be 100% solid, I am confused at where the intermittent failure is coming from incorrect timings to the SRAM. I have a register at the output of the PCI bus to the memory controller latching it in at 200 MHz. The data from the PCI bus is held for a very long time, so I don't see any clock domain transfer issues.
In signal tap, I noticed that the value between the clock-domain transfer register and the buff_data_write register I use to buffer the value some times aren't matched! This doesn't make sense to me, since it should be a simple register-to-register transfer in the same clock domain (the difference being one has an enable controlled by the memory controller.) I understand that this could be a timing issue, but I find it hard to believe that the fitter would place two registers farther apart then the technology's register-to-register transfer delay... but I guess I still am new to the timing constraint aspect of Quartus. (Sometimes the output of the microprocessor would be correct despite having a failure as shown in signal tap, which also brings up the idea that the logic placed on the stratix chip to sample signals has a timing issue, masking the real cause of the problem.)
I am trying to figure out how to use the Timing Wizard better, since I have been using the Classic Wizard for the most of my programmable logic experience.
I have also noticed that setting design partitions and/or logic locked regions currently disables the design completely, so I must be doing something very wrong with this feature.
At this point, I have a few questions:
- Increase more registered stages to assist the router in meeting minimum timing requirements (Reads are the only thing that needs to be fast at this point.) (Edit: Is this likely to help?)
-I need Figure out how to set path delays (is there any way for the timing analyzer to do this automatically or easily, or do I have to set every path by hand?) I saw the free online session provided by Altera, and I know there is a support for asterisks, but this still seems like a very hefty task.
-How do I add derive_clock_uncertainty to my SDC file? Or where do I find out how to calculate this parameter. The timing analyzer complains a lot about this.
-I currently have the placement effort setting at 50, and it doesn't seem to be helping, so I am wondering if I should just shoot for logic locked regions and set this setting back to something more reasonable.
-Is there anything different between the POF/SOF file? Sometimes the SOF file works, and the POF file doesn't! :eek: (this makes no sense to me.)
I need to figure out whats going on so that I can actually continue implementing the difficult part of the design! The intermittent behavior is the most nerve racking thing about logic design.
I greatly appreciate all your help with these issues. Once I gain more experience in this matter I am hoping to be able to provide feedback to others.
Thank you again.