1.1 傳統的數字系統設計方式—原理圖設計 在傳統的設計方法中,當設計工程師設計一個新的硬件、一個新的數字電路或一個數字邏輯系統時,他或許在CAE 工作站上做設計,為了能在CAE工作站做設計,設計者必須為設計畫一張線路圖,通常地,線路圖是由表示信號的線和表示基本設計單元的符號連在一起組成線路圖,符號取自設計者用于構造線路圖的零件庫。若設計者是用標準邏輯器件(如74系列等)做板極設計線路圖,那么在線路圖中,符號取自標準邏輯零件符號庫;若設計是進行ASIC設計,則這些符號取自ASIC庫的可用的專用宏單元。這就是傳統的原理圖設計方法。對線路圖的邏輯優化,設計者或許利用一些EDA工具或者人工地進行邏輯的布爾函數邏輯優化。為了能夠對設計進行驗證,設計者必須通過搭個硬件平臺(如電路板),對設計進行驗證。 1.2 硬件語言描述方式—verilog 隨著電子設計技術的飛速發展,設計的集成度、復雜度越來越高,傳統的設計方法已滿足不了設計的要求,因此要求能夠借助當今先進的EDA工具,使用一種描述語言,對數字電路和數字邏輯系統能夠進行形式化的描述,這就是硬件描述語言。硬件描述語言HDL(Hardware Description Language )是一種用形式化方法來描述數字電路和數字邏輯系統的語言。數字邏輯電路設計者可利用這種語言來描述自己的設計思想,然后利用EDA工具進行仿真,再自動綜合到門級電路,最后用ASIC或FPGA實現其功能。舉個例子,在傳統的設計方法中,對2輸入的與門,我們可能需到標準器件庫中調個74系列的器件出來,但在硬件描述語言中,“&”就是一個與門的形式描述,“C = A & B”就是一個2輸入與門的描述。而“and ”就是一個與門器件。硬件描述語言發展至今已有二十多年歷史,當今業界的標準中(IEEE標準)主要有VHDL和 Verilog HDL 這兩種硬件描述語言。 Verilog HDL 語言最初是于1983 年由Gateway DesignAutomation 公司為其模擬器產品開發的硬件建模語言。那時它只是一種專用語言。由于他們的模擬、仿真器產品的廣泛使用,Verilog HDL 作為一種便于使用且實用的語言逐漸為眾多設計者所接受。在一次努力增加語言普及性的活動中,Verilog HDL 語言于1990 年被推向公眾領域。Open Verilog International(O V I )是促進 Verilog 發展的國際性組織。1992 年,OVI 決定致力于推廣Verilog OVI 標準成為IEEE 標準。這一努力最后獲得成功,Verilog 語言于1995 年成為IEEE 標準,稱為IEEE Std1364-1995 。完整的標準在Verilog 硬件描述語言參考手冊中有詳細描述。 Verilog HDL即verilog硬件硬件描述語言,它主要應用于數字電路和系統設計、數字電路和系統仿真等,即利用計算機和相關軟件對VERILOG HDL等硬件語言建模的復雜數字電路設計進行仿真驗證,再利用綜合軟件將設計的數字電路自動綜合,以得到符合功能需求并且在相應的硬件結構止可以映射實現的數字邏輯網表,然后布局布線,根據網表和選定的實現器件工藝特性自動生成具體電路,同時軟件生成選定器件的延時模型,經過仿真驗證確定無誤后,用來制造ASIC芯片或者寫入FPGA和CPLD器件中,最終實現電路設計。 Verilog HDL 語言具有下述描述能力:設計的行為特性、設計的數據流特性、設計的結構組成以及包含響應監控和設計驗證方面的時延和波形產生機制。所有這些都使用同一種建模語言。此外,Verilog HDL 語言提供了編程語言接口,通過該接口可以在模擬、驗證期間從設計外部訪問設計,包括模擬的具體控制和運行。 Verilog HDL 語言不僅定義了語法,而且對每個語法結構都定義了清晰的模擬、仿真語義。因此,用這種語言編寫的模型能夠使用Verilog 仿真器進行驗證。語言從C 編程語言中繼承了多種操作符和結構。Verilog HDL 提供了擴展的建模能力,其中許多擴展最初很難理解。但是,Verilog HDL 語言的核心子集非常易于學習和使用,這對大多數建模應用來說已經足夠。當然,完整的硬件描述語言足以對從最復雜的芯片到完整的電子系統進行描述。 2 綜合器和仿真器 Verilg是硬件描述語言,顧名思義,就是用代碼的形式描述硬件的功能。而我們最終是要在電路上實現該功能的。當Verilog描述出硬件功能后,我們需要綜合器對Verilog代碼進行解釋,將代碼轉化成實際的電路來表示,最終實際的電路,我們稱之為網表。這種將Verilog代碼轉成網表的工具,就是綜合器。上圖左上角是一份verilog代碼,該代碼描述了一個加法器功能。該代碼經過綜合器解釋后,轉化成一個加法器電路。QUARTUS、ISE和VIVADO都是綜合器,集成電路常用的綜合器是DC。 我們在FPGA設計的過程中,不可避免會出現各種BUG。如果我們編寫好代碼,綜合成電路,燒寫到FPGA后,才看到問題,此時去定位問題就會非常地困難了。在綜合前,我們可以在電腦里對代碼進行仿真測試一下,把BUG找出來解決,最后才燒寫進FPGA。我們可以認為,沒有經過仿真驗證的代碼,一定是存在BUG的。 為了模擬真實的情況,我們需要編寫測試文件。該文件也是用verilog編寫的,描述了仿真對象的輸入激勵情況。該激勵力求模仿最真實的情況,產生最將近的激勵信號,將該信號的波形輸入給仿真對象,查看仿真對象的輸出是否與預期一致。 為了做仿真驗證,我們編寫了測試文件。將測試文件和被測試對象加入到仿真器中。仿真器對測試文件和被測試對象的代碼進行解釋。根據測試文件,產生測試激勵,輸入給被測試對象;根據補測試對象的代碼,產生被測試對象的輸出。需要注意的是,在仿真過程中,沒有將代碼轉成電路,仿真器只是對代碼進行仿真驗證。至于該電路是否可轉成電路,仿真器是不關心的。 常用的仿真器是MODELSIM和VCS等。 由此可見,verilog的代碼不僅可以描述電路,還可以用于測試。事實上,Verilog定義的語法非常之多,但絕大部分都是為了仿真測試來使用的。只有少部分才是用于電路設計,詳細可以參考本書的“可綜合邏輯設計”一節。 Verilog中用于設計的語法,才是學習的重點。掌握好設計的語法,熟練應用于各種復雜的項目,這是技能的核心。其他測試用的語法,需要時查找和參考就已經足夠了。 本書著重點,是用于本科、研究生的教學用途,因此將重點講解設計用的語法。 3 Verilog HDL 基本語法 本節介紹Verilog HDL 語言的一些基本要素,包括標識符、注釋、格式、數字值集合、兩種數據類型、運算符和表達式和一些基本的語句如IF語句等。 3.1 標識符 verilog HDL的源文本文件是由一串詞法標識符構成的,一個詞法標識符包含一個或若干個字符。源文件中這些標識符的排放格式很自由,也就是說,在句法上間隔和換行只是將這些標識符分隔開來并不具有重要意義,轉意標識符除外。 verilog HDL語言中詞法標識符的類型有以下幾種:間隔符、注釋符、算子、數值、字符串、標識符、關鍵詞。 接下來對這些標識符一一進行說明 3.1.1間隔符 間隔符包括空格字符,制表符,換行以及換頁符。這些字符除了起到與其它詞法標識符相分隔的作用外可以被忽略。 注意的是,在“字符串”中的空白和制表符會被認為是有意義的字符。 3.1.2注釋符 Verilog HDL 中有兩種注釋的方式:單行注釋和段注釋(多行)。 單行注釋以兩個字符“//”起始,以新的一行作為結束。也就是注釋一行。 段注釋是以“”結束,在兩個符號之間的語句都是注釋語句,因此可擴展到多行。如: 以上n個語句都是注釋語句。 段注釋不允許嵌套,在段注釋中單行注釋標識符“//”沒有任何特殊意義。 3.1.3算子 算子是由單個、兩個或三個字符組成的序列串,分別稱之為一元算子、二元算子和條件算子。它用在表達式中。 例如“|a”等都是一元算子。該例子是“a的所有比特相或”。假如a是三位信號并且值為011,則“|a”就是“0|1|1”等于1。 例如“a & b”、“a|b等是二元算子。該兩個例子分別是a與b按位相與、a與b按位相或。 例如“a==1?b:c”,則是條件算子。該例子是說“當a等于1時,選擇b,否則選擇c”。 3.1.4標識符 標識符是用戶在描述時給Verilog對象起的名字,用這個標識符來提及相應的對象。 標識符可以是字母、數字、$符和下劃線_字符的任意組合序列,但它必須以字母(a-z,A-Z)或下劃線(_)開頭,不能是數字或$符。后面可以是字母、數字或者_。例如abc_123,_abc等。非法命名如下_abc,24abc。 標識符最長可以是1023個字符。 標識符是區分大小寫的。例如sel和SEL是不同的標識符。 3.1.5關鍵字 Verilog HDL 定義了一系列保留字,叫做關鍵詞。這些關鍵字都有一定的用途。 a. 下表列出了語言中的所有保留字。 b. 注意只有小寫的關鍵詞才是保留字。例如,標識符always (這是個關鍵詞)與標識符ALWAYS(非關鍵詞)是不同的。 c. 在給信號命名時,不要用關鍵字。 3.1.6系統任務標識符 系統任務標識符:$,其中$表示引入一個語言結構,其后所跟的標識符是系統任務或系統函數的名稱。 系統功能可以執行不同的操作: ---實時顯示當前仿真時間($time) ---顯示/監視信號的值($display,$monitor) ---暫停仿真($stop) ---結束仿真($finish) 例: $monitor($time,”a=%b,b=%h”,a,b) 每次a或b信號的值發生變化,這一系統任務的調用負責顯示當前仿真時間,二進制格式的a信號和十六進制格式的b信號。 注意,系統任務還有很多,在此不一一列出。但系統任務一般用于仿真測試用途,讀者沒必要重點學習,在學習工作過程中,如果需要用到時,再查找一下就可以了。 注:(本博客連載的內容將出版成圖書,并將錄制視頻,免費公開學習,歡迎大家留意。本連載前面是基礎部分,與一般教材無異,后面是項目實踐,是本連載的特色。如果你有一定的基礎(能看懂verilog代碼即可),那么可跳過前面部分,直接學習后面的項目實踐。 本連載學習效果:不難看能懂代碼,還能知道每一行代碼怎么寫,怎么設計) |