10/17 Từ một bit đến thanh RAM Các chương

Từ một bit đến một thanh RAM 16 GB

Làm sao hàng tỷ ô nhớ được tổ chức để máy tính tìm đúng dữ liệu?

Ở bài trước, ta đã đi từ một cell DRAM đến chuyện refresh cả một hàng.

Nhưng một thanh RAM không có vài chục hay vài triệu cell.

Nó có hơn một trăm tỷ cell.

Một thanh 16 GiB có:

16 × 1.073.741.824 × 8
=
137.438.953.472 bit

Mỗi bit cần một cell DRAM. Tức là khoảng:

137 tỷ cell.

Vấn đề bây giờ không còn là:

một cell nhớ bit thế nào?

Mà là:

làm sao tìm đúng dữ liệu giữa hơn một trăm tỷ cell?

Không thể kéo một sợi dây tới từng cell

Hãy thử cách ngây thơ nhất:

cell 1  ───────── dây 1
cell 2  ───────── dây 2
cell 3  ───────── dây 3
...

137 tỷ cell sẽ cần một lượng dây khổng lồ. Không thể làm như vậy.

Ta cần một cách giống như tìm một căn hộ: không cần một con đường riêng tới từng căn, chỉ cần biết tầng nào, căn nào.

DRAM làm điều tương tự. Nó xếp cell thành hàng và cột.

Hàng nào, rồi cột nào

Trong một hàng, các cell dùng chung một dây wordline. Bật wordline là mở tất cả cell của hàng đó, còn các hàng khác vẫn đóng.

Mỗi cột có một đường bitline chạy dọc, mang dữ liệu của cell đang mở trên cột đó.

Chọn một hàng, rồi chọn một cột:

Hàng nào, rồi cột nào
1011 0110 1011 0100

chọn một hàng, rồi một cột

Hàng + cột chính là toạ độ của cell.

Nhờ vậy, một mảng 1.000 hàng × 1.000 cột chứa một triệu cell mà chỉ cần chọn 1 trong 1.000 hàng1 trong 1.000 cột, thay vì một triệu dây riêng.

Mạch làm việc chọn đó gọi là decoder. Nó nhận số hàng dưới dạng bit, ví dụ 0110, hiểu là hàng 6, rồi bật đúng wordline đó.

Nhưng một lưới khổng lồ cũng không tốt

Có vẻ ta có thể làm tiếp:

137 tỷ cell
→ bỏ hết vào một lưới cực lớn

Nhưng lưới càng lớn thì các đường điện càng dài. Bitline dài hơn nghĩa là tải điện lớn hơn, tín hiệu yếu khó nhận hơn, đọc và ghi chậm hơn.

Ngoài ra, khi một hàng của mảng đang được mở, mảng đó đang bận với hàng ấy.

Vì vậy chip không làm một lưới khổng lồ. Nó chia bộ nhớ thành nhiều vùng nhỏ hơn gọi là bank.

Chia thành nhiều bank

Có thể hình dung một chip DRAM như thế này:

┌─────────────── CHIP DRAM ───────────────┐
│                                         │
│   ┌────────┐      ┌────────┐            │
│   │ Bank 0 │      │ Bank 1 │            │
│   │ hàng × │      │ hàng × │            │
│   │  cột   │      │  cột   │            │
│   └────────┘      └────────┘            │
│                                         │
│   ┌────────┐      ┌────────┐            │
│   │ Bank 2 │      │ Bank 3 │            │
│   └────────┘      └────────┘            │
│                                         │
└─────────────────────────────────────────┘

Mỗi bank chứa rất nhiều hàng và cột, và các bank xử lý công việc tương đối độc lập:

Bank 0 → đang mở hàng 120

Bank 1 → vẫn nhận được yêu cầu khác

Nếu mọi dữ liệu nằm trong một mảng duy nhất, các yêu cầu sẽ phải tranh nhau cùng một phần mạch.

Vậy địa chỉ bên trong chip bắt đầu giống một đường đi:

bank nào?

hàng nào?

cột nào?

Mỗi bước lại thu hẹp phạm vi.

Một chip vẫn chưa phải một thanh RAM

Những hình chữ nhật màu đen trên thanh RAM là các package DRAM. Bên trong package là miếng silicon chứa các cell, bank và mạch điều khiển.

Một package chỉ chứa một phần tổng dung lượng. Muốn nhiều GB hơn, ta đặt nhiều package lên cùng một bảng mạch. Bảng mạch đó là DIMM, thứ ta thường gọi là thanh RAM.

Một thanh RAM DDR5 với nhiều package DRAM màu đen gắn trên bảng mạch
Một thanh RAM gồm bảng mạch và nhiều package DRAM. Ảnh: PantheraLeo1359531 / Wikimedia Commons · CC BY 4.0

Nhiều chip cùng trả lời một lần đọc

CPU thường không lấy một bit đơn lẻ, mà truyền dữ liệu theo những nhóm rộng hơn. Vì vậy nhiều chip DRAM trên thanh cùng tham gia một lần truy cập.

Một cách bố trí phổ biến để dễ hình dung là tám chip, mỗi chip đưa ra 8 bit:

            một yêu cầu

      ┌──────────┼──────────┐
      ▼          ▼          ▼

    chip 0     chip 1      ... chip 7
     8 bit      8 bit          8 bit

      └──────────┼──────────┘


               64 bit

Nhóm chip cùng hoạt động như vậy gọi là một rank. Không phải thanh RAM nào cũng có đúng tám chip, nhưng ý thì giống nhau:

Một lần truy cập có thể dùng nhiều chip cùng lúc để tạo ra đường dữ liệu đủ rộng.

Phóng to từ thanh RAM xuống một cell

Chạm vào phần đang sáng để nhìn vào bên trong:

Phóng to từ thanh RAM tới một bit
  1. RAM
  2. CHIP
  3. DIE
  4. BANK
  5. HÀNG + CỘT
  6. CELL

Một thanh RAM chứa nhiều chip DRAM.

RAM không đi tìm dữ liệu. Nó dùng địa chỉ để thu hẹp dần tới đúng vị trí.

Xếp các tầng lại:

thanh RAM

chip / rank

bank

hàng

cột

dữ liệu

Mỗi tầng trả lời một câu hỏi nhỏ hơn: ở nhóm nào, bank nào, hàng nào, lấy phần nào trong hàng.

Đó là cách hàng tỷ cell vẫn truy cập được mà không cần hàng tỷ dây riêng.

Nhưng còn một mảnh ghép quan trọng. Chương trình không bao giờ nói “bank 3, hàng 1247, cột 86”. Nó chỉ làm những việc như:

score = score + 1;

CPU cuối cùng chỉ thấy một địa chỉ bộ nhớ.

Làm sao một địa chỉ như 0x7F... biến thành đúng rank, bank, hàng và cột trong DRAM?