ISPP Algoritması Adım Adım
256 seviyeyi tutturan iteratif programlama — yazılım perspektifi.
Bu bölümde öğreneceklerin
- ISPP algoritmasını firmware seviyesinde detayla pseudocode'la yaz
- Adaptif pulse genişliği stratejisini açıkla
- ISPP başarısızlığı (max iterations) nasıl ele alınır söyle
- Compiler ↔ ISPP API'sini özetle
- Y10 hedefi closed-loop ISPP'i tanı
Açılış: 256 Seviye, %1 Hassasiyet
Modül 5.5’te ISPP (Incremental Step Pulse Programming) prensibini gördük. Bu bölüm firmware kodu seviyesinde detayla.
Hedef: 256 ayrık G seviyesini ±1% hassasiyetle programla. Algoritma RISC-V firmware’inde çalışır, her hücre için ayrı.
Sezgi: Iteratif Yaklaşım
Geleneksel SET pulse %5+ hata. ISPP feedback ile %1’e iner:
Hedef G = 50 µS.
Pulse 1 → ölç 30 µS → -20 hata.
Pulse 2 → ölç 42 µS → -8.
Pulse 3 → ölç 49 µS → -1. Tamam!3-15 iterasyon, ortalama 5-7. Pulse genişliği veya voltajı her iterasyonda artırılır.
Formalizm: Pseudocode + Adaptif Kontrol
Temel ISPP firmware kodu:
typedef struct {
uint32_t cell_addr;
int target_g; // µS × 100 (sabit-noktalı)
int tolerance; // ±µS × 100
int max_iterations; // genelde 15
} ispp_params_t;
int ispp_program_cell(ispp_params_t *p) {
int pulse_voltage = INITIAL_VOLTAGE; // mV (1500 = 1.5V)
int pulse_width = INITIAL_WIDTH; // ns (10)
for (int i = 0; i < p->max_iterations; i++) {
apply_set_pulse(p->cell_addr, pulse_voltage, pulse_width);
int g_actual = read_cell(p->cell_addr);
int error = p->target_g - g_actual;
if (abs(error) < p->tolerance) {
return ISPP_SUCCESS;
}
if (error > 0) {
// SET daha kuvvetli
pulse_voltage += 50; // +50 mV
pulse_width = pulse_width * 12 / 10; // +20%
// Saturate
if (pulse_voltage > MAX_VOLTAGE) pulse_voltage = MAX_VOLTAGE;
if (pulse_width > MAX_WIDTH) pulse_width = MAX_WIDTH;
} else {
// Aştık → küçük RESET
apply_reset_pulse(p->cell_addr, -500, 5); // -0.5V, 5ns
pulse_voltage = INITIAL_VOLTAGE; // baştan
pulse_width = INITIAL_WIDTH;
}
}
return ISPP_FAIL;
} Adaptif pulse stratejisi:
İlk birkaç iterasyon agresif (büyük adım). Hedefe yaklaşırken küçük adım. Logaritmik yaklaşım.
// Hata orana göre pulse parametresi
if (error > 50) pulse_width = 100; // büyük adım
else if (error > 20) pulse_width = 50;
else if (error > 5) pulse_width = 20;
else pulse_width = 10; // ince ayarCrossbar paralel programlama:
256 hücre aynı satırda paralel programlanabilir. Aynı pulse uygulanır, ama BL kontrolü ile hangi hücre alır seçilir.
void program_row(int row, int targets[256]) {
int active[256] = {1, 1, ..., 1}; // tüm hücreler aktif
for (int iter = 0; iter < 15; iter++) {
// Tüm aktif hücrelere pulse
apply_row_pulse(row, active, voltage, width);
// Tüm hücreleri oku
int reads[256];
read_row(row, reads);
// Her hücre için kontrol
bool all_done = true;
for (int col = 0; col < 256; col++) {
if (active[col] && abs(reads[col] - targets[col]) < tolerance) {
active[col] = 0; // bu hücre tamam
} else if (active[col]) {
all_done = false;
}
}
if (all_done) return;
// Pulse adjust
voltage += 50;
width = width * 12 / 10;
}
}Süre: 256 hücre paralel → ~16 iterasyon × 50 ns = 800 ns/satır. 256 satır × 800 ns = 200 µs/crossbar.
ISPP fail handling:
15 iterasyon sonra başarısız olursa:
- Hücre stuck-LRS veya stuck-HRS olabilir.
- Failure map’e ekle.
- ECC ile redundant cell’e map.
- Compiler bilir, ağırlığı başka hücreye yazar.
Y1 ISPP fail rate: %0.5. Yönetilebilir.
Closed-loop ISPP (Y10 hedef):
Klasik ISPP: pulse → bekle → ölç. Closed-loop: pulse uygulanırken sürekli ölç, anında dur.
Avantaj:
- Süre %30 azalır.
- Hassasiyet artar (overshoot az).
Dezavantaj:
- Daha karmaşık devre.
Y10 prototipte test ediliyor.
Temperature compensation:
G(T) Arrhenius. Her crossbar’da thermal sensor → firmware düzeltme uygular:
int g_target_corrected = g_target * exp_lookup(Ea / (k * T));ISPP düzeltilmiş target ile çalışır. Drift azalır.
Compiler ↔ ISPP API:
Driver IOCTL LOAD_MODEL:
struct model_data {
weight_t weights[N]; // FP32 ağırlıklar
int n_layers;
layer_info_t layers[N_LAYERS];
};Firmware:
- Compiler quantize edilmiş weights’i alır.
- Hücre haritasına dönüştür (cluster, CU, crossbar, row, col).
- Her hücreyi ISPP ile programla.
- Failure map güncelle.
- Driver’a “model loaded” sinyali.
Performance:
Y1 model load:
- 419M hücre × 800 ns / 256 (paralel) = 1.3 saniye.
- Pratik: ~640 ms (bazı cluster’lar paralel).
Inference başlangıcı için ~1 saniye gecikme. Bir kez yapılır.
Deney: ISPP Trace
Hücre #12345 hedef G = 75 µS:
Iter 1: V=1500mV, W=10ns → G=20 µS, err=-55
Iter 2: V=1550mV, W=12ns → G=45 µS, err=-30
Iter 3: V=1600mV, W=14ns → G=62 µS, err=-13
Iter 4: V=1650mV, W=17ns → G=72 µS, err=-3
Iter 5: V=1700mV, W=20ns → G=76 µS, err=+1 → SUCCESS!Toplam: 5 iterasyon × 50 ns = 250 ns.
Failed örnek (hücre #98765, stuck-HRS):
Iter 1-15: G hep < 5 µS, hedef 50.
Iter 15: SUCCESS=false, FAIL signal.Hücre devre dışı bırakılır, ECC redundant cell’e map.
Kısa Sınav
Laboratuvar Görevi
ISPP optimizasyon:
(a) Klasik ISPP %5 başlangıç hatası, 5 iterasyon → %1. Toplam 250 ns/hücre. (b) Closed-loop: 175 ns/hücre. %30 hızlı. (c) Adaptive pulse: 200 ns/hücre. %20 hızlı. (d) İkisi birlikte (Y10 hedef): 150 ns/hücre. %40 hızlı.
Y10 model load (10B hücre, 50K paralel sütun): 10B / 50K × 150 ns = 30 ms. Y1 (640 ms)‘den 20× hızlı.
Inference downtime kritik (model swap için) → Y10 büyük avantaj.
Özet Kart
- ISPP: iteratif programlama, %5 → %1 hata.
- 5-15 iterasyon ortalama 5-7.
- Adaptif pulse: hata bazlı pulse genişliği.
- Paralel: 256 hücre/satır aynı anda.
- Fail handling: failure map + ECC.
- Y1 model load: 640 ms.
- Y10 closed-loop: 30 ms.
Vizyon: Yazma Hızı = Online Learning
Hızlı ISPP = online learning mümkün. STDP gibi sürekli ağırlık güncelleme:
- Y1: model statik (eğitim dış).
- Y3: son katman online ISPP (1 sn’de güncelle).
- Y10: 30 ms ISPP → fine-tuning saniyeler.
- Y100: mikrosaniye ISPP → STDP donanım. Bio-uyumlu plastisite.
Daha İleri
- Bir sonraki bölüm: 6.5 — SDK Katmanları
- Önceki: 6.3 — RISC-V Firmware
- ISPP klasik: Modül 5.5.
- Closed-loop: Strachan et al., Closed-loop programming in memristor crossbars, IEEE EDL 2018.