2020年10月30日 星期五

Compute-in-Memory

 
Crossbar Array (12x12) for Convolutional Layer
https://ieeexplore.ieee.org/abstract/document/7479502
- July 2016
- First demonstration of crossbar RRAM for conv operation

- Dec. 2017
- First demonstration of 1T1R array for conv operation

1T1R Array (Eight 2048-Cell Arrays) for CNN
- Jan. 2020
- Off-chip ARM core for ReLU
- 11,041 GOPS/W with 96% accuracy on MNIST

1T1R Array for Ternary Weights Binary Inputs CNN
- Aug. 2019
- FPGA for controller, activation function and pooling
- 16.95 TOPS/W with 97% accuracy on MNIST

1T1R Array (Eight 256x512 Arrays) for Multibit Input, Weight and Output CNN
- Jan. 2020
- 2-bit input, 3-bit weight and 4-bit output
- 53.17 TOPS/W for 1-bit input
- 21.9 TOPS/W for 2-bit input
- Accumulation parallelism: 9

1T1R Array (Eight 512x512 Arrays) for Multibit Input, Weight and Output CNN
- Feb. 2020
- 2-bit input, 4-bit-weight and 10-bit output
- 45.52 TOPS/W
- Accumulation parallelism: 16

1T1R Array (48 256x256 Arrays) for Multibit Input, Weight and Output CNN
- Aug. 2022
- Use voltage-mode sensing instead of current-mode sensing
- 8-bit input, 4-bit-weight and 10-bit output
- 43 TOPS/W for 1-bit input
- 40 TOPS/W for 2-bit input
- 16 TOPS/W for 4-bit input
- 7 TOPS/W for 8-bit input
- Accumulation parallelism: 256


Reference Survey Paper


2020年8月30日 星期日

喜歡的影視

 電影

雨人、心靈捕手、火線大逃亡、少年Pi的奇幻漂流、上帝之子、關鍵少數、悲慘世界、賽德克巴萊、新天堂樂園、與神同行、KANO、孤味、高年級實習生、流浪地球、葉問、遇見街貓BOB、心中的小星星、幸福綠皮書、末代武士、奇蹟·笨小孩、刺激1995、峰迴路轉、大賣空、分秒幣爭

動畫

可可夜總會、風之谷、龍貓、天空之城、魔法公主、魔女宅急便、神劍闖江湖

電視劇

通靈少女、茶金、用九柑仔店、警察榮譽、非常律師禹英禑、重啟人生、舞伎家的料理人

紀錄片

大地之吻、RBG不恐龍大法官、社子島少年行


2020年6月1日 星期一

Sheet Resistance


當我們要將設計好的電路進行製造之前,我們要進行 layout,也就是畫出電路的佈局圖。在進行 pre-simulation 時,電路模型是很理想的情況,不會考慮導線上的寄生電阻和電容,當我們進行佈局時,導線的長、寬、間距就會影響到這條導線的電阻和電容值。

一般導線的電阻值是由小方塊的導線電阻去計算出來的,這個小方塊的導線電阻稱為 sheet resistance。在製程文件裡面,通常會看到 sheet resistance 與 W/S 有關,其中 W 即是小方塊導線的寬度,而 S 則是導線與其他導線的間距。

導線之間的間距影響的應該是電容值吧?為什麼會影響電阻值呢?

原因與半導體製造的過程有關,一條導線是單獨存在,還是旁邊有其它導線存在,會影響製造時蝕刻的速率,造成金屬線的特性產生差異。

Reference


2020年5月21日 星期四

電晶體模型之分類


在 model 中常見的名詞:
  • SVT:standard threshold voltage
  • LVT:low threshold voltage
  • HVT:high threshold voltage
  • Native:threshold voltage approaches 0V
  • Overdrive:通常在較先進製程中,元件所能承受的電壓也較小,但可以透過加大 Lmin (最小 channel length),使元件能夠承受較高的電壓。
  • Underdrive:類似於 overdrive,在相同製程中,由於某些電路區塊的電壓較低,可以放寬 Lmin 的限制,讓元件的 channel length 可以小一點。


模擬製程偏移對電路的影響


在做電路模擬時,通常有以下幾種不同的模擬情境:
  1. Total corner
  2. Global corner + Local MC
  3. Local MC only
  4. Global MC + Local MC

Total Corner

電路中所有的電晶體都會套用同一種 corner 的電晶體 Vth。一般在模擬時,至少須包含以下幾種 corner:TT、SS、FF、SF、FS,其中的 T、S、F 分別代表電晶體的速度為 typical、slow、fast,前者為 NMOS,後者為 PMOS。

Global Corner + Local MC

首先我們從 TT、SS、FF、SF、FS 中選定一個 corner,所有電晶體 Vth 的平均值就由這個選定的 corner 來決定,而每一個電晶體又會依此平均值而產生製程偏移。

Local MC Only

所有電晶體 Vth 的平均值都是 TT corner,但每一個電晶體會依此平均值產生製程偏移。

Global MC + Local MC

每一個電晶體的 Vth 可能落在不同的 corner 當中。


Reference

2020年4月25日 星期六

PyTorch no_grad


在進行 back-propagation 時,有些路徑是我們不想要去計算 gradient 的,這時我們可以用 no_grad() 這個 function。但有一個需要注意的地方是,只有在 no_grad() 底下產生出來的 tensor 才會被 disable gradient。以下舉兩個例子:

a = torch.tensor(1.0, requires_grad=True)
with torch.no_grad():
     b = a
b.backward()

這時候我們去看 a.grad,會發現還是有 gradient 產生。原因就在於,這個 b = a 其實只是讓 b 成為一個 a 的 reference,也就是 b 其實就是 a,只是名字換了而已。在這種情況下,b 不是一個在 no_grad() 底下產生的 tensor,因此還是會有 gradient。

a = torch.tensor(1.0, requires_grad=True)
with torch.no_grad():
     b = a + 0
b.backward()

假如改成 b = a + 0,那所產生的 b 就是一個新的 tensor,並且此 tensor 是不會被計算 gradient 的。

2020年4月13日 星期一

PyTorch 如何追蹤 backward 路徑


next_functions

當我們在建立一個 model 並進行訓練時,有時候可能 forward 結果是對的,但是訓練結果卻不如預期,這時候可能會想要知道 back propagation 的運算是否正確。這時候應該怎麼做呢?我們舉以下這段程式為例:


a = torch.tensor(1.1, requires_grad=True)
b = torch.tensor(1.2, requires_grad=True)
c = torch.tensor(1.3, requires_grad=True)
d = a * b
e = d * c
e.backward()

我們可以使用 e.grad_fn.next_functions 來追蹤 backward 的路徑。e.grad_fn.next_functions 是一個 list,其中包含了 e 往前走一層的所有 gradient function。上面這個例子中,e.grad_fn.next_functions 中包含兩個 element,一個是往 d 那邊走的 gradient function,另一個是往 c 那邊走的。

往 d 走的是 e.grad_fn.next_functions[0][0]
往 c 走的是 e.grad_fn.next_functions[1][0]

若我們想要知道 c 這條路徑的 forward 運算結果和 gradient,分別是:
Forward 結果:e.grad_fn.next_functions[1][0].variable   (結果為 1.3)
Gradient 大小:e.grad_fn.next_functions[1][0].variable.grad   (結果為 1.32)

而由於 d 這條路徑還有上游,我們必須再往上一層才能抵達 a 和 b

其中往 a 這條路徑的 forward 運算結果和 gradient,分別是:
Forward 結果:e.grad_fn.next_functions[0][0].next_functions[0][0].variable   (結果為 1.1)
Gradient 大小:e.grad_fn.next_functions[0][0].next_functions[0][0].variable.grad   (結果為 1.56 = 1.3 * 1.2)

而往 b 這條路徑的 forward 運算結果和 gradient,分別是:
Forward 結果:e.grad_fn.next_functions[0][0].next_functions[1][0].variable   (結果為 1.2)
Gradient 大小:e.grad_fn.next_functions[0][0].next_functions[1][0].variable.grad   (結果為 1.43 = 1.3 * 1.1)

只有位於 leaf node 的 grad_fn 有 variable 這個 attribute,因此必須使用 next_function 不斷的往前追蹤到所有的 leaf node 位置,過程中我們可以用 hasattr(object, name) 來確認 grad_fn 是否包含 variable 這個 attribute。

register_hook

如上所述,只有 graph 的 leaf node 存在 variable 能夠用於追蹤 gradient back-propagation。假如我們想要知道 internal node d 的 gradient 時,可以使用 register_hook。

承接上面這個例子,我們可以使用如下程式碼來取得 d 的 gradient。

grads = {}
def save_grad(name):
    def hook(grad):
        grads[name] = grad
    return hook
d.register_hook(save_grad('d'))

在做完 e.backward() 以後,就能夠用 grads['d'] 來存取 d 路徑上的 gradient,其結果為 1.3。

Reference
[1] https://stackoverflow.com/questions/52988876/how-can-i-visualize-what-happens-during-loss-backward
[2] https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/368709/
[3] https://discuss.pytorch.org/t/why-cant-i-see-grad-of-an-intermediate-variable/94/6


2020年4月7日 星期二

PyTorch register_buffer


通常我們想要建立一個 tensor 時,會用以下方法:

a = torch.tensor(0.1)

假如要在一個 module 中建立一些 tensor,可能會使用如下方法:

class Layer(nn.Module):
    self.__init__(self, num_outputs, num_inputs):
        self.w = nn.Parameter(torch.Tensor(num_outputs, num_inputs))
        self.a = torch.tensor(0.1)

其中的 w 是可以被訓練的參數,而 a 是無法被訓練的。

這時我們會遇到一個問題,當我們想要將整個 module 從 CPU 移動到 GPU 時:

layer = Layer(10, 100)
layer = layer.to('cuda:0')

我們會發現 w 可以成功的移動,但是 a 卻仍然停留在 CPU 上。其中的差異就在,nn.Parameter 會將 w 宣告成一個 module 內的參數,但是用一般 torch.tensor 方法宣告的卻不會。

那麼假如我們想要在 module 內建立一個不可訓練的參數要怎麼做呢?答案是:使用 register_buffer 功能。

以上面的例子來說,a 可以改用以下方式宣告:

self.__init__(self):
    self.register_buffer('a', torch.tensor(0.1))

之後我們要使用 a 時,一樣用 self.a 就可以使用了。如此一來,當我們將 module 移動到 GPU 時,a 也會跟著一起移動。

2020年3月30日 星期一

PyTorch 特殊函數之求導

torch.max() / torch.min()

對 torch.max() 進行 backward() 時,對輸入的 tensor 中數值最大的元素的 gradient 會貢獻 1,其餘則為 0。

對 torch.min() 進行 backward() 時,對數值最小的元素的 gradient 會貢獻 1,其餘則為 0。

程式
a = torch.tensor([1., 2., 3.], requires_grad=True)
b = torch.max(a)
b.backward()
a.grad

輸出
tensor([0., 0., 1.])

torch.abs()

對 torch.abs() 進行求導時,對輸入的 tensor 中正的元素的 gradient 貢獻為 1,對負的元素的 gradient 貢獻為 -1,對元素值為 0 的 gradient 貢獻為 0。

程式
a = torch.tensor([-1., -2., 3., 0.], requires_grad=True)
b = torch.abs(a)
b.backward(torch.ones_like(b))
a.grad

輸出
tensor([-1., -1., 1., 0.])

torch.where()

d = torch.where(a, b, c)
a 通常是一個 bool type 的張量,在 a 張量裡面是 True 的位置,b 該位置的元素值會傳到 d 的相應位置,在 a 張量裡面是 False 的位置,c 該位置的元素值會傳到 d 的相應位置。當我們對 where 進行 backward 時,在 b 和 c 當中有傳到 d 的那些位置的 grad 是 1,其餘位置的 grad 是 0。

程式
a = torch.tensor([True, False, False, True, True])
b = torch.tensor([1., 2., 3., 4., 5.], requires_grad=True)
c = torch.tensor([2., 4., 6., 8., 10.], requires_grad=True)
d = torch.where(a, b, c)
d
d.backward(torch.ones_like(d))
b.grad
c.grad

輸出
tensor([1., 4., 6., 4., 5.], grad_fn=<SWhereBackward>)   # d
tensor([1., 0., 0., 1., 1.])   # b.grad
tensor([0., 1., 1., 0., 0.])   # c.grad

求導結果為 0 的函數

sign, ceil

不可求導的函數

argmax, argmin, lt, le, eq, ne, ge, gt

當一條運算路徑中有經過不可求導函數時,在進行 backward() 時,這條路徑就無法進行求導運算了。

PyTorch add function


在 PyTorch 中的 add function,可以實現將兩個張量相加,可以寫成 c = torch.add(a, b),也可以直接寫成 c = a + b。

其中 a 和 b 分別可以是一個張量加上一個純量,結果 c 就會是把純量加到張量中的每一個元素上。

a 和 b 也可以是兩個張量,但是若要實現兩個張量的相加,a 和 b 的 size 就有特定的限制 (broadcastable)。

以下幾種 a 和 b 的 size 是允許相加的:

Size of a:  (5)
Size of b:  (3, 2, 1, 5)

Size of a:  (1, 5)
Size of b:  (3, 2, 1, 5)

Size of a:  (2, 1, 5)
Size of b:  (3, 2, 1, 5)

Size of a:  (3, 2, 1, 5)
Size of b:  (3, 2, 1, 5)

由以上的例子可以看出,其中一個張量 (a) 的維度必須小於或等於另一個張量 (b),而且 a 的 size 必須與另一個張量 b 的最後幾個維度的 size 相同。

以下幾種 a 和 b 也是允許相加的:

Size of a:  (3, 2, 2, 5)
Size of b:  (1, 5)

Size of a:  (3, 2, 2, 5)
Size of b:  (1, 1, 5)

Size of a:  (3, 2, 2, 5)
Size of b:  (2, 1, 5)

Size of a:  (3, 2, 2, 5)
Size of b:  (3, 1, 1, 5)

Size of a:  (1, 5)
Size of b:  (2, 1)

Size of a:  (1, 1, 1, 5)
Size of b:  (1, 2, 1, 1)

由以上的例子可以看出,在其中一個張量的維度中,可以允許一個或多個維度的大小為 1。在大小為 1 的那個維度中,b (a) 的所有元素會被廣播到 a (b) 裡面同一個維度中所有的 index 上並執行加法運算。


2020年3月26日 星期四

PyTorch 中 weight 和 weight.data 的差異


當我們做完 backpropagation 得到 weight 和 bias 的 grad 之後,要進行 weight 和 bias 的更新時,有兩種不同的 coding style。

(1) 使用 torch.no_grad()
with torch.no_grad():
    weight -= learning_rate * weight.grad
    bias -= learning_rate * bias.grad

(2) 使用 weight.data 和 weight.grad.data
weight.data -= learning_rate * weight.grad.data
bias.data -= learning_rate * bias.grad.data

這兩種方法有何區別呢?根據 PyTorch 官方網站給的解釋:
Recall that tensor.data gives a tensor that shares the storage with tensor, but doesn't track history.
 tensor 和 tensor.data 共享同一個儲存空間,但是當我們使用 tensor.data 時,PyTorch 不會追蹤運算的歷史,也就是當我們進行 backward() 時,在 tensor.data 中不會進行 gradient 的計算。


Reference
https://pytorch.org/tutorials/beginner/examples_autograd/two_layer_net_autograd.html

PyTorch 的 nn 和 nn.functional 的差別


在 nn 裡面實現了很多搭建神經網路時常用的 building blocks 如 Conv2D、ReLu 等等。但是相同的名稱在 nn.functional 裡面也能找到,那它們之間有何差別?

差別在於 nn 裡面的 building blocks 是用 Python 的 Class 來實現的,他繼承了nn.Module 這個 Class,像 weight 和 bias 等 variable 會存在 nn.Conv2D 裡面。但是對於 nn.functional.Conv2D 來說,因為它只是一個 function 而不是 class,function 本身是沒有狀態的 (state),所有一切 variable 在 function 結束以後就消失了,因此它的 weight 和 bias 等需要保留的 variable 就必須從外面傳入。

這也是為什麼,當我們創建一個 network 時,nn.Conv2D 要寫在 self.__init__ 裡面,但是 nn.functional.relu 卻不用。


Reference
https://discuss.pytorch.org/t/what-is-the-difference-between-torch-nn-and-torch-nn-functional/33597

2020年3月25日 星期三

PyTorch 的 backward function


在呼叫 t.backward() 時,若 t 是一個純量,就不需要傳入任何的引數。但是當 t 是一個張量的時候,就需要傳入一個和 t 同樣 size 的張量,這個張量是做什麼用的?

假設我們的 t = [t1, t2],這個張量的運算圖裡面有一個 leaf node 是 x = [x1, x2]。如果在呼叫 backward 時,我們傳入 [1, 1],PyTorch 會將 t 當中的每一個元素 (t1 和 t2) 都對 x1 進行偏微分,並且將所有的結果加起來得到 x.grad = [g1, g2] 中的 g1。

此時如果我們只想要知道 t1 對 x1 的偏微分結果,就要在呼叫 backward 時,傳入引數 [1, 0]。

這個傳入的引數,可以看成一個權重,可以控制 t 裡面每一個元素對偏微分的影響程度。在針對一個運算圖進行 backward 時,每一個 operation 的 backward function 會接收它的下游所傳來的 gradient,因為在進行 back propagation 時,上游的 gradient 是透過微分的鏈鎖律 (chain rule) 算出來的,也就是 backward function 的 input 會和該 operation 的 gradient 相乘,去得到上游的 gradient。


Reference
Sherlock, "PyTorch中的backward," https://zhuanlan.zhihu.com/p/27808095.

2020年2月4日 星期二

神經型態運算架構


SpiNNaker
Affiliation: University of Manchester, UK
Architecture: ARM processor-based
Neuron: LIF, Izhikevich
On-Chip Learning: STDP
Platform: PyNN
Reference: Furber, S. B., Galluppi, F., Temple, S., & Plana, L. A. (2014). The spinnaker project. Proceedings of the IEEE, 102(5), 652-665.

TrueNorth
Affiliation: IBM, USA
Architecture: digital ASIC
Neuron: LIF
On-Chip Learning: N/A
Reference:
[1] Merolla, P. A., Arthur, J. V., Alvarez-Icaza, R., Cassidy, A. S., Sawada, J., Akopyan, F., ... & Brezzo, B. (2014). A million spiking-neuron integrated circuit with a scalable communication network and interface. Science, 345(6197), 668-673.
[2] Esser, S. K., Merolla, P. A., Arthur, J. V., Cassidy, A. S., Appuswamy, R., Andreopoulos, A., ... & Barch, D. R. (2016). Convolutional networks for fast, energy-efficient neuromorphic computing. 2016. Preprint on ArXiv. http://arxiv. org/abs/1603.08270. Accessed, 27.

Loihi
Affiliation: Intel, USA
Architecture: digital ASIC
On-Chip Learning: pairwise STDP, triplet STDP, reinforcement learning
Platform: Nengo
Reference: Davies, M., Srinivasa, N., Lin, T. H., Chinya, G., Cao, Y., Choday, S. H., ... & Liao, Y. (2018). Loihi: A neuromorphic manycore processor with on-chip learning. IEEE Micro, 38(1), 82-99.

BrainScaleS/HiCANN
Affiliation: Heidelberg University, Germany
Architecture: mixed-signal (analog neuron and digital communication) wafer-scale system
Neuron: adaptive exponential IF
On-Chip Learning: highly flexible learning rules
Platform: PyNN
Reference:
[1] Meier, K. (2015, December). A mixed-signal universal neuromorphic computing system. In 2015 IEEE International Electron Devices Meeting (IEDM) (pp. 4-6). IEEE.
[2] Schemmel, J., Briiderle, D., Griibl, A., Hock, M., Meier, K., & Millner, S. (2010, May). A wafer-scale neuromorphic hardware system for large-scale neural modeling. In Proceedings of 2010 IEEE International Symposium on Circuits and Systems (pp. 1947-1950). IEEE.
[3] Friedmann, S., Schemmel, J., Grübl, A., Hartel, A., Hock, M., & Meier, K. (2016). Demonstrating hybrid learning in a flexible neuromorphic hardware system. IEEE transactions on biomedical circuits and systems, 11(1), 128-142.

NeuroGrid/BrainDrop
Affiliation: Stanford University, USA
Architecture: mixed-signal ASIC
Reference: Benjamin, B. V., Gao, P., McQuinn, E., Choudhary, S., Chandrasekaran, A. R., Bussat, J. M., ... & Boahen, K. (2014). Neurogrid: A mixed-analog-digital multichip system for large-scale neural simulations. Proceedings of the IEEE, 102(5), 699-716.

DYNAP
Affiliation: Institute of Neuroinformatics (INI), University of Zurich and ETH Zurich
Architecture: mixed-signal ASIC (ultralow-power subthreshold analog neuron, digital circuit for reprogramming of connectivity, supporting for RNN and multilayer network)
Reference: Moradi, S., Qiao, N., Stefanini, F., & Indiveri, G. (2017). A scalable multicore architecture with heterogeneous memory structures for dynamic neuromorphic asynchronous processors (DYNAPs). IEEE transactions on biomedical circuits and systems, 12(1), 106-122.

ODIN
Affiliation: Catholic University Louvain, Belgium
Architecture: digital ASIC
Neuron: LIF, Izhikevich
On-Chip Learning: spike-driven plasticity
Reference: Frenkel, C., Lefebvre, M., Legat, J. D., & Bol, D. (2018). A 0.086-mm $^ 2 $12.7-pJ/SOP 64k-synapse 256-neuron online-learning digital spiking neuromorphic processor in 28-nm CMOS. IEEE transactions on biomedical circuits and systems, 13(1), 145-158.

Reference
Rajendran, B., Sebastian, A., Schmuker, M., Srinivasa, N., & Eleftheriou, E. (2019). Low-Power Neuromorphic Hardware for Signal Processing Applications: A review of architectural and system-level design approaches. IEEE Signal Processing Magazine, 36(6), 97-110.

2020年1月15日 星期三

Interconnect RC Delay


Delay 的來源

  • Gate delay
  • Interconnect delay
    • Speed-of-light delay
    • RC delay
Speed-of-light delay 正比於連線長度,而 RC delay 則正比於連線長度的二次方。在舊製程中,由於 gate delay 較大,因此 RC delay 可以忽略不計。然而當製程微縮時,gate delay 越來越小,此時 RC delay 的影響就越來越大。

Coupling Noise 的成因

根據 Maxwell's Equation,當一個導體上的電壓和電流改變時,所產生的電場和磁場會對周遭的其他導體產生影響,稱為電容性串擾 (capacitive crosstalk) 和電感性串擾 (inductive crosstalk)。當導體距離越近,或是導體邊緣越尖銳,crosstalk 現象就越嚴重。

Wire Resistance

R = pL/Wt
p: resistivity
L: wire length
W: wire width
t: wire thickness

Wire Capacitance

一般導線上對 substrate 的寄生電容大小大約是相同大小的電晶體的十分之一。隨著製程越來越先進,導線彼此間的距離越來越小,因此導線間的 coupling capacitance 的影響也越來越顯著。

Wire Delay Modeling

Pi model 和 T model 的準確度比 L model 還要高,相同的一段導線上的 delay,若用 4 段 Pi model 來模擬,其誤差可小至 5%。然而若使用 L model,則需要分成 64 段。

Capacitive Crosstalk

當一條導線和另外一條導線相鄰時,會產生 coupling capacitance。這個 coupling capacitance 可以合併到 substrate capacitance 當中,以簡化 delay modeling,其轉換的方法為:若發生 coupling 的對象導線上是靜態的訊號,其 coupling capacitance 可以直接併入 substrate capacitance;若發生 coupling 的對象導線上的訊號是反向的 (一個上升一個下降),則其 coupling capacitance 需加倍計入 substrate capacitance 中;若兩條導線上的訊號是同方向 (一起上升或一起下降),則其 coupling capacitance 可忽略不計。以上所描述的是很理想的情況,實際上,導線上的訊號改變複雜得多。一條導線上訊號的改變,常常會對另一條訊號線造成干擾,進而產生 noise,此 noise 的大小,可以藉由 coupling capacitance 與 substrate capacitance 的分壓來得知。

其他問題


  • IR Drop: 由於電流在導線上傳遞時,會因導線上的電阻而產生電壓下降,在供應電壓較低的晶片上,IR drop 將造成晶片內部或距離 power pad 較遠處的供應電壓不足的問題,因此晶片需要有更多 power pad 從不同位置供電。
  • Electromigration: 在直流電流經一條導線時,電子移動時會撞擊導線中的金屬原子,經年累月的使用後,可能造成導線中的金屬原子離開原來所在位置,造成導線斷線。一般來說,一條寬 1 um 的導線,其電流不得超過 1 mA。
  • Self-Heating: 當電流在導線中流動時,會因導線電阻而產生熱,由於周圍的氧化物絕緣體同時也是熱的不良導體,因此熱會逐漸累積在導線上。而當導線溫度上升時,其電阻也會上升,因此產生更多的熱,最終可能造成導線熔斷。


Reference
Harris, D. (1997). High Speed CMOS VLSI Design–Lecture 4: Interconnect RC

2020年1月7日 星期二

RRAM Variation Model


RRAM Device Model


  • 2-D filament model 的主要變數:(1) tunneling gap distance、(2) conducting filament (CF) radius。
  • SET model:(1) CF length、(2) CF radius。
  • RESET model:(2) 電極釋放氧離子的速度、(2) 氧離子和空缺結合的速度。
  • CF 溫度的影響。
  • Device 的電流路徑包含: (1) hopping current path、(2) metallic conduction path。
  • 寄生電容電阻效應:(1) 電極間電容、(2) 電極外之 contact 電阻、(3) 氧化物漏電路徑。

Variation Model

  • LRS 的電阻值 variation 受到 CF radius fluctuations 的影響。
  • HRS 的電阻值 variation 受到 tunneling gap distance fluctuations 的影響。
  • Ion migration energy barrier 的隨機性會影響 switching voltage 的 variation。
  • Overshoot 現象:由寄生電容造成。
  • Read / write disturb 由 sub-threshold switching 造成。

Device 實驗結果

  • Abrupt set and gradual reset。
  • 改變 RESET maximum voltage 會使得 HRS 的電阻值不同。
  • 改變 SET compliance current 會使得 LRS 的電阻值不同。


Reference
Li, H., Jiang, Z., Huang, P., Wu, Y., Chen, H. Y., Gao, B., ... & Wong, H. S. (2015, March). Variation-aware, reliability-emphasized design and optimization of RRAM using SPICE model. In 2015 Design, Automation & Test in Europe Conference & Exhibition (DATE) (pp. 1425-1430). IEEE.