fig1 schematically illustrates a ddr memory system 10 , which generally comprises a memory controller integrated circuit 12 and a memory module integrated circuit 14 . the memory module integrated circuit 14 comprises four ddr3 modules 16 , each of which may be accessed in parallel by its own dedicated bytelane 18 provided as part of the memory controller integrated circuit 12 . the memory controller integrated circuit 12 further comprises a clock / command ( clk / cmd ) module 20 which is configured to transmit clock and command signals to the ddr3 modules 16 . in the illustrated embodiment shown in fig1 , the clk / cmd signals are transmitted between the ddr3 modules in a “ fly - by ” configuration to improve signal integrity ( avoiding the reflections associated with a branching topology ). accordingly , the memory controller 12 can cause data to be read from one of the ddr3 modules 16 by issuing appropriate command ( cmd ) signals via the clk / cmd path ( in association with the clock signal clk which is also transmitted via that route ), the requested data being returned from the corresponding ddr3 module via its associated dq / dqs path to the corresponding bytelane 18 of the memory controller 12 . equally , the memory controller 12 can cause data to be written to one of the ddr3 modules 16 by issuing appropriate command ( cmd ) signals via the clk / cmd path , the write data being transmitted from the respective bytelane 18 of the memory controller 12 to the the corresponding ddr3 module via its associated dq / dqs path . in a read configuration , in order for the memory controller 12 to be able to correctly interpret the data transmitted as the dq signal , it is necessary for the relative timing of the dqs signal to be correctly calibrated , since the data strobe signal dqs indicates the sample points at which the dq signal should be sampled by the receiver . each bytelane further comprises a set of delay - locked loop ( dll ) logic 22 enabling these relative timings to be adjusted under the overall control of the memory controller 12 . fig4 a illustrates example timings of set of eight bits of a dq signal which may be carried on the dq path from a ddr memory module to its corresponding bytelane ( see fig1 ). specifically , fig4 a shows the dq [ 7 : 0 ] bits at the phy inputs from the dram after pcb trace . in this situation , whilst the relevant dll logic 22 could be configured to adjust the relative timing of the dqs signal ( dashed line in fig4 a ) to position the dqs centrally in the dq read eye (“ dqeye ” in fig4 a ) without other calibration being performed , the limited size of the read eye means that the data signal receiver ( i . e . the corresponding bytelane 18 in memory controller 12 ) would have very little operating margin and would frequently fail to correctly read data according to such a calibration technique . further detail of the delay - locked loop ( dll ) logic 22 provided in each bytelane 18 is schematically illustrated in fig2 a . the data flow begins at the right hand side of the figure where the phy inputs 30 for dq 0 and dq 7 and for the dqs signal 32 are shown . further dq inputs for dq 1 - dq 6 are omitted from the figure for clarity of illustration only . specifically , the dll 22 ( see fig1 ) in each bytelane comprises a de - skew dll 34 provided for each bit of the corresponding dq signal , together with a dqs centering dll 44 by means of which the timing of the dqs signal may be adjusted . also illustrated in fig2 a are the sets of flops 36 , 38 , 40 , 42 associated with each dq bit , which the bytelane dq / dqs modules 18 use as part of the calibration procedure for the dll units 34 , 44 . these flops comprise , for each dq bit , a rising edge capturing flop 36 and a falling edge capturing flop 38 . further , sampling flops 40 are configured to hold samples from a sequence of rising edges ( labelled 0 , 2 , 4 , 6 ), whilst sampling flops 42 are configured to hold samples from a sequence of falling edges ( labelled 1 , 3 , 5 , 7 ). as will be described in more detail in the following , these sampling flops are used to capture samples of a fixed pattern of data which is returned from the dram modules during the read eye calibration procedure . fig2 b schematically illustrates the principle of examining 4 - bit samples taken with respect to a transmitted predetermined data sequence of 0101010101 . where a pattern in the 4 - bit sample of 0101 is looked for , as shown in the figure the relative timing of the sample and the predetermined data sequence will determine whether a match is found (“ f ” indicating a failed match and “ m ” indicating a successful match ). accordingly , by using the dqs centering dll ( 44 in fig2 a ) to sweep through a range of relative timings , the starting point ( where the first match occurs ) and the end point ( where the matching begins to fail ) of the predetermined data sequence can be found . fig2 c schematically illustrates some registers and comparators which may be provided within a bytelane controller associated with each bytelane 18 in one embodiment . four 8 - entry registers ( bad2good , good_count , sum_bad2good and sum_good_count ) and one single entry register ( iteration ) are provided for tracking various quantities in the calibration process . also a “ current sample ” register and “ previous sample ” register ( each also being 8 - entry ) are provided to allow comparison with a pre - stored comparison value ( here being 0101 ). the “ current sample ” and “ previous sample ” registers are configured such that the content of the “ current sample ” register is transferred to the “ previous sample ” after each iteration . fig3 a to fig3 i illustrate a sequence of steps which are taken in one embodiment when carrying out a read data eye training procedure by which the dll logic 22 of each bytelane 18 of the memory controller 12 is calibrated . the procedure begins with some initiation steps . firstly ( at step 100 ) all de - skew dll logic 34 are set to a maximum of a quarter clock cycle . in other words , the bit timing delay applied to each bit is set to a minimum possible value ( setting the bit timing in advance by 90 degrees of its default position ) with respect to the overall offset provided by the read centering dll . at step 102 the read centering dll 44 in each bytelane is also set to an initiation value of zero . at step 104 the first_search flag is set to 1 , indicating that an initial coarse search should be performed in which it is checked if any of the dq bit ( middle four bits ) samples match the required 0101 pattern in iterative dll steps of 1 / 16 cycle . at step 106 the various dq registers used during the following calibration procedure are all set to 0 ( bad2good , good_count , iteration , sum_bad2good and sum_good_count ). then , at step 108 the memory controller 12 configures ( via the appropriate signal on the cmd path ) the dram modules 16 into mpr ( multi - purpose register ) read mode in which a predetermined data pattern will be returned on all dq lines . at step 110 all sampling flops 36 , 38 , 40 , 42 are reset , the rising edge flops being reset to 1 and the falling edge flops being reset to 0 . then at step 112 , the memory controller 12 instructs the dram modules to read data from the mpr in bl 8 mode ( burst length 8 ) and at step 114 waits for the read data to return . when the read data has been captured by the respective bytelane , for the purposes of the calibration procedure at step 116 the middle four samples for each dq bit ( i . e . numbered 2 , 3 , 4 , 5 ) are loaded into a register for evaluation and that evaluation begins at step 118 . the evaluation is described in more detail in fig3 b - 3i . on subsequent iterations of step 116 , the current 4 - bit sample is transferred to a “ previous 4 - bit sample ” register whilst the newly sampled data provides the content of a “ current 4 - bit sample ” register , the content of the two being compared in subsequent steps as described in more detail below . the detailed steps of the evaluation process ( beginning at step 120 ) which are taken in one embodiment when carrying out the read data eye training procedure are shown in fig3 b - 3i . at step 122 it is determined if the first_search flag is currently set to one , indicating that none of the samples for the dq bits have yet been found to match the searched for “ 0101 ” pattern . whilst this is the case , the flow proceeds to step 124 , where it is checked if ( at this iteration ) any of the dq bits has a 0101 sample . if no such sample has been captured for any of the dq bits then the flow proceeds to step 126 , where it is checked that the incremental steps through the dll ( i . e . through the dqs centering dll in each bytelane ) has not reached its maximum . if it has not , then at step 128 the dll step is incremented by 1 / 16 cycle and the flow returns to step 110 ( see fig3 a ) for the next iteration of the initial coarse search to be performed . in the event that the dll step is determined to have reached its maximum at step 126 then the procedure has unexpectedly failed and the full sweep in dll has been performed without finding a matching 0101 sample . in this situation the process exits with a failed status ( see steps 130 and 132 ). accordingly , the initial coarse search ( first_search = 1 ) continues in 1 / 16 cycle steps through the dqs centering dll until at least one of the dq bits is found to have provided a 0101 sample . once this occurs ( determined at step 124 ) the flow proceeds to step 134 where the first_search flag is reset to zero , indicating the conclusion of the coarse search . at step 136 the centering dll is stepped back by 3 / 16 cycle for the fine search to begin and the flow returns to step 110 ( see fig3 a ). thus on the next iteration which reaches step 122 , the first_search flag will be found to be set to zero and the “ no ” path from step 122 is followed , leading to step 140 ( see fig3 c ). here , in the fine search , it is first sought to determine the point , for each dq bit , where the first 0101 sample is found ( as the sweep through in the centering dll is performed ). at step 140 it is determined ( for each dq bit ) if the respective current dq sample is 0101 and the last sample for this dq bit was not 0101 . when this is the case , the flow proceeds to step 142 where the current dll step is saved into the respective bad2good register entry corresponding to this dq bit . then at step 144 the good_count entry for the respective dq bit is incremented by 1 . at step 146 it is determined if the dll step is at its maximum and if it is then ( step 150 and 152 ) the system has an unexpected error and the read levelling has failed . if however further iterations of dll steps are possible , then at step 148 the dll is incremented ( in this example embodiment in steps of 1 / 255 of a clock cycle ) and the flow returns to step 110 ( see fig3 a ). when , at step 140 it is determined that for a given dq bit , the “ current sample is 0101 , previous sample not equal to 0101 ” condition is not satisfied , then the flow proceeds to step 154 ( see fig3 d ). at step 154 it is determined , for each dq bit , if the respective current dq sample is 0101 and the previous sample was also 0101 . in other words , it is tested if , for this dq bit , the current dll offset is selecting a position part way through the transmitted predetermined data pattern . whilst this is the case the flow proceeds to step 156 where the good_count value for the corresponding dq bit is incremented by one . following this , at step 158 it is determined if the dll step has already reached its maximum and this being the case then ( step 162 and 164 ) the system has unexpectedly failed ( by reaching the end of the possible dll offset without identifying the end of the predetermined data pattern ) and the process exits . if however further dll steps are possible then the flow proceeds via step 160 where the dll step is incremented and the flow returns to step 110 ( see fig3 a ). alternatively , if at step 154 it is determined that the “ both current and previous sample equals 0101 ” condition is not met then the flow proceeds to step 166 ( see fig3 e ). at step 166 it is determined , for each dq bit , if the respective current dq sample is not 0101 and the last sample was 0101 . in other words , it is tested , for each dq bit , if the end of predetermined data pattern has been reached . when this point is found for a dq bit , the flow proceeds to step 168 where it is verified if , for this dq bit , the respective good_count value is at least the minimum good_count value set by the user , i . e . if a sufficient length of data pattern has been identified for this dq bit . the minimum good_count is user programmable according to the particular system requirements , but this may for example be set at 50 % of the ideal eye . if this condition is satisfied then ( step 170 ) the sampling for this dq bit is completed and at step 172 if the sampling for all dq bits is completed then the flow proceeds to step 194 ( see fig3 g ). if however other dq bits still have further sampling to be performed then ( if further dll steps are available ( step 174 )), the dll step is incremented at step 176 and the flow returns to step 110 ( see fig3 a ). if it is determined at step 174 that the dll step is at its maximum then the flow proceeds to steps 178 and 180 since the system has an unexpected error ( in that the dll has reached its maximum before the end point for all dq bits have been found ) and the read levelling process has failed . at step 168 if , on the other hand , the minimum user set good_count has not been achieved then the flow proceeds to step 182 where the respective bad2good register entry is reset and step 184 where the respective good_count value is reset , indicating that the previously identified sample ( s ) which matched 0101 was / were insufficient to be identified as the predetermined data pattern sequence and further 0101 samples are searched for on this dq bit , the flow proceeding to step 174 . if at step 166 the “ current sample not 0101 , last sample is 0101 ” condition is not met then ( by process of elimination ) neither the current sample nor the previous sample matched 0101 ( step 186 ). in this situation as long as the dll step has not reached its maximum ( step 188 ) then at step 194 the dll is incremented and the flow returns to step 110 ( see fig3 a ). if at step 188 the dll has reached its maximum then the system has an unexpected error and the read levelling has failed , exiting with a failed status ( steps 190 and 192 ). turning to fig3 g , step 194 is reached if it is determined at step 172 ( see fig3 e ) that the sampling for all dq bits has been successfully completed on this sweep of the dll . at step 194 the respective dll value is added , for each dq bit , to the respective sum registers ( i . e . sum_bad2good and sum_good_count ). then at step 196 it is determined if the program number of iterations over which the averaging process is to be carried out have been completed . if they have not then at step 198 the bad2good register for all dq bits are reset and at step 200 the good_count register for all dq bits is also reset . the flow then returns to step 110 ( see fig3 a ) for these further iterations to be done . if however at step 196 it is determined that the programmed number iterations have completed , then the flow proceeds to step 202 ( see fig3 h ). at step 202 the sum_bad2good and sum_good_count values ( for each dq bit ) are divided by the number of iterations carried out to get their average values . then , at step 204 , the calibrated setting for each de - skew ddl ( a “ per - bit dll code ”) is determined as : in other words , the averaged mid - point for a given dq bit ( avg_bad2good + avg_good_count / 2 ) is subtracted from the maximum value of this quantity found across all dq bits . at step 206 it is determined if any per - bit dll code has been evaluated as greater than a quarter clock cycle . if it is then the “ optimum eye ” method shown in fig3 h cannot be completed and the flow proceeds to step 214 ( see fig3 i ). if however all per - bit dll codes are within this quarter cycle limit then the flow proceeds to step 208 where the calibration for the dqs centering dll (“ read center dll code ”) if determined as : in other words , this is the largest value determined for all dq bits of the averaged mid - point of the read eyes found . finally , at step 210 the read eye opening is determined as the minimum ( across the dq bits ) of the averaged good_count values . the process concludes at step 212 where the read eye training has successfully completed . the training can be performed for each chip - select present in the system based on requirement . in the event that the optimum eye mode cannot be successfully completed ( at least one per - bit dll code is greater than a quarter cycle ) then the flow proceeds to step 214 . here , a replacement per - bit dll code is determined as : i . e . the difference between the averaged start position for this bit and the latest averaged start position for all dq bits . then at step 216 a per - bit loss value is determined as the per - bit dll code less a quarter cycle if this value is positive , otherwise zero . in other words if the per - bit dll code is less than a quarter cycle then there is no per - bit loss , otherwise the per - bit loss quantifies the “ excess ” over a quarter cycle which could not be adjusted for . this per - bit dll code is used for system debugging . at step 218 the read centre dll code is determined as : in other words the centering position is determined with respect to the latest eye opening for any dq bit , offset by half the smallest read eye opening for any dq bit . finally , at step 220 the overall read eye opening may be determined as the minimum across all dq bits of the average good_count minus the per - bit loss . the flow concludes at step 222 , where the read eye training has been successfully completed according to the “ minimum eye ” mode . fig4 a - 4d illustrate example relative timings of 8 dq bits and the resulting read eye related to various different stages of the above - discussed calibration process . fig4 a shows the 8 dq bits at the phy inputs from the dram after pcb trace . because of the lack of alignment between the respective dq bits the resulting dq read eye has a limited opening ( where labelled “ valid ”) and therefore the system will have an equivalently limited operating margin to correctly read the corresponding data when transmitted in this configuration . fig4 b shows the same set of dq bits after a per - bit de - skew calibration has been carried out according to the “ optimum eye ” mode described above . it can be seen that the dq bits have been adjusted to have a common centre ( with which the dqs strobe has been aligned ), resulting in an improved read eye opening and dqs centering with respect to all dq bits , thus improving the setup and hold margin across all dq bits . fig4 c shows , for comparison , the result after a per - bit de - skew calibration which has been performed according to a procedure in which all dq bits have been adjusted to have a common starting point to their read eye . fig4 d illustrates a result after a per - bit de - skew calibration which has been performed using the “ minimum eye ” mode , according to which all dq bits have been adjusted to have a common starting point to their read eye , in this case when the required correction for one dq bit ( dq 6 ) is too great to be able to be corrected by the respective de - skew dll for that bit , and accordingly some per - bit loss occurs . this causes some loss in the opening of the data eye and is reported to the user . fig5 a and 5b show two simulation results . fig5 a shows the relationship between dq and dqs before the per - bit read calibration described above . the valid data pattern is 0xaa55 . in this configuration the data signal receiver cannot reliably capture data as the data valid window ( the read eye ) does not allow dqs to be reliably centred in the data burst ). fig5 b shows the same simulated situation after the per - bit read calibration has been carried out . the valid data pattern is again 0xaa55 . the read eye opening is now increased at the capture flops ( capture_ff ) and dqs is now placed in the centre of the eye . the system can now more reliably capture the data burst . although particular embodiments of the invention have been described herein , it will be apparent that the invention is not limited thereto , and that many modifications and additions may be made within the scope of the invention . for example , various combinations of the features of the following dependent claims could be made with the features of the independent claims without departing from the scope of the present invention .