Chip BKIT ASIC để suy luận mô hình trọng số mở Kimi K3 2,8 tỷ tham số.

Viết bởi

trong

Kimi-K3

TSMC N3E

TSMC N3E / 4x XCD Tiles là hai thông số cốt lõi về tiến trình bán dẫn (Process Node)kiến trúc đóng gói vi mạch (Chiplet Architecture) của con chip ASIC BKIT-K3:


1. TSMC N3E là gì?

  • TSMC (Taiwan Semiconductor Manufacturing Company): Nhà máy gia công đúc chip bán dẫn số 1 thế giới.
  • N3E (3-Nanometer Enhanced): Là tiến trình quang khắc bán dẫn 3nm thế hệ thứ 2 tối ưu của TSMC.
  • Ý nghĩa công nghệ:
  • Mật độ bóng bán dẫn (Transistor Density) cực cao: Giúp nhồi hàng chục tỷ transistor vào một diện tích silicon nhỏ.
  • Hiệu năng & Tiết kiệm điện: Giảm ~32% điện năng tiêu thụ hoặc tăng ~18% hiệu năng xung nhịp (lên 1.8 – 2.0 GHz) so với thế hệ 5nm (N5).
  • Độ hoàn thiện (Yield Rate) cao: Là tiến trình tiêu chuẩn công nghiệp hiện đại đang được dùng trên các chip AI đầu bảng (như Apple M4/A18, Nvidia Blackwell).

2. 4x XCD Tiles là gì?

  • XCD viết tắt của Accelerator / eXtended Compute Die (Die/Phiến tính toán gia tốc).
  • Kiến trúc Chiplet (Modular Multi-Die): Thay vì chế tạo 1 phiến silicon nguyên khối khổng lồ (Monolithic) rất dễ bị lỗi và đắt đỏ, con chip được chia thành 4 khối tính toán độc lập (Tile 0, 1, 2, 3) ghép nối trên cùng một đế vi mạch 2.5D (CoWoS).

Bên trong mỗi Tile (XCD) bao gồm:

  1. 16 Lõi Ma trận Systolic (MXU): Chuyên thực hiện phép nhân ma trận FP4/FP8 tốc độ cao.
  2. Bộ xử lý Vector SIMD (VPU): Xử lý các phép toán phi tuyến như RMSNorm, hàm kích hoạt SwiGLU/SiLU và RoPE.
  3. 64 MB bộ nhớ đệm L2 SRAM siêu tốc: Cho phép nạp dữ liệu với băng thông nội bộ lên tới 45 TB/s (4 Tile = 256 MB SRAM).
  4. Bộ định tuyến MoE: Tự động chuyển giao các token tới đúng chuyên gia (Expert).

💡 Lợi ích của thiết kế này đối với Kimi K3 2.8T:

Lợi íchGiải thích
Tối ưu chi phí sản xuất (Yield)Chế tạo 4 die nhỏ có tỷ lệ thành công cao hơn rất nhiều so với 1 die lớn nguyên khối.
Băng thông siêu khủng4 XCD bao quanh một đế liên kết trung tâm (Base I/O Die), kết nối trực tiếp với 8 kênh nhớ HBM4 đạt 9.6 TB/s mỗi chip.
Tản nhiệt tốt hơnPhân tán tải tính toán 550W đều khắp 4 góc của con chip, tránh hiện tượng quá nhiệt cục bộ (Hotspots).

RTL của KV cache

// =============================================================================
// Module: kv_cache_engine
// Description: Hardware Paged-Attention DMA Reader & KV Cache Decompressor.
//              Optimized for ultra-long context LLM inference (up to 1M tokens)
//              with sub-cycle address translation and streaming FP4/FP8 decompression.
// =============================================================================

`timescale 1ns / 1ps

module kv_cache_engine #(
    parameter PAGE_SIZE_TOKENS = 64,       // 64 tokens per physical page block
    parameter KV_CHANNELS      = 16,       // 16 parallel KV channels
    parameter ADDR_WIDTH       = 40,       // 40-bit Physical HBM address (1 TB)
    parameter DATA_WIDTH       = 512       // 512-bit HBM memory bus per channel
)(
    input  logic                                  clk,
    input  logic                                  rst_n,
    
    // Control & Command Interface
    input  logic                                  req_valid,
    input  logic [15:0]                           req_seq_id,
    input  logic [19:0]                           req_page_id,    // Virtual Page ID
    input  logic [5:0]                            req_token_idx,  // Offset within page (0..63)
    input  logic [1:0]                            decompress_mode,// 00: FP4->FP8, 01: FP8 direct, 10: BF16
    output logic                                  req_ready,
    
    // Page Table Translation Interface (SRAM LUT lookup)
    output logic [19:0]                           pt_lookup_page_id,
    input  logic [ADDR_WIDTH-1:0]                 pt_phys_base_addr,
    input  logic                                  pt_valid,
    
    // Memory Controller / HBM AXI-like Read Interface
    output logic                                  mem_read_req,
    output logic [ADDR_WIDTH-1:0]                 mem_read_addr,
    output logic [7:0]                            mem_read_len,   // Burst length
    input  logic                                  mem_read_ready,
    input  logic                                  mem_read_valid,
    input  logic [DATA_WIDTH-1:0]                 mem_read_data,
    
    // Streaming Decompressed Output to Attention Core
    output logic                                  stream_valid,
    output logic [KV_CHANNELS-1:0][15:0]          stream_k_data,  // 16 parallel key elements (BF16/FP8)
    output logic [KV_CHANNELS-1:0][15:0]          stream_v_data,  // 16 parallel val elements (BF16/FP8)
    input  logic                                  stream_ready
);

    // =========================================================================
    // 1. State Machine: Page Translation -> Memory Fetch -> Decompress & Stream
    // =========================================================================
    typedef enum logic [2:0] {
        IDLE,
        TRANSLATE,
        FETCH_HBM,
        DECOMPRESS,
        STREAM_OUT
    } state_t;

    state_t state_r, state_n;

    // Registers
    logic [ADDR_WIDTH-1:0] current_phys_addr;
    logic [19:0] page_id_r;
    logic [5:0] token_idx_r;
    logic [1:0] mode_r;
    logic [DATA_WIDTH-1:0] buffer_r;

    assign pt_lookup_page_id = page_id_r;

    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            state_r           <= IDLE;
            page_id_r         <= '0;
            token_idx_r       <= '0;
            mode_r            <= '0;
            current_phys_addr <= '0;
            buffer_r          <= '0;
        end else begin
            state_r <= state_n;
            
            if (state_r == IDLE && req_valid) begin
                page_id_r   <= req_page_id;
                token_idx_r <= req_token_idx;
                mode_r      <= decompress_mode;
            end
            
            if (state_r == TRANSLATE && pt_valid) begin
                // Compute exact token physical byte offset:
                // Base + token_idx * (latent_dim * bits / 8)
                current_phys_addr <= pt_phys_base_addr + (token_idx_r << 6);
            end
            
            if (state_r == FETCH_HBM && mem_read_valid) begin
                buffer_r <= mem_read_data;
            end
        end
    end

    // Next State Logic
    always_comb begin
        state_n        = state_r;
        req_ready      = 1'b0;
        mem_read_req   = 1'b0;
        mem_read_addr  = current_phys_addr;
        mem_read_len   = 8'd4; // 4 * 64B = 256 bytes per KV block
        stream_valid   = 1'b0;
        
        case (state_r)
            IDLE: begin
                req_ready = 1'b1;
                if (req_valid) state_n = TRANSLATE;
            end
            
            TRANSLATE: begin
                if (pt_valid) state_n = FETCH_HBM;
            end
            
            FETCH_HBM: begin
                mem_read_req = 1'b1;
                if (mem_read_ready && mem_read_valid) begin
                    state_n = DECOMPRESS;
                end
            end
            
            DECOMPRESS: begin
                state_n = STREAM_OUT;
            end
            
            STREAM_OUT: begin
                stream_valid = 1'b1;
                if (stream_ready) state_n = IDLE;
            end
            
            default: state_n = IDLE;
        endcase
    end

    // =========================================================================
    // 2. Hardware Decompression Logic (FP4 E2M1 -> 16-bit BF16/FP8 representation)
    // =========================================================================
    generate
        for (genvar i = 0; i < KV_CHANNELS; i++) begin : gen_decompress
            // Extract 4-bit nibbles from buffer_r
            logic [3:0] k_nibble = buffer_r[i*8 +: 4];
            logic [3:0] v_nibble = buffer_r[i*8+4 +: 4];
            
            // Expand 4-bit FP4 into 16-bit format:
            // {sign, exp[4:0], mantissa[9:0]}
            assign stream_k_data[i] = {k_nibble[3], 5'b10000 + {3'b0, k_nibble[2:1]}, k_nibble[0], 9'b0};
            assign stream_v_data[i] = {v_nibble[3], 5'b10000 + {3'b0, v_nibble[2:1]}, v_nibble[0], 9'b0};
        end
    endgenerate

endmodule

RTL KV cache

RTL (Register Transfer Level) của KV cache là mô hình thiết kế phần cứng (bằng các ngôn ngữ như Verilog hoặc SystemVerilog) dùng để hiện thực hóa cơ chế lưu trữ và quản lý ma trận Key-Value (K, V) trên các vi mạch tăng tốc AI (như FPGA hoặc ASIC).

Các thành phần chính trong RTL của KV Cache

  • Hệ thống ngân hàng bộ nhớ (Memory Banks):
    • Chia bộ nhớ (thường là SRAM hoặc eDRAM) thành nhiều bank độc lập (ví dụ: chia thành các nhóm Key MSB, Key LSB, Value MSB, Value LSB).
    • Giúp các luồng đọc/ghi dữ liệu diễn ra song song mà không bị xung đột địa chỉ (bank conflict).

Đường dữ liệu ống dẫn (Pipelined Datapath):

  • Thiết kế các tầng đệm pipeline (nhiều chu kỳ xung nhịp) để truyền dữ liệu K, V từ bộ nhớ đệm thẳng đến các khối tính toán ma trận (Systolic Array).
  • Đảm bảo băng thông cao và độ trễ thấp cho quá trình giải mã tự hồi quy (autoregressive decoding).

Bộ điều khiển thay thế/giải phóng (Eviction/Replacement Controller):

  • Mạch logic tuần tự theo dõi số lượng token đang lưu trữ.
  • Quyết định thời điểm xóa hoặc thay thế các token cũ khi dung lượng bộ nhớ đệm trên chip đã đầy (dựa trên chính sách như LRU hoặc nhận diện token quan trọng).
  • Giao tiếp ngoại vi (Interface & DMA):
    • Tích hợp các chuẩn giao tiếp phần cứng như AXI Interconnect hoặc CXL (Compute Express Link) để trao đổi dữ liệu hiệu quả với RAM hệ thống hoặc GPU. [1]
  • Dùng ngôn ngữ Verilog, SystemVerilog hay HLS – High-Level Synthesis.
  • Mục tiêu triển khai trên TSMC 3nm node.

Nguồn: TSMC

Thiết kế vật lý và Bố cục silicon

Thiết kế vật lý của phần tính toán nhân ma trận cốt lõi (GEMM Engine) chạy định dạng NVFP4/FP8

VERSION 5.8 ;
BUSBITCHARS "[]" ;
DIVIDERCHAR "/" ;

MACRO SYSTOLIC_MXU_32X32
  CLASS BLOCK ;
  SIZE 3800.000 BY 3815.000 ;
  SYMMETRY X Y ;
  ORIGIN 0.000 0.000 ;

  PIN VDD_CORE
    DIRECTION INOUT ;
    USE POWER ;
    PORT
      LAYER M5 ;
      RECT 0.000 0.000 3800.000 20.000 ;
      RECT 0.000 3795.000 3800.000 3815.000 ;
    END
  END VDD_CORE

  PIN VSS
    DIRECTION INOUT ;
    USE GROUND ;
    PORT
      LAYER M5 ;
      RECT 0.000 20.000 3800.000 40.000 ;
      RECT 0.000 3775.000 3800.000 3795.000 ;
    END
  END VSS

  PIN clk
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER M4 ;
      RECT 1890.000 10.000 1910.000 30.000 ;
    END
  END clk

  PIN rst_n
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER M4 ;
      RECT 1850.000 10.000 1870.000 30.000 ;
    END
  END rst_n

  PIN weight_in[127:0]
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER M4 ;
      RECT 100.000 3790.000 3700.000 3810.000 ;
    END
  END weight_in[127:0]

  PIN act_in[127:0]
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER M3 ;
      RECT 10.000 100.000 30.000 3700.000 ;
    END
  END act_in[127:0]

  PIN accum_out[1023:0]
    DIRECTION OUTPUT ;
    USE SIGNAL ;
    PORT
      LAYER M4 ;
      RECT 100.000 10.000 3700.000 30.000 ;
    END
  END accum_out[1023:0]

  OBS
    LAYER M1 ;
    RECT 0.000 0.000 3800.000 3815.000 ;
    LAYER M2 ;
    RECT 0.000 0.000 3800.000 3815.000 ;
    LAYER M3 ;
    RECT 0.000 0.000 3800.000 3815.000 ;
    LAYER M4 ;
    RECT 0.000 0.000 3800.000 3815.000 ;
  END
END SYSTOLIC_MXU_32X32

END LIBRARY

FET

Toàn bộ hệ thống

Tham khảo

https://www.tsmc.com/english/dedicatedFoundry/technology/logic/l_3nm

https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/api/c/gemm.html

Kết luận

Con chip này sẽ bị cháy trong khi thử nghiệm. Các kỹ sư TSMC sẽ từ chối đưa vào máy quang khắc. Nguyên nhân là do kiểm soát nhiệt độ ở cấp độ nanomet kiểu này cực kỳ khó. Và 1 con chíp hiện tại, tôi nghĩ không có ít hơn 10 layer theo chiều 3D. Bài viết mang tính chất ôn lại kiến thức của chủ tịch BKIT.VN mà thôi.

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *