Perl等腳本語言在IC設計中有哪些用處?數字IC前端設計有必要掌握類似語言么?如果有,應該掌握到什麼程度?
perl,python,tcl,tk,awk這幾種語言個適合IC設計的哪些場合了。
利益相關:漂在矽谷的硅工
一般來講,作為一個IC前端設計的工程師,了解公司已有的Perl和Python工具即可。因為負責開發這種自動化工具在團隊或公司中通常另有其人。那些工程師會負責改善platform,將process flow中「必要的」人為操作逐漸自動化。
當然也有例外,如果在projects之間的「閑季」過長,比如兩三個月,團隊往往組織「閑置農民」做一些小型process improvement projects。通常是由excel sheets自動生成新的data sheets,testing vectors或者Behavior Module RTL codes。
為何自動生成新的excel sheets?
公司所保存重要數據的spec往往以excel文件入庫,所以excel文件即是輸入文件,也是輸出文件。1)一旦其中一個數據發生改變,極有可能其他相關數據或者其他spec表格中有引用它的數據都會發生改變,人為修改容易出錯且耗費時間。而在研發階段數據的變更頻率很高,不容許把更新表格成為critical path。2)最基本的spec往往包羅萬象,不僅數據繁多,而且分布在不同table中,對某些使用者,比如application engineer或testing engineer來說,他們只需要看其中的一小部分數據,所以需要把分開儲存的數據提取放在一個新設計的表格中。
為何自動生成新的testing vectors?
對於一個晶元產品,通常內部很高比例的IP/SubSystem都是可重複利用的,比如SRAM和各種通訊協議。不一樣的地方只在於如何使用,比如時鐘不一樣,GPIO介面不一樣或者內存大小不一樣。但如果僅僅因為這些不同,就去重新寫或修改testing vector來測晶元的這部分功能,不僅非常非常耗時間,極容易出錯,而且出錯後還需要更多時間來debug。另外對於不熟悉這些IP或SubSystem的工程師,還需要搭上至少一周時間的learning curve。而一旦將testing vectors自動化,納入操作流程,所有這些工作程序可縮減到1秒。為何自動生成新的RTL codes?
Analog IC的Behavior Module通常由後端工程師編程,但後端工程師的主業並不在於RTL編程。所以這個過程也容易出錯。然而後端工程師在完成schematic之前就已經寫好了truth tables,delay和warning message等等。Perl script可以直接讀取存有這些信息的excel sheet,然後根據特定template來生成verilog RTL文件。如果有特殊要求,Perl script還可以生成用以模擬Behavior Module的Test cases。此外,對於前端IC驗證工程師,Perl工具可以節省自己編寫systemverilog的時間。舉個例子,研發階段,register map和IP parameter可能一日一改,與register map相關的TB component,randomization,coverage,test case和assertions都需要相應改codes。此時,如果自己寫perl script根據register map來自動生成相應codes,自己的任務量就會減輕99%。
至於完成這些工作需要多強的perl編程能力呢。我覺得有三點:1)正則表達式;2)GetOptions;3)Stack Overflow。做為一個晶元設計「老臘肉「,在還是一塊「小鮮肉」的時候也是對集成電路當中的腳本充滿了好奇,同時也充滿了迷茫,哪種語言在工作當中用的多呢?哪種語言效率更高呢?哪種語言適合找工作呢? 我來嘗試就我個人理解,從不同的角度來回答一下。
歡迎討論,同時也歡迎關注我們的微信公眾號「觀芯志」。
----------------------------------------
1. 概述:
我們在集成電路行業中一般常用到的有四種腳本,分別是 csh,TCL,Perl, Python.
- csh介紹:C shell 是一個互動式命令解釋器和一種命令編程語言,採用的語法類似於 C 編程語言。shell 是互動式地從終端鍵盤或者是從一個文件來執行命令的。這個 csh 命令調用了 C shell。
- TCL介紹:Tcl (最早稱為「工具命令語言」"Tool Command Language", 但是目前已經不是這個含義,不過我們仍然稱呼它為TCL)是一種 腳本語言。 由John Ousterhout創建。 TCL很好學,功能很強大。TCL經常被用於 快速原型開發,腳本編程, GUI和測試等方面。
- Perl介紹:Perl,一種功能豐富的計算機程序語言,運行在超過100種計算機平台上,適用廣泛,從大型機到便攜設備,從快速原型創建到大規模可擴展開發Perl最初的設計者為拉里·沃爾(Larry Wall),於1987年12月18日發表。Perl 一般被稱為「實用報表提取語言」(Practical Extraction and Report Language)。
- Python介紹:Python(英國發音:/?pa?θ?n/ 美國發音:/?pa?θɑ?n/), 是一種面向對象的解釋型計算機程序設計語言,由荷蘭人Guido van Rossum於1989年發明,第一個公開發行版發行於1991年。Python語法簡潔清晰,特色之一是強制用空白符(white space)作為語句縮進。
--------------------------------------------------------------------------------------------------
以下分析基於大家都是小白的情況下,不考慮高級寫法,長文不易,不喜勿噴。同時以下內容都從一個數字IC設計工程師的角度所寫,見識有限,若有不同技術喜好,可友好討論。
--------------------------------------------------------------------------------------------------
2. 分析:
1)處理簡單問題:
- csh:
做為linux的原生語言,是最容易的語言。其中的grep,awk, sed等命令對於文本處理有極高的效率。簡單問題:比如我要找到一個文本當中,以A開頭的行:grep -e "^A" txt. 再如,打出這些行的第二列: grep -e "^A" txt |awk "{print $2}".基本2秒之內完成。
- TCL :
同樣實現上述功能(偽代碼) 打開文件,遍歷開始,if匹配,split分列,顯示,遍歷結束,關文件. 綜上所述,最少7句,可見在這種簡單問題上,劣勢明顯.
- Perl :
同樣實現上述功能, 同tcl
- Python :
同樣實現上述功能, 同tcl綜上所述:在實現簡單問題上面,TCL, Perl, Python都像殺雞用牛刀,csh簡單粗暴。
2)EDA工具的兼容性:
- csh:外部調用
- TCL : 原生兼容。這麼理解,集成電路軟體就環境像大家用的電源插座(中國標準220v),tcl就是中國標準的插頭,在中國走到哪裡都能用。
- Perl : 美國110v插頭,到中國來得配個轉接頭。無法直接用,我只見過極少數的EDA軟體原生支持perl,但我見過所有的軟體都支持tcl。
- Python : 這個說到都是淚啊,自定義插頭,自己的插頭還有兩個版本python2.3和python3。在eda裡面也是靠外部調用。
綜上所述:TCL語言無疑是EDA語言當中兼容性最強的霸者,無法撼動。
3)EDA流程式控制制:
- csh : 罕有見聞,最多拷貝文件,刪除文件夾之類
- TCL: 幾乎所有的EDA控制流程式控制制都是用tcl所寫。 個人覺得有兩方面原因,一方面是EDA的兼容性,另一方面tcl腳本的可讀性是所有幾種腳本中最好的,解釋性的語言,硬性的語法,為流程維護帶來了極大的便利。
- Perl : 罕有見聞,同時perl的寫法比較靈活,維護方面比較困難。
- Python :罕有見聞,維護災難~~~強制用空白符(white space)作為語句縮進,一翻頁就不知道看的是啥了,兩眼都是淚,誰能告訴我為什麼?
綜上所述: TCL語言在集成電路設計軟體流程式控制制當中依然是主流。
4)語言功能擴展和高級用法(電路方向):
- csh : 少
- TCL : 從未使用,同時對於高級用法,如哈希等擴展性有限,被業界詬病。比較有用的就是開發GUI的時候可以使用tcl/tk。
- Perl:Perl的社區活躍度很高,有些好用的module擴展,比如有提到的一些「getOptionos「,生成excel,生成圖表,等等。對於電路設計人員來說,更為重要的事,perl擁有靈活的正則表達式、很強大的hash功能、指針轉換等優點,在數字集成電路前端設計中有非常廣泛的應用:(1)自動生成有規律的verilog代碼,來保證代碼風格的一致性,和強大的低錯誤率;(2)讀取繁雜的技術文檔,建立複雜的hash表,自動生成具有參數化的、可擴展性強的verilog代碼,可極大地降低人工手動編寫的錯誤率,同時,保證與技術指標更新一致的嚴格性和實時性。(3)自動生成模擬激勵,抓取關鍵信息,因為隨著集成電路規模的增大,模擬測試工作量大大增多,自動化生成激勵會大大降低工作量,提高驗證效率。
- Python :擴展多為科學計算開發包多用於金融計算(pandas、tushare可以組合寫股票模型),爬蟲(scrapy 爬知乎美女圖片),機械學習(scikit-learn 簡單用來訓練識別圖片),畫一些科學圖(matplotlib)... 高級用法,最棒的地方在於支持對象,這個功能在寫高級演算法的時候非常好用。
綜上所述:Perl的優點,奠定了其在IC設計中的無可動搖的地位,而python則成為數據抓取、機器學習領域中風頭無二的語言,但在集成電路中使用比較少見。
5)運算性能:
- csh: 低
- TCL: low
- Perl: 挫
- Python :
之前寫過一個腳本需要大量的排序等操作,電路規模一大,慢如牛,換成python速度提高20倍。它的底層是為科學計算,用C優化過的,非常強勁。
綜上所述: Python在這個領域,高帥富,無人撼動。
3. 總結:
不知道大家有沒有看過「降臨」,講的是一幫「外星人」來到地球給蠻荒的人類帶來新的科技。而他們選的方式竟然是教授一門「語言」。(腦洞挺大,推薦大家看看)其實從語言的設計的美來看,來源於它所面對的應用,來源於對解決的問題的思維方式。
比如你在學習TCL時,就能感覺到TCL語言的死板,而這種死板正決定了它適合於做flow。而在學習Perl的時候就能感覺到他的靈活,這種的靈活使它更加適合做成一門「膠水語言「。在學習Python的時候你會覺得它的設計有點反人類,但正是這種反人類會改變我們的思維習慣,而真正的去從數學的方面思考問題。
本文對四種腳本語言的總結,請參照下表
4. 個人觀點:
其實要做任何一件事情,使用任何一種語言都可以實現,只是在實現難度,性能上面有些不同。
如果讓我來建議微電子的應屆大學生學習一門語言,我推薦首選TCL,因為在今後的工作中會經常遇到(數字後端用的更加頻繁),而且他的學習比較簡單,做為語言學習的開路石,也比較適合。然後,如果有更多的時間,學習一下Perl,體驗一下他的靈活,同時在已後的電路設計(前端設計)當中也會碰到大量的應用。
作為一個集成電路設計工程師,Python非常有趣,用Python寫過股票分析軟體,搶紅包軟體,自動布局軟體,圖片加解密軟體等。
最後,有興趣的同學歡迎參見我們最新的live"從零學習TCL腳本「,為微電子行業量身定做 :)。各位有空的話點個關注,點個贊哦,謝謝。同時之前的回答也是非常不錯哦。
--------------------------給自己live做個廣告---------------------------
---我們正在進行中的live
關於兩次腳本的live,我們將提供一些練習題,並在在每次live結束後的兩周內,為大家提供實時解答和討論。
1、從零學習 TCL 腳本 :知乎 Live - 全新的實時問答
2、TCL 腳本:數字 IC 設計應用篇:知乎 Live - 全新的實時問答
---我們的專欄
觀芯志:知乎專欄
---往期live
半導體先進工藝的器件結構和挑戰 : 知乎 Live - 全新的實時問答
你不了解的微電子行業 : 知乎 Live - 全新的實時問答
初學者在數字 IC 設計學習中易進入的誤區 : 知乎 Live - 全新的實時問答
perl和tcl最有用。tcl一般是工具語言,EDA工具都按這種格式下約束,tcl本身就是為了配合工具使用的,沒有太大的獨立價值。perl一般是黑科技,公司自己內部開發腳本,用來做一些極其強大的文字處理,減少重複性工作。比如修ECO,將小design整合成大design,自動跑各種隨機化的模擬,極其有用。tcl沒什麼語法,談不上掌握。perl需要認真學,越精通越好。其餘的語言不在IC生態圈內。
腳本用於執行重複操作,以提高效率。舉個例子來說,綜合後Design Compiler會生成許多Report,你可以寫一個腳本在不同的Report中抓取你需要的內容,最後生成一個報表。你只要看這個報表就可以大致知道這一次跑得怎麼樣。如果有問題,再去看具體的Report。
Perl, Python, Tcl/tk, awk/sed 之類的都很有用。Perl: 有同事熟悉Perl,用Perl編寫腳本在目錄里搜索含固定字元串的文件。然後所有AHB Backbone RTL代碼都是用Perl腳本自動生成的。
Python: 有同事喜歡Python。用Python解析XML,利用預定義模版生成UPF文件。Tcl/tk: 有一個同事喜歡用Tcl。他覺得clearcase原生命令不夠人性,用Tcl按照自己的習慣重新寫了一些命令。現在大家都在用。每個大模塊的DfT設定非常相似,所以所有DfT有關的代碼我們都用Tcl來生成,腳本也是這個同事寫的。tk是Tcl的圖形化界面。理論上你可以用它開發EDA工具。awk/sed/grep/shell script: 都很有用。如果可以用awk/sed/grep/shell script實現的,我就不想寫Perl/Tcl/Python。腳本語言是工具,幫助我們提高效率。上面提到的例子都是前端的,掌握到什麼程度看個人。個人認為在IC前後端都需要一定的腳本能力,而且越強,自動化效率越高,工作效率也就更高。---------------------------------------打個比方吧,可以把IC工作看成是耕地,把腳本看成是頭小牛。當你沒有牛的時候,你只能自己一鋤頭一鋤頭耕地;有了小牛,你可以讓他配合你耕地,取代一部分人的體力工作;而且牛餵養的越壯實,乾的活越多,你的耕地效率就越高,你也更輕鬆一點;
當牛養到了足夠大,足夠壯的時候,甚至可以將它變賣掉,然後入台小型機械耕地機,將你的耕地效率提高到一個新的層面。
perl不會的話,題主的工作效率肯定很低
把正則表達式練好
perl/tcl/python 三者中通一個就可以了。核心東西差不多的。
這個主要是為後端和驗證服務的,前端基本不需要。當然掌握了顯然是對能力很有幫助的。
掌握script 語言至少在後端來說,是從優秀到卓越的必備一步。
你想更高效更正確做後端,一定要學啊。掌握到能熟練應用的水準。
perl的功能很強大,但是初學時,對於IC設計前端來說掌握shell就夠了。shell要比perl容易掌握,而且功能也足夠對付前端設計甚至驗證所遇到的問題。所以,強烈建議先從shell腳本開始。另外awk只是shell中的一個命令而已,不是一門語言。
還是個學生,說說平時對於這些語言的應用。python:因為上手簡單,庫的種類比較全,適合完成各種需求。比如做模擬的時候,因為需要input的信號過多,拿python生成對應的文本。畫layout的時候,拿python生成對應的skill文件(skill實在是懶得學了,所以直接用python生成簡單的只有地址和命令的skill)。因為我要做一種近似於圓形的image sensor,如果不用腳本,一點一點畫的畫簡直是噩夢。另外就是用python的matplotlib畫模擬和測定結果的圖。至於tcl,會使CAD軟體的使用更便利一些,我最近在做一些關於器件的模擬,用到了TCAD,用tcl會很方便。
很多東西很多人都說到了,Perl,Tcl,Python和shell,其誕生的背景不同:
TCL:Tool Command Language
Tcl/Tk 的發明人 John Ousterhout 教授在八十年代初,是伯克利大學的教授。在其教學過程中,他發現在集成電路 CAD 設計中,很多時間是花在編程建立測試環境上。並且,環境一旦發生了變化,就要重新修改代碼以適應。這種費力而又低效的方法,迫使 Ousterhout 教授力圖尋找一種新的編程語言,它即要有好的代碼可重用性,又要簡單易學,這樣就促成了 Tcl (Tool Command Language) 語言的產生。
Perl:原名Pearl,現在一般都理解成Practical Extraction and Report Language(並非作者本意)
拉里·沃爾(Larry Wall)為了讓在UNIX上進行報表處理的工作變得更方便,決定開發一個通用的腳本語言,而在1987年12月18日發表。
Python:在數據分析領域大大有名,應該都聽說過。
Shell主要作用還是來和操作系統交互,這是它設計的初衷。
性能?大家的擅長地方不同,如果你要高性能,C語言寫出來的一般都是最直接最高效地。
掌握TCL為了什麼?和工具交互,由於TCL的特性,EDA工具多用TCL做為和用戶交互的語言。
掌握PERL為了什麼?處理Report,CPAN上有很多優秀的包可以使用,當然你自己也可以寫出優秀的包,造輪子給大家用。
掌握SHELL為了什麼?如果你的Job是Run在伺服器上的,要管理伺服器,要驗證,要...SHELL當然很有用。
所以,術業有專攻,編程語言也是,掌握程度看你從事什麼崗位,比如前端,那麼其實SHELL少一點,TCL,PERL多一點。如果你是管理License,管理伺服器的,SHELL要比較熟練,其他也要懂,很多log要處理。
Perl在驗證中,有獨特的作用。可以生成整個驗證環境,比如Easier UVM。如果你download下這個的話,會發現就是用Perl寫的。
另外,Perl在處理文本方面,簡直不要太強,可以用來寫一些模擬約束,還有就是流程管理,可以做log文件的過濾,回歸case,以及自動發送回歸的結果郵件。還可以打發時間。
GitHub - stephen0921/move2048: Game 2048 written in Perl script.又整理了一個新的東東。stephen0921/org_verilog/站在一個數字前端設計的角度,perl有強大的文字處理能力,在一些規模較大的項目中用於生成一些公共組件的代碼,例如CRG,memory wrapper等,但是由於perl可讀性實在太差平時我習慣用python代替perl,部門內部甚至還出現過罷黜perl獨尊python的呼聲。tcl更多的是用於板級調試時,控制測試儀等設備完成自動化測試,所以用到的語法也最簡單可以現學現用。最後補充一個VBA語言,配合上excel的強大能力真是減少工作量(偷懶)的利器。
做SOC的話前端script是必備技能。相對來說我喜歡python。tcl面還是太窄了但是有時候你不得不跟他打交道。perl寫起來非常方便,也特別擅長處理文本和正則式。圈子裡用它的人最多。但是perl可維護性太差,名副其實的一次性語言。寫這個就是給自己以後埋雷。python雖然麻煩點,但是可維護性強。處理一些現代的文件比如xml,exel也更方便。
前端不了解,後端做驗證一定要用腳本的吧。比如每個IC process都會有幾百頁pdf的design rule manual,以及與之對應的純文本文檔(design rule deck),怎麼樣才能把其中的信息提取出來驗證你的layout有沒有meet這些rules?只能用script。再比如將小的design pack成大的design的時候,只有用script操作才能滿足高效和正確性的要求。我們公司有個老印,十幾年前給公司寫了大量的這類實現自動化的腳本,所以現在生活非常自在,經常回印度老家呆著,因為公司也離不了他。
當然有作用!perl極為擅長文本處理,在驗證、後端應用都很多,掌握他對你提高工作效率百益無一害。再者,技多不壓身,腳本語言必須會一種,要在圈裡混好的話
EDA工具內部都是tcl。這部分基本上一半是tcl的特性,一半是工具自己(比如DC,Encounter,Modelsim。。。)的關鍵詞語句。
各個流程的連接是csh和perl。很多人說perl做字元匹配強大。我勸有能力選擇千萬不要用,維護起來累死人,而且弄到後來誰都不想碰。簡單用途就直接用csh吧。基本和unix的命令行一樣。這個裡面有grep,sed,awk是比較常用的。
有選擇的話,一定要用python。介面規範,維護方便,功能強大。雖然代碼長度變大了。但是真的好用。如果要比速度,我寧願寫20行python,也不願寫1行perl。我不能想像用過的netlist解析器用其他語言會多麼的複雜。
何況學好python還方便轉碼農你說是么。
沒有多難不要怕,學學就會,對工作幫助倒是挺大的。個人感覺。
個人感覺是根據需要實現功能的複雜度,從複雜到簡單,依次選取Python ,perl,shell.至於tcl,印象中大部分人用它都是因為工具兼容性,不得不用它。通常我們是複雜的邏輯使用Python 和perl實現,然後工程師使用時在外面用shell包一個殼子,以實現功能的擴展。基本就是簡單的功能用shell,複雜的功能用shell調用Python 和perl來實現。
關於Python 和perl,如果寫一個程序會被長期使用,並且可能需要多人維護,那麼強烈建議使用Python ,perl的可讀性實在是個問題。而且有的公司可能會有搭建一套完整的設計驗證平台,這種時候Python 是首選,因為可以使用Python 開發web程序的一些常用框架,方便的實現很多功能,使得程序更加好用。同時很多工程師有個奇怪的現象,老喜歡在代碼中寫非常複雜的哈希結構,而且通常是一層套一層的,看的人會覺得特別費解,與此同時還覺得這是水平高的體現,殊不知代碼的可讀性也是一個人代碼能力的體現。使用Python能減輕這個問題。
另外,強烈推薦多學學Python ,作為一個工程師,我表示這門語言學了絕對是值得的,因為它能做的事情實在是太多太多。相對而言,perl主要還是擅長做基本的文本處理,用途較單一。推薦閱讀:
※怎樣學好模擬集成電路設計?就Allen的那本,還有拉扎維的那本。?
※數字IC設計,有必要自己造輪子么?
※開關電源的嘯叫原因是什麼?
※IC後端工程師如何轉為IC前端工程師?
※IC驗證工程師心得有哪些?