[SRAM-PIM Core Circuit] Design 256x1(4-bit Weight) Digital CIM

"256x1(4-bit Weight) Digital CIM"

1. Introduction

1-bit Input과 4-bit Weight Precision MAC 연산
→ 4-bit Weight Precision을 나타내기 위해 1-bit Weight로 계산되는 Column 4개를 한 묶음으로 하여 결과를 출력
→ 256x1(실제 Cell Array = 256x4)
→ If 1-bit Input x 16-bit Weight Precision & 64개의 출력 = 256x64(실제 Cell Array = 256x1024)

2. Architecture

6T SRAM + 4T NOR
NOR Gate를 곱셈기로 사용하기 위해 반전된 신호를 주입
→ 6T SRAM에 "1"을 저장한 것을 Wight = 1로 정의(** Weight = 1인 경우, 6T SRAM의 VL = 1 / VR = 0 **)
→ Weight = 1일 때 곱셈 연산 진행
→ NOR Gate는 입력이 "0"이어야 출력이 "1"이 나올 가능성 존재 ∴ NOR Gate의 2개의 입력 중 하나에 VR을 연결

4-bit Weight Precision을 위해 (6T SRAM + 4T NOR) 4개를 한 묶음
→ 1 Bit-Cell은 1-bit의 입력을 4개의 1-bit Weight와 계산

Adder Tree
곱셈 결과를 더함

28T Adder

28T 4-bit Adder

28T 5-bit Adder

28T 6-bit Adder

28T 7-bit Adder

28T 8-bit Adder

28T 9-bit Adder

28T 10-bit Adder

28T 11-bit Adder

                14T Adder                                                                                Inverter

14T 5-bit Adder

14T 7-bit Adder

14T 9-bit Adder

14T 11-bit Adder

1-bit 입력 데이터 : 28(256개의 입력 데이터) x 20(입력 정밀도) x 24(Weight 정밀도) = 212
2-bit 입력 데이터 : 28(256개의 입력 데이터) x 22(입력 정밀도) x 24(Weight 정밀도) = 214
∵ 1-bit 입력 데이터 {0, 1}의 최대값 = 1 → 20 / 2-bit 입력 데이터 {0, 1, 2, 3}의 최대값 = 3 → 22

TOP
28T-14T Adder

28T-28T Adder

Instance Name에서 <0:255>를 설정하여 이 bit cell을 256번 반복해서 256개의 데이터를 받음
BL/BLB는 256개의 데이터가 공유하므로, BL/BLB 각각 4개씩 존재
MUL<0:511>, MUL<512:1023>으로 나누어 2개의 Input을 받으면 0번째 데이터와 512번째 데이터를 SUM
→ 2 Row씩, 1개의 Input으로 받은 후, 이를 2개의 Input으로 나누면 (n)번째 데이터와 (n+1)번째 데이터를 SUM
(Ex. 4-bit Adder의 경우 8-bit를 Input으로 받은 후, 4-bit씩 나누어 (0)번째 데이터와 (1)번째 데이터를 SUM)

3. Setting & Result

(28T-14T Adder) + (All Input 0) + (All Weight 1)
2 : "input.ckt" 파일의 전체 내용을 불러옴
3 : 공정 모델 코너 "toplevel.l"에서 "top_tt" 부분만 불러옴 (중복으로 인해 주석 사용)
5~6 : [전압원 이름] [(+) 노드] [(-) 노드] [전압 크기]
8~10 : 상수 값 설정
12 : Weight 초기 설정 파일 불러옴
13 : Input 설정 파일 불러옴
15 : 0ns ~ 1.5ns 구간 관찰
16 : Energy = (전압) x (전류) x (시간) = (전압) x (전류의 적분 값) **50% 지점
18 : IN_B<0>가 50% 지점을 통과한 시간
19 : OUT<11>이 50% 지점을 통과한 시간
20 : Delay = (출력이 통과한 시간) - (입력이 통과한 시간)
22 : 10ps 간격으로 1.5ns까지 Simulation 진행
23 : 출력 데이터 형식 지정
24 : 그래프를 확인하기 위한 파일 생성
25 : 측정값 정밀도 (= 유효 숫자 자리수)
26 : 계산 오차 허용 범위를 좁혀 정밀도 강화

왼쪽 그림 : VL<0~1023> = 1 / VR<0~1023> = 0 → 모든 Weight를 1로 저장
오른쪽 그림 : IN_B<0~255>를 501ps에 0 → 1로 변경 → 501ps 이후부터 모든 Input은 0
Waveform을 확인하면 아래 그림과 같다.

MAC 연산 결과 OUT = 0000_0000_0000

(28T-14T Adder) + (All Input 1) + (All Weight 0)
12, 13 : 알맞은 파일로 변경


왼쪽 그림 : VL<0~1023> = 0 / VR<0~1023> = 1 → 모든 Weight를 0으로 저장
오른쪽 그림 : IN_B<0~255>를 501ps에 1 → 0으로 변경 → 501ps 이후부터 모든 Input은 1
Waveform을 확인하면 아래 그림과 같다.

MAC 연산 결과 OUT = 0000_0000_0000

(28T-14T Adder) + (Random Input) + (Random Weight)
12, 13 : 알맞은 파일로 변경


Input<83> : 1 x 1010 (VL<335> = 1 / VL<334> = 0 / VL<333> = 1 / VL<332> = 0)
Input<84> : 1 x 0110 (VL<339> = 0 / VL<338> = 1 / VL<337> = 1 / VL<336> = 0)
Input<219> : 1 x 1011 (VL<879> = 1 / VL<878> = 0 / VL<877> = 1 / VL<876> = 1)
Input<220> : 0 x 1000 (VL<883> = 1 / VL<882> = 0 / VL<881> = 0 / VL<880> = 0)

Input<83, 84, 219> = 1 / Input<220, 나머지> = 0


VL<333, 335, 337, 338, 876, 877, 879, 883> = 1 / VL<332, 334, 336, 339, 878, 880, 881, 882, 나머지> = 0

VR<333, 335, 337, 338, 876, 877, 879, 883> = 0 / VR<332, 334, 336, 339, 878, 880, 881, 882, 나머지> = 1

MAC 연산 결과 OUT = 0000_0001_1011 (1010 + 0110 + 1011)

(28T-14T Adder & 28T-28T Adder) + (All Input 1) + (All Weight 1)

12, 13 : 알맞은 파일로 변경


왼쪽 그림 : VL<0~1023> = 1 / VR<0~1023> = 0 → 모든 Weight를 1로 저장
오른쪽 그림 : IN_B<0~255>를 501ps에 1 → 0으로 변경 → 501ps 이후부터 모든 Input은 1
Waveform을 확인하면 아래 그림과 같다.

28T-14T Adder MAC 연산 결과 OUT = 1111_0000_0000

28T-28T Adder MAC 연산 결과 OUT = 1111_0000_0000


28T-14T Adder                                                                    28T-28T Adder

Power : (2.6pJ - 2.2pJ) / 2.6pJ ≒ 15.4%↓
Delay : (170ps - 140ps) / 170ps ≒ 17.6%↓

4. Thinking

28T-14T Adder : OUT 완만하게 상승 / 28T-28T Adder : OUT 급격하게 상승
14T Adder : Transmission Gate 구조
→ vdd, vss가 출력단(Cout, SUM)에 직접 연결되지 않아 입력 신호가 저항을 거쳐서 전달
28T Adder : Restoring 구조
→ vdd, vss가 출력단(Cout, SUM)에 직접 연결되어 입력 신호가 통과하지 않고 새로운 전력을 vdd에서 끌어와서 출력 핀에 공급

Glitch
14T Adder : 내부 저항이 크고, 구동력이 약하여 자잘한 Noise 또는 Glitch를 걸러서 출력
28T Adder : 반응이 민감하고, 구동력이 강하여 모든 Noise 또는 Glitch에 민감하게 반응하여 출력

Multi Output
256개의 Input이 서로 다른 Weight Set와 MAC 연산 (서로 다른 Weight Set가 256개의 Input 공유)
→ [256개의 1-bit Input → 4-bit Weight 곱셈 → Adder Tree → 1개의 출력] 회로가 하나의 Sub-Circuit
→ Sub-Circuit을 필요한 출력 개수만큼 배치
→ 256개의 Input은 공통으로 연결 + 각 Sub-Circuit에 서로 다른 Weight 설정
→ 여러 개의 결과가 동시에 출력

Multi-bit Input
Multi-bit Input을 시간차로 주입 like V_IN_0 IN_B<0> 0 pwl (0 xvss 10n xvdd 20n xvss 30n xvss)
→ 결과가 시간차를 두고 출력
∴ Accumulator(D - Flip Flop + Shift + Adder)를 추가하여 결과를 하나로 합침

5. Reference

https://hecess.blogspot.com/2026/01/sram-pim-core-circuit-all-digital-sram.html

댓글

이 블로그의 인기 게시물

[Mini-NPU RTL] NN Reference Model

[Mini-NPU RTL] TPU (Study Paper)