Verilog到底能不能算是程式語言?

2021-02-13 矽農
知乎上刷到一個問題,問性能最強的程式語言是什麼?看到高贊回答到是Verilog,然後在評論區就引發了一場Verilog到底算不算程式語言的爭論,我覺得比較有意思,所以就也打算嘮嘮這個事情。

趁著最近奇葩說正播,本篇文章試著用辯論的形式來討論一下這個問題。正反兩方,正方:Verilog當然算程式語言,反方:Verilog不能稱為程式語言。接下來,有請雙方立論。正方先開始。

正方

Verilog當然算是程式語言,首先我們來看看什麼叫程式語言。根據維基百科,最早的程式語言是在電腦發明之前,當時是用來控制提花織布機及自動演奏鋼琴的動作。所以並不是說在計算機體系結構上跑的才能叫程式語言,你做一段可以自動彈棉花的動作,規定規則(語法)和含義(語義),這就可以稱為一段程式語言。再來看Verilog,符合程式語言描述的語法和語義,然後通過綜合(編譯)生成bit流文件,下載到FPGA上,FPGA根據這個bit流文件,然後將內部的LUT、D觸發器等基本單元任意組合實現組合電路和時序電路。最終使FPGA能實現各種硬體功能。請問這樣還不算程式語言算什麼?這是我方的第一個論點。

再來,我準備了一頁PPT,請看下面這張圖,

網站連結在這裡https://www.tiobe.com/tiobe-index/

這是TIOBE公司公布的1月全球最流行程式語言排行榜,可以看到Verilog還沒有排到前50 ,但是沒關係,Verilog上榜了,權威機構都說明了,所以Verilog作為程式語言,還有什麼需要爭論的。這是我方第二個論點。

再來,剛才我在前面提到了FPGA,FPGA的全稱是什麼,Field Programmable Gate Array,現場可編程邏輯門陣列,看到沒有——可編程,那麼它對應的程式語言是啥,就是Verilog。我們很多理工科專業的朋友在學校或多或少都接觸過FPGA。可以說在FPGA上你可以用Verilog寫出任何數字電路,但是這個編程的過程也是非常漫長和枯燥的,因為你要從最小一個門,一個D觸發器開始搭建,然後要進行漫長的仿真調試,才能實現最終一個硬體功能。為什麼設計起來這樣累的語言還一直被我們使用,因為它是目前我們設計電路最主流、流程最完善、PPA權衡最好的語言,如果說有人問?目前性能最強的程式語言是什麼,那麼我一定回答是Verilog,因為沒有哪個語言的運行速度能跑得快FPGA和ASIC。

反方

OK,別著急,我們慢慢來,都在射程範圍之內,都在射程範圍之內。

剛才,對方一直不斷重複Verilog,Verilog,但是卻沒有說全Verilog的全稱是什麼,Verilog HDL,HDL是什麼,不是Hardware Design Language硬體設計語言,是Hardware Description Language硬體描述語言。看到沒有,Verilog在定義時在名稱上就說的明明白白,它是硬體描述語言,而不是程式語言。

再來,對方第二個論點,舉例了一個TIOBE的最流行程式語言排行榜,說上面有Verilog,覺得這就是權威,從而得出結論,說Verilog是程式語言。首先,我方相信這個排行榜的流行準確性,但是你要知道這個排行榜是否會真的去研究Verilog到底能不能歸類到程式語言範疇的這個問題?因為這個排行榜真正在意的重點是語言的受歡迎程度,而不是語言的準確分類。如果今天有一個排行榜,來公布的是最流行的硬體描述語言的話,我相信排在第一第二的肯定是VHDL和Verilog HDL。所以我方認為對方的第二個論點不成立。

至於對方所提到的第三點,FPGA全稱是現場可編程邏輯門陣列,但是這裡的可編程應該理解為可更改的意思,而並不是Verilog對它進行編程。用Verilog描述的電路可以運行在FPGA上,意味著這個電路是可更改,可擦除的。

對方最後提到的Verilog是性能最強的程式語言,我認為這樣和其他程式語言做比較,完全就是在作弊,因為程式語言都是最終被編譯成二進位指令,運行在電路上的,Verilog就是電路本身。沒有人能快過電路本身。

我們把程式語言寫出來的代碼叫程序,程序是什麼?在計算機中程序就是控制計算機的指令。HDL寫出來的代碼叫什麼?好像也不能直接叫程序,因為從某種意義上它只是電路的一種描述形式,它可以說就是計算機、就是電路。所以用Verilog寫的代碼只能叫代碼,不能叫程序。這是Verilog和程式語言的本質區別。

最後,這道題目我們在討論的是什麼,我們在討論的是程式語言嗎?不是,這道題目我們最終要討論的是,你在寫Verilog的時候,是否心中有電路。我們在寫Verilog時,是在做一個電路設計,Verilog只是作為一個工具,幫我們將腦海構思的設計、電路給實現出來。況且你寫代碼的時候,不僅心中要有電路,而且還得寫下來,畫出來,然後照圖施工。如果你真的清楚的知道自己是在做什麼,而不是利用現有積累的語法規則和方法去實現一定的功能的時候,你就不會提出這個問題。因為你清楚,我這不是在編程,我這是在描述硬體,我是在設計電路。綜上,我方認為Verilog不是程式語言,它是硬體描述語言。

最後

Verilog是一種硬體定義語言。程式語言通常被理解為用於告知現有硬體要做什麼的語言,而不是直接用於描述硬體的語言,即使在維基百科和各大網站會把Verilog歸類到程式語言當中,廣義上來說程式語言的範疇甚至在計算機出現之前,硬要這麼歸類,也沒問題。但是我認為我們學習、使用Verilog的朋友,必須要區分開軟硬體的差異。用Verilog寫代碼不叫編程,那叫描述電路。

關於這個問題,你還有什麼見解,歡迎評論區留言。

Reference

維基百科——Verilog、FPGA、程式語言、程式語言列表

相關焦點

  • 可編程邏輯培訓——Verilog 語言基礎
    ;6、always過程塊描述組合邏輯,應在敏感信號表中列出所有的輸入信號;7、所有的內部寄存器都應該可以被復位;8、用戶自定義原件(UDP元件)是不能被綜合的。一:過程性賦值語句中的任何延時在綜合時都將忽略。建議同一個變量單一地使用阻塞或者非阻塞賦值。3、邏輯操作符:邏輯操作符對應於硬體中已有的邏輯門,一些操作符不能被綜合:===、!==。4、算術操作符:Verilog中將reg視為無符號數,而integer視為有符號數。
  • FPGA之程式語言verilog
    數字電路系統的設計者利用這種語言可以從上層到下層(從抽象到具體)逐層描述自己的設計思想,用一系列分層次的模塊來表示極其複雜的數字系統。然後利用電子設計自動化(以下簡稱為EDA)工具逐層進行仿真驗證,再把其中需要變為具體物理電路的模塊組合經由自動綜合工具轉換到門級電路網表。接下去再用專用集成電路(ASIC)或現場可編程門陣列(FPGA)自動布局布線工具把網錶轉換為具體電路布線結構的實現。
  • FPGA程式語言——verilog語法
    Verilog HDL既是一種行為描述的語言也是一種結構描述的語言。這也就是說,無論描述電路功能行為的模塊或描述元器件或較大部件互連的模塊都可以用Verilog語言來建立電路模型。如果按照一定的規矩編寫,功能行為模塊可以通過工具自動地轉換為門級互連模塊。Verilog模型可以是實際電路的不同級別的抽象。
  • 通過點燈的邏輯體驗FPGA的編程流程以及Verilog語法基礎
    「點燈」是我們板農們拿到一塊板子後第一個要實現的目標,正如軟體工程師嘗試新的語言必然會先寫出「hello world」一樣。
  • Verilog代碼轉VHDL代碼經驗總結
    語言和VHDL語言是兩種不同的硬體描述語言,但並非所有人都同時精通兩種語言,所以在某些時候,需要把Verilog代碼轉換為VHDL代碼。你已經習慣某種語言,也發現語言不是學習FPGA時需要考慮的問題,它僅僅是硬體描述語言工具而已。可是,當你發現一份和你使用語言不同的代碼作為參考時,你又開始想:我以後的工作是不是要二種語言都會,這樣工作才會得心應手?事實上,兩種語言之間是可以相互轉換的。
  • Python,你到底是什麼程式語言?
    之前說了很多Python的一些基本認識,那今天,我們來聊聊,她到底是什麼程式語言:python是什麼程式語言程式語言主要從以下幾個角度為進行分類,編譯型和解釋型、靜態語言和動態語言、強類型定義語言和弱類型定義語言,每個分類代表什麼意思呢
  • verilog語言與c語言的區別
    這是因為C語言在Verilog設計之初,已經在許多領域得到廣泛應用,C語言的許多語言要素已經被許多人習慣。一種與C語言相似的硬體描述語言,可以讓電路設計人員更容易學習和接受。不過,Verilog與C語言還是存在許多差別。另外,作為一種與普通計算機程式語言不同的硬體描述語言,它還具有一些獨特的語言要素,例如向量形式的線網和寄存器、過程中的非阻塞賦值等。
  • ​verilog相關基礎知識
    對於verilog基礎知識,這裡做簡單的介紹,對於已經熟悉verilog語言的讀者可以省略不看此部分。
  • 程式語言與並發性之間到底有沒有關係?
    ,程式語言的更新迭代本是家常便飯,各家粉絲的口水戰也是見怪不怪,但有一位網友的評論卻激起了千層浪:  網友子子叔:java跑來跑去需要虛擬機,java虛擬機是用什麼語言寫的你不知道嗎?  網友尼古拉斯曉哲:java底層是用什麼實現的?還不是C和C++嗎?你用Java做成本要高不知道多少倍好不啦!  那麼,問題來了:程式語言和並發性之間到底有沒有關係?可以說一門程式語言在語言層面支持並發性嗎?這裡的並發性又指什麼呢?
  • 關於學習verilog
    我們在做詳細設計的時候,對於一些信號的時序肯定會做一些調整的,但是這種時序的調整最多只能波及到本一級模塊,而不能影響到整個設計。記得以前在學校做設計的時候,由於不懂得設計時序,經常因為有一處信號的時序不滿足,結果不得不將其它模塊信號的時序也改一下,搞得人很鬱悶。
  • matlab是什麼程式語言?matlab是程式語言嗎
    MATLAB可以進行矩陣運算、繪製函數和數據、實現算法、創建用戶界面、連接其他程式語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。二、matlab是程式語言嗎?嚴格的來說matlab不算是程式語言。只有你有C語言的基礎,Matlab就很容易。
  • 零基礎教你學FPGA之Verilog語法基礎(下)
    與任務不同,函 數具有返回值,而且至少要有一個輸入變量,而且在函數中不能使用延遲、事件和時序控制結構,函數可以條用函數,但是不能調用任務。  (2)在聲明函數時,系統會自動的生成一個寄存器變量,函數的返回值通過這個寄存器返回到調用處。
  • PLC的5種程式語言
    使用中也常將這些「軟繼電器」稱為編程元件。有一個假想的「概念電流」或「能流」(Power Flow)從左向右流動,這一方向與執行用戶程序時的邏輯運算的順序是一致的。能流只能從左向右流動。利用能流這一概念,可以幫助我們更好地理解和分析梯形圖。梯形圖兩側的垂直公共線稱為母線(Bus bar),。
  • 最常用的PLC程式語言和編程方法詳解
    IEC 1131-3的程式語言是IEC工作組對世界規模的PLC廠家的程式語言合理地吸收、學習的基礎上構成的一套針對工業操控體系的世界程式語言規範,它不光適用於PLC體系,並且還適用於更廣泛的工業操控範疇,為PLC程式語言的全球規範化做出了重要的奉獻。
  • HDLBits:在線學習Verilog(七 · Problem 30-34)
    解答與分析// synthesis verilog_input_version verilog_2001module top_module( input a, input b, input sel_b1, input sel_b2, output wire out_assign,
  • stm32用什麼語言編程
    程式語言(programming language),是用來定義電腦程式的形式語言。例如移動、自增,因此彙編源程序一般比較冗長、複雜、容易出錯,而且使用彙編語言編程需要有更多的計算機專業知識,但彙編語言的優點也是顯而易見的,用彙編語言所能完成的操作不是一般高級語言所能夠實現的,而且源程序經彙編生成的可執行文件不僅比較小,而且執行速度很快。   高級語言是大多數編程者的選擇。
  • 滿足哪些條件才算是真正掌握了一門程式語言
    隨著當今社會逐漸進入到智能化時代,學習一門程式語言已經成為了很多學生和職場人的常見選擇,由於程式語言的學習具有一定的難度,所以一定要制定一個系統的學習計劃,而且要有一個明確的學習目標。按照歷史經驗來看,學習程式語言一定要有一定的連續性,直到完全掌握一門程式語言,很多人在學習到一半的時候就停止學習了,或者是並不知道應該達到一種什麼樣的學習目標,這是普通人學習程式語言比較常見的問題。通常情況下,真正掌握一門程式語言,應該滿足以下幾個方面的要求:第一:全面了解程式語言的基本語法。
  • 哪種程式語言更適合初學者!
    編程初學者先學什麼這是一個讓很多計劃學習編程的學生糾結的問題,會有人說到高大數據離不開JAVA啦,搞人工智慧離不開Python啦等等。說的都沒有錯,那到底如何選擇呢?事實上,很難想像一名合格的程式設計師只掌握了一種程式語言,因為大型項目都不是某一種語言獨立擔當的。多數程式設計師都是掌握了多種語言,按需使用的。所以入門時學習那種語言不是那麼重要,因為當熟練掌握了一種語言後,再學習其他語言會容易得多。當然既然大家都有選擇方面的問題,小編也給出了以下的建議。
  • 兒童編程的語言規律
    隨著少兒編程的浪潮,用什麼專業語言成了很多教學機構和老師們的所要思考的問題,格物斯坦表示:任何一門高科技的表達都是很神聖且科學化的範疇。兒童身為祖國的未來,對編程技能壓機掌握的爐火純青才算是學會了。很多兒童編程教育機構喜歡拿比爾蓋茨啊,拉裡佩奇啊,謝爾蓋布林、扎克伯格的編程經歷當宣傳內容。太遙遠太不現實,同時,也別聽什麼程式語言未來會怎樣怎樣,事實上絕大數的碼奴的日子並不是大家想像的那麼舒坦,那麼光鮮。家長們要知道,兒童學習編程教育,不是真正的學如何敲代碼,而是算計算機思維。
  • 編程入門第一問:哪個語言最適合自己?
    可能有各種各樣五花八門的原因,但我猜肯定有以下幾種:● 信息化時代,覺得編程是趨勢,想了解一下,學會也算是多了一項技能,當個「斜槓青年」也行啊!目前已知的程式語言就有600多種,主流程式語言也有十幾種,而你獲得的建議也是五花八門:❶前端簡單,成就感強,往後學能前後端通吃,現在也到處缺人呢~❷人工智慧是以後的趨勢,現在 Python 挺吃香的,發展肯定好!