[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
14T Adder Inverter
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
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)
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을 확인하면 아래 그림과 같다.
(28T-14T Adder) + (All Input 1) + (All Weight 0)
왼쪽 그림 : VL<0~1023> = 0 / VR<0~1023> = 1 → 모든 Weight를 0으로 저장
오른쪽 그림 : IN_B<0~255>를 501ps에 1 → 0으로 변경 → 501ps 이후부터 모든 Input은 1
Waveform을 확인하면 아래 그림과 같다.
(28T-14T Adder) + (Random Input) + (Random Weight)
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)

VL<333, 335, 337, 338, 876, 877, 879, 883> = 1 / VL<332, 334, 336, 339, 878, 880, 881, 882, 나머지> = 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)
왼쪽 그림 : 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
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
댓글
댓글 쓰기