💻 Modül 6 · Yazılım Yığını · Bölüm 6.4 · 9 dk okuma

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

L1 · Başlangıç

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;
}
L2 · Tam

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 ayar

Crossbar 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.

L3 · Derin

ISPP fail handling:

15 iterasyon sonra başarısız olursa:

  1. Hücre stuck-LRS veya stuck-HRS olabilir.
  2. Failure map’e ekle.
  3. ECC ile redundant cell’e map.
  4. 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:

  1. Compiler quantize edilmiş weights’i alır.
  2. Hücre haritasına dönüştür (cluster, CU, crossbar, row, col).
  3. Her hücreyi ISPP ile programla.
  4. Failure map güncelle.
  5. 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

1/6ISPP iterasyon sayısı tipik?

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