Jack, When you were having problems calibrating the qdr at high clock rate, how did you go about removing half a clock cycle latency from the interface?
Thanks, Matt On Wed, Mar 11, 2015 at 12:27 PM, Matt Strader <mstra...@physics.ucsb.edu> wrote: > I have my own fork of mlib_devel (https://github.com/mstrader/mlib_devel), > which is nearly identical to the current ska-sa repo. > > Thanks, > Matt > > On Wed, Mar 11, 2015 at 12:04 AM, Andrew Martens <and...@ska.ac.za> wrote: > >> 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 <dgeorges...@gmail.com> >> 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 <mstra...@physics.ucsb.edu> >>> 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 <jackhick...@gmail.com> >>> 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 <mstra...@physics.ucsb.edu> >>> >> 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 >>> > >>> > >>> >>> >> >