RISC-V partI for software engineer

Milo Chen
12 min readFeb 16, 2021

--

在軟體世界中,我們有多種程式不同的寫法,來達到 C = A + B

這樣子的運算邏輯是所謂的 A 是一個記憶空間,存入一個值,B 也是一個記憶空間,存入一個值,最後還有一個記憶空間叫作C ,還沒有放值。

無論是任何的高階語言、C/C++ 、組合語言,最終它會作的事情就是

將記憶空間 A 中的數值取出來,把記憶空間 B 中的數值取出來,
然後透過一種神密機器運算的力量,算出了 A與B總合數值出來,接著再將數值放到
剛剛所宣告的記憶空間 C 裡面。

注意的地方是,這邊記憶空間或是 所謂的 A B 總合運算,它在整個電腦中,都只是實際的電路。
1. 有一種電路可以拿來記憶,而該記憶可以提取以及存放
(這種能記憶的電路可能是 DRAM的記憶,或是一種叫作 暫存器的記憶,在此我們先不深究)

2. 有一種電路可以自動計算出所謂的加法的行為。

因此你可以用電路設計出一台很簡單的電路,只要實現記憶空間的概念以及 加法 ,那麼這樣子子的電腦便能夠 滿足 C = A + B 的能力。

因此你也可以作所謂的 A = B + C + D + E … + Z
原因是因為
A = B + C + D + E … + Z
-> A = (…((B + C) + D )+ E …. ) + Z
多次數的記憶空間之存取,再加上加法運算,其實就夠運現這樣子的運算目標

y = B
z = C
x = ADD (y,z)

y = x
z = D
x = ADD (y,z)

y = x
z = E
x = ADD (y,z)

y = x
z = F
x = ADD (y,z)


y = x
z = Z
x = ADD (y,z)

為了要實現上面這種加法又給值的運算,我們可以作一個夠 general 的式子來思考它
就是

r1 = ADD (r2, r3) + C

我們假定一個機器它能讀懂的暗語,並且以二進制表示為

0001 0010 0100 cccc
r1 r2 r3 C

PS: 上面的 cccc 為 最小0000 ~ 至最大1111 的數值。
0001 表示 r1, 0010 表示 r2, 0100 表示 r3
0000 表示為 Non 也就是沒有意思,即為0

注意到上方有 x,y,z 記憶空間,我們用 r1, r2, r3 來表示其變數

原本我們的運算目標

y = B
z = C
x = ADD (y,z)

就可以變成如下

y = B → r2 = ADD (Non, Non) + B → 0010 0000 0000 bbbb
r2 Non Non B
z = C → r3 = ADD (Non, Non) + C → 0100 0000 0000 cccc
r3 Non Non C
x = ADD (y,z) → r1 = ADD ( r2, r3) + 0 → 0001 0010 0100 0000
r1 r2 r3 0

因此就是如下三組的機器碼

0010 0000 0000 bbbb
0100 0000 0000 cccc
0001 0010 0100 0000

而這三個機器碼就是代表我們原本要的目標

y = B
z = C
x = ADD (y,z)

同理,先前連加法中,運算最結尾的部份是

y = x 
z = Z
x = ADD (y,z)

那麼作法就是

y = x → r2 = ADD ( r1, Non) + 0 → 0010 0001 0000 0000
r2 r1 Non 0
z = Z → r3 = ADD (Non, Non) + C → 0100 0000 0000 zzzz
r3 Non Non Z
x = ADD (y,z) → r1 = ADD ( r2, r3) + 0 → 0001 0010 0100 0000
r1 r2 r3 0

因此它最終三組的機器碼就是

0010 0001 0000 0000
0100 0000 0000 zzzz
0001 0010 0100 0000

為了完成這樣子的連續加法的, 我們基本上就要在一塊記憶空間裡存儲如下的資料

0010 0000 0000 bbbb | y = B
0100 0000 0000 cccc | z = C
0001 0010 0100 0000 | ADD (y,z)
0010 0001 0000 0000 | y = x
0100 0000 0000 dddd | z = D
0001 0010 0100 0000 | x = ADD (y,z)
0010 0001 0000 0000 | y = x
0100 0000 0000 dddd | z = E
0001 0010 0100 0000 | x = ADD (y,z)




0010 0001 0000 0000 | y = x
0100 0000 0000 zzzz | z = Z
0001 0010 0100 0000 | x = ADD (y,z)

所以說,Compiler 的作用大概是什麼角色呢 ??
這邊 Compiler 它要作用就在於

將 A = B + C + D + E … + Z 這件事轉換成
A = (…((B + C) + D )+ E …. ) + Z

接著, Compiler 又將這件事拆解成

y = B
z = C
x = ADD (y,z)
y = x
z = D
x = ADD (y,z)
y = x
z = E
x = ADD (y,z)


y = x
z = Z
x = ADD (y,z)

接著, Compiler 又將它一次轉換成我們「暗語」能夠表達的事,就變成

0010 0000 0000 bbbb | y = B
0100 0000 0000 cccc | z = C
0001 0010 0100 0000 | ADD (y,z)
0010 0001 0000 0000 | y = x
0100 0000 0000 dddd | z = D
0001 0010 0100 0000 | x = ADD (y,z)
0010 0001 0000 0000 | y = x
0100 0000 0000 dddd | z = E
0001 0010 0100 0000 | x = ADD (y,z)




0010 0001 0000 0000 | y = x
0100 0000 0000 zzzz | z = Z
0001 0010 0100 0000 | x = ADD (y,z)

因此,我們在電路的設計上,只需能夠滿足這樣子需求:

當電路讀到

0001 0010 0100 cccc
r1 r2 r3 C

便作所謂如下之行為

r1 = ADD (r2, r3) + C

那麼,這電路只要能實作出這個暗語,整個連加法器的電腦就可以完成了。因為前述所有的形為都是靠著這組暗語來完成的 (r1 = ADD (r2, r3) + C)

因此, 我們可以說這個 r1 = ADD (r2, r3) + C 的密語就是我們的一個 Instruction。 我們暫時給這個 Intruction 命名為 OnlyCommand
我們可以設計一台電腦,它的 Instruction Set 就只有這個 OnlyCommand Instruction.

電路的部份只需要能夠將這東東
0001 0010 0100 cccc
作成
r1 = ADD (r2, r3) + C

那麼我們只要塞入一連串的暗語資料

0010 0000 0000 bbbb | y = B
0100 0000 0000 cccc | z = C
0001 0010 0100 0000 | ADD (y,z)
0010 0001 0000 0000 | y = x
0100 0000 0000 dddd | z = D
0001 0010 0100 0000 | x = ADD (y,z)
0010 0001 0000 0000 | y = x
0100 0000 0000 dddd | z = E
0001 0010 0100 0000 | x = ADD (y,z)




0010 0001 0000 0000 | y = x
0100 0000 0000 zzzz | z = Z
0001 0010 0100 0000 | x = ADD (y,z)

而電路依序從第一筆讀到最後一筆,一直不斷執行 OnlyCommand
那麼就可以完成所謂的

A = B + C + D + E … + Z

因為 Compiler 會有它的辦法將 A = B + C + D + E … + Z 轉換成
OnlyCommand 可以懂的 binary data

OnlyCommand 可以說是一種 軟體與IC設計之間的 Spec.
若是你能夠設計一組電路來滿足所謂的 OnlyCommand,就夠了。

當然未來因為需求變多了,會有各式各樣的新 Command 出來,它們會構成更大的 ISA Instruction Set Archtecture.

不過我們為了解釋 ISA 是什麼,所以我就創造了一個連加的軟體需求,並且定義了
Compiler 該作哪些事才能將一堆連加的需求轉換成 OnlyCommand.
而在這組ISA中就只需要 OnlyCommand 就夠了,

而OnlyCommand 可以用硬體設計電路來實現,當然未來也許可以由量子電腦來實現也不一定,但它就是一個很標準的 Spec. 這樣子的東西,就是 ISA.

關於這樣子的 ISA ,它是命脈,它將 IC 設計以及軟體層作了一個分野。
不過當今的 ISA 皆是以 Turing Machine 圖靈機的理論機礎去作的。

現今任何電腦的ISA 架構,最低一定能滿足所謂 Turing Machine 之要求,也就是
一個磁帶機(記憶空間),再加上由數位邏輯閘一定可以實現各種各樣的有限狀態機。

[The Church-Turing Thesis 到底哪裡屌 ?]
— — -
這個 The Church-Turing Thesis 告訴我們什麼事嗎?
就是這世界所有所有他媽的各種各松演算法,基本上都可以被 Turing Machine 實現。
因此,你的ISA 只要滿足最基礎的 Turing Machine (也就是磁帶加有限狀態機的東東),
那麼你就可以拿這個機器來跑這世界上所有的演算法了 !!
而這個偉大的 The Church-Turing Thesis 是由一位英國同性戀朋友發明的(也被拍成影片)
而所謂計算機的諾貝爾獎也就是 Turing Award.
這世界第一代電腦怎麼來的,最早是由貝爾實驗室(當時全球最頂尖科學家集合)一堆人完成的。
這個電腦就是以 The Church-Turing Thesis 來完成的。
所以後來才有所謂UNIX ,而UNIX 後,有各種語言出世,當然當中最 明星的就是C語言及其編譯器
有了 C 語言就有很大的進步,許多開始不用去寫組合語言不用直接拿打卡機寫 ISA 能懂的機器碼
然後有了 C 語言後有了 C++ ,如今所有OS 的 library 皆以 C/C++ 來實現,而後才有所謂各種高階語言的發
Android, iOS, Python, NodeJs 這些高階語言,許多的東西最終還是跑到底層的 C/C++ 所撰寫之 library,
而library 表述的是跟 OS 溝通,透過OS與CPU及I/O溝通,進而跟全世界Intenet 串在一起。而 CPU, I/O 這些東西,許多除了是硬體電路外,
更多IC 設計領域在完成的事情。

By the way,
Turing machines are theoretical concepts invented to explore the domain of computable problems mathematically and to obtain ways of describing these computations.

The Von-Neumann architecture is an architecture for constructing actual computers (which implement what the Turing machine describes theoretically).
你所讀的計算機概念,通常就是在講 Von-Neumann architecture
當然表述 Turing machines 的東西還有另一種architecture 就叫作 Harvard architecture.
當今我們熟悉的 x86 即為 CSIC, 它 follow Von-Neumann architecture, ARM 為 RISC 而它 follow Harvard architecture.
But anyway,都是 Turing machine !

Turing machine -> 可被存取資料磁帶加有夠被邏輯闡自由表述限狀態機。
因為滿足 Turing machine,所以依 The Church-Turing Thesis 來說,
經過數學證明,這世界所有的 Algorithm 皆可靠它實現 ! (like American Dream 30 years ago )
— — -

Verilog 可以寫出不同的電路,而一個電腦的 CPU ,或是易個完整的SoC 也可以被寫出來
Verilog 是一個 HDL (Hardware Description Language), 用程式的方法去描述電路的長像,而這些電路中的電子訊號將會平行執行。

如同當今大眾所皆知的類神經網路一般,如果有寫過 tensorflow 的人大概有概念,
你可以用語言去試圖描述一個類神經網路的長像,描述它類神經網路的實體。

最典型的作法,就是試著丟入label 好的 data 當 input 得到 output , 反覆著作同樣的事情,這個 大腦就會越來越聰明。

而 Verilog 就只是在描述一種固定的神經元,也就是數位邏輯閘可實現的邏輯電路。

當然這個 Verilog 它可以實現各種電腦,也可以去實現各種
ISA (Instruction Set Architecture)
而 Verilog 能夠實現之。

Verilog 是表述一個設計後,最終這些設計燒入成 FPGA, 或是所謂再更進一步的作成超高速又低價的 ASIC (量大才低價)
在IC 設計產業中

如果你是資管背景的人,你在開發自己軟體後,一定會設計屬於自己的 config 檔
其實這所謂的 config 檔之規範,config 設計的規範好壞就決定未來軟體的彈性與拓充性, config 規格設計的好壞,決定未來的彈性及效能。

這樣子的重要性,就相當於這個 ISA。
差別在於 ISA 以下是由所謂的 Verilog 來設計。
而 ISA 之上的東西是軟體的東西,而這軟體層的東西會有Complier 來將它變成一堆 ISA 的命令去。

當然以所謂 IC 設計的方式所實現的 Chip ,
它有一組最基能滿足 Turing Machine 的 ISA 出來,ISA 之上靠 Compiler 與各種高階語言作來串聯,
而 ISA 之下可以用 IC 設計實現 (當然未來可以用量子電腦來實現也不一定?)

當初電腦在發展時有所謂的 CISC, RISC 之戰
也有所謂的 x86 ARM 之戰,然後近代還有所謂的 RISC-V
RISC-V 也是一個 ISA
到底 RISC-V 是由何而生? 而未來潛力是什麼
我們後面,將會以近三十年來的歷史角度 ,來介紹一下 RISC-V 的潛力。

--

--

Milo Chen
Milo Chen

Written by Milo Chen

Study in Law/CS/EE & Dev in blockchain, AI, IoT, mobile app. Good in almost programming language with github https://github.com/milochen0418. 永遠十八歲/對世界好奇/INFP型

Responses (1)