前言
第一次上課的時,還未到1:20,教室已經滿出來了,少說有破百人,選到了課卻站在外面的我,找了一個位子就地坐下。最後,大助公佈碩班研究領域相關的學生優先,不確定有多少人因此修不到這堂課,但反正最後選課系統應該有8X位,簽了honor條約、製程的保密條約,簡單介紹寫Lab的環境後,這堂課就結束了。
Lab1 Combinational Circuit
這個Lab首先介紹了design flow,開Spec->寫RTL design->跑合成->APR,開Spec其實就是每次Lab助教會規範的一些constraint,RTL就是我們必須要自己寫出來的東東,後面的Lab就會開始訓練我們如何把Design寫好,如何跑合成(寫tcl....),如何做APR.....。接著重頭戲就是介紹verilog,助教非常強調verilog是一種硬體描述語言,因為大多數的學生對軟體語言比較熟悉,可能還沒辦法get我們寫出來的每一行code都會被合成一個電路的概念,也因此第一個Lab助教也沒有太刁難我們,主要是讓我們了解verilog的基本語法和介紹pattern、testbed(想成一個麵包版連接design和pattern就好)。
Lab2 Sequential Circuit
結束第一個最基本的Lab後,大家大致上都熟悉verilog的語法了,於是這個lab加入了clock的概念,基本上一個design都不可能在一個cycle內全部做完,因此我們需要register暫存運算結果,也介紹了finite state machine(FSM)的概念,讓我們在寫design的時候運用FSM以達到比較好的管理(基本上後面所有的lab我幾乎都有使用到FSM),此外,助教也特地提醒我們寫Design的時候盡量一個訊號一個always block,這樣在debug會方便許多,不過我自己寫的時候會看情況分block,有時候訊號很有關聯的如果硬要把它們分開,反而會變得有點難debug,所以雖然助教會給我們建議,但其實還是要思考過後內化成自己的想法,不用盲目的去追崇。
這個Lab還有提到generate,可能是助教不想要我們亂用for,因為寫軟體寫習慣的人會覺得for是一個會從0依序執行到條件不滿足為止的東西,可是在verilog裡面,for其中一個用法是把array展開,也就是說,它並沒有依序執行的概念,這一點要非常小心,不過要不要使用是看個人啦,因為generate應該是到Lab 6寫IP的時候才會真正體會到它的強大,因此這邊可以參考寫法,但也不是必要的。
這個Lab的作業是寫Lock cipher,就是尋找密碼鎖的密碼,助教有給pattern,所以應該也不算太刁難我們。
Lab3 Testbench and Pattern
齁齁齁,大魔王寫Pattern的Lab終於來了,以前寫數電的時候最會逃避寫Pattern了,連上機考助教給了彩蛋Pattern,但上IC LAB是真的逃不掉阿。這個Lab會要求我們把Pattern交出去,所以千萬不要有靠別人的心態哦。
驗證是一門很重要的學問,驗證的方法分成direct和random,direct就是指我們輸入一些已知的case去做測試,random就是用產生大量的random測資去測,通常corner case都要我們自己去想,也就是corner case通常是以direct的方式得到測試的。生Pattern有很多方法,例如直接在Pattern.v檔內使用verilog的語法寫、或是用high level language(例如python、c、c++)等等的方式去生成測資之後在pattern.v裡面讀檔。
這個Lab寫的是sudoku,就是大名鼎鼎的數獨遊戲啦,助教會挖9個空格(其實是自己寫的pattern,所以是自己挖),然後我們的design就是要想辦法快速地把每一格該填什麼填出來。
Lab4 Advanced Sequential Circuit Design
這個Lab介紹了pipeline的概念,對,又是那個洗衣服烘衣服的示意圖,從大一到現在不知道看過幾次了。另外,還介紹了SYNOPSYS的IP,那~為什麼要用到IP呢?因為我們平常在寫Design的時候不免會需要用到一些比較複雜的數學運算(就像我們在c如果要計算square可能會另外include一個叫做math.h的library一樣呀~),這些數學運算的circuit會有一些公司幫我們寫好,這會比我們自己寫還快很多,且他們寫的效能可能也比我們寫得更好。
這次的作業是做四軸穩定器(聽說已經好多年都寫這個了),其實就是做pipeline矩陣的乘法,比較麻煩的就是小數的管理,因為這個Lab要通過一個由助教specify的精確度,因此有可能自己寫的時候沒有跑到一些比較corner的case就導致fail!!要特別注意除了要越逼近精確度的極限越好之外,還要好好的思考corner case。
Lab5 Introduction to Macros and SRAM
這個Lab會介紹Single port SRAM的讀寫、要怎麼去memory compiler生出我們想要的memory,基本上只要照著助教給的步驟,不管你用Script或是GUI的方式都沒問題。
這次作業寫的是Convolution,做Max Pooling、RELU、Fully connected,比較需要注意的就是SRAM讀寫都有一定的delay,因此在design的時候就要想一下要在哪個時間點取資料,才不會拿到錯誤的資料。
Lab6 Synthesis
這個Lab介紹Design compiler是怎麼幫我們合成的(也就是交大俗稱的跑02啦),跑合成最重要的就是寫tcl檔(Tool command language),compiler會依照我們寫的tcl檔去合成我們的design,步驟大致上是library->讀design->設置design環境->規範design的constraint->compile的策略(top down or bottom up)->優化design->分析design的問題(report timing、area等等),最後,design compiler會生成sdf檔,裡面紀錄cell的delay,在跑gate level simulation的時候會參考這些資訊。
此外,這個lab也教導我們自己寫IP,和正式介紹如何使用Generate!
這次作業寫的是在Galois field內做加減乘除,可以知道助教其實非常用心地在出這個Lab,整個Flow蠻清楚的,即使沒有接觸過finite field的,看著做應該也不會有太大的問題,只是如果要真正了解Galois field就真的要費一番工夫了。
<順帶一提>發明Galois Field的是一位名叫Évarite Galois的法國數學家,第一次聽到他的故事是在趙啟超教授的課堂上,發現他實在是一個天才,怎麼說呢?他死的時候才21歲,就已經發明了影響世界如此深遠的東西(如果有學代數的人應該就會知道這個東西有多了不起)。
好的 , 上半學期的課大概就到這邊,下半學期的課等我有空的時候會再上來把它完成的~