I played around with ROACH2 QDR calibration a few months ago and the following must be noted;
The physical trace length between FPGA and QDR SRAM is a fixed length. This fixed length equates to a different number of clock cycles, depending on clock speed. The interfacing firmware assumes a fixed number of clock cycles latency. The calibration routine thus only works for a certain range of clock speeds. In your case it looks like (at least) one of the interfaces is writing (or reading) incorrectly, but is compensating by inserting or removing a multiple of half a clock cycle of delay when reading (or writing). When reading/writing via the other interface, a different number of compensating half clock cycles is inserted. Which repo are you using? Regards Andrew On Wed, Mar 11, 2015 at 8:15 AM, David George <[email protected]> wrote: > A small chip-in - QDR doesn't work below 120 MHz: > http://www.cypress.com/?id=4&rID=31542 > > Regards > > On 10 March 2015 at 22:17, Matt Strader <[email protected]> wrote: > > Hi Jack, > > > > Thanks for your reply. I think I understand better what's going on. I > was > > thinking in terms of 64-bit words that get written or read each cycle, > but > > looking in qdr_cal(), I should probably think of two 32-bit words read or > > written each cycle. Then, perhaps I shouldn't be too surprised if the > order > > of the two words read out doesn't match my intuition. > > > > Initially, I was compiling at 100 MHz, but the qdr_cal always failed. > Then > > I tried 200 and 250 MHz, and the qdr_cal succeeds. > > > > My tests go like this. For the 200 MHz design, > > I call qdr_cal, and it returns True. > > > > Then I write this sequence of 64-bit values via the CPU: > > [0, 1, 2, 3, 4, 5, ..., , 1048574, 1048575] > > > > I read back the sequence from the CPU, and it agrees. > > [0, 1, 2, 3, 4, 5, ..., , 1048574, 1048575] > > > > I read it in fabric and get > > [1048575<<32, 0<<32, 1<<32, 2<<32, 3<<32, 4<<32, ..., 1048574<<32, ] > > > > > > Then I try the other direction, by writing a sequence of 64-bit values in > > fabric: > > [0,1,2,3,4,5, ... , 1048574, 1048575] > > > > I read back the sequence in fabric and it agrees: > > [0,1,2,3,4,5, ... , 1048574, 1048575] > > > > I read it via the CPU: > > nBytesPerSample=8 > > struct.unpack('>{}Q'.format(nSamples), > > roach.read('qdr0_memory',nSamples*nBytesPerSample)) > > and get: > > [1<<32, 2<<32, 3<<32, 4<<32, 5<<32, ..., 1048575<<32, 0<<32] > > > > So reading and writing only by the CPU is consistent, and reading and > > writing only in fabric is consistent, but when I do one by the CPU and > the > > other in fabric, the two 32 bit words get swapped, and the sequence is > > offset by one value. I actually see the same offset in a Roach1 version > of > > the design as well. It all seems consistent, not intermittent. > > > > Thanks, > > Matt > > > > > > > > On Mon, Mar 9, 2015 at 10:42 AM, Jack Hickish <[email protected]> > wrote: > >> > >> Hi Matt, > >> > >> The qdr_cal routine calibrates the relationship of clock and data > signals > >> in the link between the FPGA and QDR signals. Basically it writes test > >> patterns and reads them back looking for glitches. It then changes the > delay > >> of IODELAY blocks so that data read from the QDR is captured reliably. > >> If this calibration script runs successfully, I'm surprised you still > see > >> glitches with 32 bits of data swapped between read and write (both from > >> PPC). This would (surely?) count as a glitch and cause the calibration > >> routine to fail(?). Do you only see strange behaviour when you read > from the > >> FPGA fabric, or do straight write/reads from the CPU also misbehave? Is > the > >> behaviour the same on every read / write (i.e., not intermittent)? > >> > >> My experience with the QDR is that at high clock speeds (not sure how > >> high, but I see this at 312 MHz) the read latency of the QDR interface > isn't > >> 10 clock cycles as it should be even with the minimum IODELAY > configuration, > >> and there are no reliable qdr_cal solutions. I solved this problem for > my > >> design by removing half a clock cycle latency from the interface, at > which > >> point the QDR would calibrate ok. What speed are you running your > design at? > >> To me, misordered 32-bit chunks of data sounds indicative of a latency > >> problem in the qdr_cal solution, since the interface is 32 bit DDR, so > half > >> a clock cycle mangles 32-bit chunks of data. > >> > >> Good luck! > >> > >> Jack > >> > >> > >> > >> On Fri, 6 Mar 2015 at 23:54 Matt Strader <[email protected]> > >> wrote: > >>> > >>> Hi all, > >>> > >>> I'm trying to use QDR on Roach2. I have a test design where I write to > >>> QDR either in firmware or with katcp, then read it out in the firmware > and > >>> check the results with snapshot blocks. It mostly works, but with some > >>> interesting quirks. > >>> > >>> I know that katcp can only write 64 bits of the 72 bit QDR word, so I > >>> changed the bitbasher blocks in qdr_mask.m to move the inaccessible > bits out > >>> of the way to the most significant bits. Now everything seems to work > well, > >>> except that in some builds (seems to depend on clock rate?), the first > 32 > >>> bits (of the 64 bits I'm writing in a cycle) get swapped with the last > 32 > >>> bits sometime between writing the word and reading it back. And there > is a > >>> sometimes a difference in whether I am writing in firmware or by katcp > to > >>> whether this swap happens. > >>> > >>> Also, when I write with katcp starting at address zero, I find that > when > >>> reading out, the write started at what seems to be address 1. Is the > >>> latency of QDR set to 10 cycles? > >>> > >>> I can live with all this, as long as it is repeatable for a given > design, > >>> but I thought I'd ask if anyone knows what is causing these quirks. > >>> > >>> Also, I understand that we should run a software calibration for qdr, > >>> which seems to be qdr_cal() in qdr.py in the ska-sa:casperfpga repo. > So, I > >>> run this first, which seems to work for my latest compiles, but I > haven't > >>> noticed a difference in the results. What exactly does this > calibration do? > >>> > >>> Thanks, > >>> Matt Strader > >>> UC Santa Barbara > > > > > >

