@@ -62,7 +62,7 @@ bool MeasureLUTDelay(
62
62
int nlut,
63
63
int ninput,
64
64
PTVCorner corner,
65
- float & delay );
65
+ map<PTVCorner, CombinatorialDelay>& delays );
66
66
67
67
bool ProgramAndMeasureDelay (
68
68
Socket& sock,
@@ -73,6 +73,16 @@ bool ProgramAndMeasureDelay(
73
73
int voltage_mv,
74
74
float & delay);
75
75
76
+ bool ProgramAndMeasureDelayAcrossVoltageCorners (
77
+ Socket& sock,
78
+ hdevice hdev,
79
+ vector<uint8_t >& bitstream,
80
+ int src,
81
+ int dst,
82
+ PTVCorner corner,
83
+ bool subtractPadDelay,
84
+ map<PTVCorner, CombinatorialDelay>& delays);
85
+
76
86
float GetRoundTripDelayWith2x (
77
87
int src,
78
88
int dst,
@@ -273,6 +283,47 @@ bool ProgramAndMeasureDelay(
273
283
return MeasureDelay (sock, src, dst, delay);
274
284
}
275
285
286
+ bool ProgramAndMeasureDelayAcrossVoltageCorners (
287
+ Socket& sock,
288
+ hdevice hdev,
289
+ vector<uint8_t >& bitstream,
290
+ int src,
291
+ int dst,
292
+ PTVCorner corner,
293
+ bool subtractPadDelay,
294
+ map<PTVCorner, CombinatorialDelay>& delays)
295
+ {
296
+ // Emulate the device
297
+ LogVerbose (" Loading new bitstream\n " );
298
+ if (!DownloadBitstream (hdev, bitstream, DownloadMode::EMULATION))
299
+ return false ;
300
+
301
+ for (auto v : g_testVoltages)
302
+ {
303
+ corner.SetVoltage (v);
304
+ if (!PostProgramSetup (hdev, v))
305
+ return false ;
306
+
307
+ // wait a bit to let voltages stabilize
308
+ usleep (1000 * 50 );
309
+
310
+ float delay;
311
+ if (!MeasureDelay (sock, src, dst, delay))
312
+ return false ;
313
+
314
+ // Remove off-die delays if requested
315
+ if (subtractPadDelay)
316
+ {
317
+ // Subtract PCB trace and IO buffer delays
318
+ delay -= GetRoundTripDelayWith2x (src, dst, corner);
319
+ }
320
+
321
+ delays[corner] = CombinatorialDelay (delay, -1 );
322
+ }
323
+
324
+ return true ;
325
+ }
326
+
276
327
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
277
328
// Characterize I/O buffers
278
329
@@ -588,28 +639,26 @@ bool MeasureLUTDelays(Socket& sock, hdevice hdev)
588
639
589
640
// Characterize each LUT
590
641
// Don't forget to only measure pins it actually has!
591
- float delay;
592
642
for (unsigned int nlut = 0 ; nlut < g_calDevice.GetLUTCount (); nlut++)
593
643
{
594
644
auto baselut = g_calDevice.GetLUT (nlut);
595
645
auto lut = GetRealLUT (baselut);
596
-
597
- // Try various voltages
598
- for (auto voltage : g_testVoltages)
646
+ for (unsigned int npin = 0 ; npin < lut->GetOrder (); npin ++)
599
647
{
600
648
// Test conditions (TODO: pass this in from somewhere?)
601
- PTVCorner corner (PTVCorner::SPEED_TYPICAL, 25 , voltage);
602
-
603
- for (unsigned int npin = 0 ; npin < lut->GetOrder (); npin ++)
604
- {
605
- if (!MeasureLUTDelay (sock, hdev, nlut, npin, corner, delay))
606
- return false ;
649
+ PTVCorner corner (PTVCorner::SPEED_TYPICAL, 25 , 3300 );
650
+
651
+ map<PTVCorner, CombinatorialDelay> delays;
652
+ if (!MeasureLUTDelay (sock, hdev, nlut, npin, corner, delays))
653
+ return false ;
607
654
608
- // For now, the parent (in case of a muxed lut etc) stores all timing data
609
- // TODO: does this make the most sense?
655
+ // For now, the parent (in case of a muxed lut etc) stores all timing data
656
+ // TODO: does this make the most sense?
657
+ for (auto it : delays)
658
+ {
610
659
char portname[] = " IN0" ;
611
660
portname[2 ] += npin;
612
- baselut->AddCombinatorialDelay (portname, " OUT" , corner, CombinatorialDelay (delay, - 1 ) );
661
+ baselut->AddCombinatorialDelay (portname, " OUT" , it. first , it. second );
613
662
}
614
663
}
615
664
}
@@ -623,10 +672,8 @@ bool MeasureLUTDelay(
623
672
int nlut,
624
673
int ninput,
625
674
PTVCorner corner,
626
- float & delay )
675
+ map<PTVCorner, CombinatorialDelay>& delays )
627
676
{
628
- delay = -1 ;
629
-
630
677
// Create the device object
631
678
Greenpak4Device device (part, unused_pull, unused_drive);
632
679
device.SetIOPrecharge (false );
@@ -675,12 +722,9 @@ bool MeasureLUTDelay(
675
722
device.WriteToBuffer (bitstream, 0 , false );
676
723
// device.WriteToFile("/tmp/test.txt", 0, false); //for debug in case of failure
677
724
678
- // Get the delay
679
- if (!ProgramAndMeasureDelay (sock, hdev, bitstream, src, dst, corner. GetVoltage (), delay ))
725
+ // Get the delays
726
+ if (!ProgramAndMeasureDelayAcrossVoltageCorners (sock, hdev, bitstream, src, dst, corner, true , delays ))
680
727
return false ;
681
728
682
- // Subtract PCB trace and IO buffer delays
683
- delay -= GetRoundTripDelayWith2x (src, dst, corner);
684
-
685
729
return true ;
686
730
}
0 commit comments