Verilog

Verilog是一種用於描述、設計電子系統的1364號標準。Verilog能夠在多種抽象級別對數字邏輯系統進行描述：既可以在電晶體級、邏輯閘級進行描述，也可以在暫存器傳輸級對電路訊號在暫存器之間的傳輸情況進行描述。:18除了對電路的邏輯功能進行描述，Verilog程式碼還能夠被用於邏輯模擬、邏輯綜合，:3-7其中後者可以把暫存器傳輸級的Verilog程式碼轉換為邏輯閘級的網表，從而方便在現場可程式設計邏輯閘陣列上實現硬體電路，或者讓硬體廠商製造具體的專用積體電路。設計人員還可以利用Verilog的擴充套件部分Verilog-AMS進行類比電路和混合訊號積體電路的設計。發展歷史.1983年末，Gateway設計自動化公司的工程師創立了Verilogs。當時Gateway設計自動化公司還叫做自動整合設計系統完成了Verilog的主要設計工作。1990年，Gateway設計自動化被Cadence公司收購。1990年代初，開放Verilog國際成立，Verilog面向公有領域開放。1992年，該組織尋求將Verilog納入電氣電子工程師學會標準 。最終，Verilog成為了電氣電子工程師學會1364-1995標準，即通常所說的Verilog-95。設計人員在使用這個版本的Verilog的過程中發現了一些可改進之處。為了解決使用者在使用此版本Verilog過程中反映的問題，Verilog進行了修正和擴充套件，這部分內容後來再次被提交給電氣電子工程師學會。這個擴充套件後的版本後來成為了電氣電子工程師學會1364-2001標準，即通常所說的Verilog-2001。Verilog-2001是對Verilog-95的一個重大改進版本，它具備一些新的實用功能，例如敏感列表、多維陣列、生成語句塊、命名埠連線等。目前，Verilog-2001是Verilog的最主流版本，被大多數商業電子設計自動化軟體包支援。2005年，Verilog再次進行了更新，即電氣電子工程師學會1364-2005標準。該版本只是對上一版本的細微修正。這個版本還包括了一個相對獨立的新部分，即Verilog-AMS。這個擴充套件使得傳統的Verilog可以對整合的模擬和混合訊號系統進行建模。:255容易與電氣電子工程師學會1364-2005標準混淆的是加強硬體驗證語言特性的SystemVerilog的一個整合。2009年，IEEE 1364-2005和IEEE 1800-2005兩個部分合併為IEEE 1800-2009，成為了一個新的、統一的SystemVerilog硬體描述驗證語言。以模組為基礎的設計.描述複雜的硬體電路，設計人員總是將複雜的功能劃分為簡單的功能，模組是提供每個簡單功能的基本結構。設計人員可以採取“自頂向下”的思路，將複雜的功能模組劃分為低層次的模組。:58這一步通常是由系統級的總設計師完成，而低層次的模組則由下一級的設計人員完成。自頂向下的設計方式有利於系統級別層次劃分和管理，並提高了效率、降低了成本。“自底向上”方式是“自頂向下”方式的逆過程。使用Verilog描述硬體的基本設計單元是模組。構建複雜的電子電路，主要是透過模組的相互連線呼叫來實現的。模組被包含在關鍵字codice_1、codice_2之內。:59實際的電路元件。Verilog中的模組類似C語言中的函式，它能夠提供輸入、輸出埠，可以例項呼叫其他模組，也可以被其他模組例項呼叫。模組中可以包括組合邏輯部分、過程時序部分。例如，四選一的多路選擇器，就可以用模組進行描述。它具有兩個位選輸入訊號、四個資料輸入，一個輸出端，在Verilog中可以表示為：module mux (out, select, in0, in1, in2, in3);output out;input [1:0] select;input in0, in1, in2, in3;//具體的暫存器傳輸級程式碼endmodule設計人員可以使用一個頂層模組，透過例項呼叫上面這個模組的方式來進行測試。這個頂層模組常被稱為“測試平臺”。為了最大程度地對電路的邏輯進行功能驗證，測試程式碼需要儘可能多地覆蓋系統所涉及的語句、分支、條件、路徑、觸發、狀態機狀態，:141-144驗證人員需要在測試平臺裡建立足夠多的輸入激勵，:8並連線到被測模組的輸入端，然後檢測其輸出端的表現是否符合預期。例項呼叫模組時，需要將埠的連線情況按照這個模組宣告時的順序排列。這個頂層模組由於不需要再被外界呼叫，因此沒有輸入輸出埠：:4module tester;reg [1:0] SELECT;reg IN0, IN1, IN2, IN3;wire OUT;mux my_mux (OUT, SELECT, IN0, IN1, IN2, IN3); //例項呼叫mux模組，這個例項被命名為my_muxinitial //需要模擬的激勵程式碼beginendendmodule在這個測試平臺模組裡，設計人員可以設定模擬時的輸入訊號以及訊號監視程式，然後觀察模擬時的輸出情況是否符合要求，這樣就可以瞭解設計是否達到了預期。示例中的對模組進行例項引用時，按照原模組宣告時的順序羅列了輸入變數。除此之外，還可以使用或者採用命名埠連線的方式。使用這種方式，埠的排列順序可以與原模組宣告時不同，甚至可以不連線某些埠：mux my_mux (.out(OUT), .select(SELECT), .in0(IN0), .in1(IN1), .in2(IN2), .in3(IN3));//使用命名埠連線，括號外面是模組宣告時的埠，括號內是實際的埠連線//括號外相當於C語言的形式引數，括號內相當於實際引數endmodule上面所述的情況是，測試平臺頂層模組的測試變數直接連線了所設計的功能模組。測試平臺還可以是另一種形式，即測試平臺並不直接連線所設計的功能模組，而是在這個測試平臺之下，將激勵模組和功能模組以相同的抽象級別，透過線網相互連線。這兩種形式的測試平臺都可以完成對功能模組的測試。大型的電路系統，正是由各個層次不同模組之間的連線、呼叫，來實現複雜的功能的。:11語言要素.Verilog的設計初衷是成為一種基本語法與C語言相近的硬體描述語言。:18這是因為在Verilog設計之初，C語言已經在許多領域得到廣泛應用，C語言的許多語言要素已經被許多人習慣。一種與C語言相似的硬體描述語言，可以讓電路設計人員更容易學習和接受。不過，Verilog與C語言還是存在許多差別。另外，作為一種與普通計算機程式語言不同的硬體描述語言，它還具有一些獨特的語言要素，例如向量形式的線網和暫存器、過程中的非阻塞賦值等。總的來說，具備C語言能力的設計人員將能夠很快掌握Verilog硬體描述語言。基本規範.空白符.空白符是指程式碼中的空格，從而提高程式碼的可讀性。註釋.為了方便程式碼的修改或其他人的閱讀，設計人員通常會在程式碼中加入註釋。與C語言一樣，有兩種方式書寫註釋。第一種為多行註釋，即註釋從codice_6開始，直到codice_7才結束；另一種為單行註釋，註釋從codice_8開始，從這裡到這一行末尾的內容會被系統識別為註釋。某些電子設計自動化工具，會識別出程式碼中以特殊格式書寫、含有某些預先約定關鍵詞的註釋，並從這些註釋所提取有用的資訊。這些註釋不是供人閱讀，而是向第三方工具提供有關設計專案的額外資訊。例如，某些邏輯綜合工具可以從註釋中讀取綜合的約束資訊。:24大小寫敏感性.Verilog是一種大小寫敏感的硬體描述語言。其中，它的所有系統關鍵字都是小寫的。:29識別符號及保留字.Verilog程式碼中用來定義語言結構名稱的字元稱為識別符號，包括變數名、埠名、模組名等等。識別符號可以由字母、數字、下劃線以及美元符來表示。但是識別符號的第一個字元只能是字母、數字或者下劃線，不能為美元符，這是因為以美元符開始的識別符號和系統任務的保留字衝突。:19和其他許多程式語言類似，Verilog也有許多保留字，使用者定義的識別符號不能夠和保留字相同。Verilog的保留字均為小寫。:19變數型別中的codice_10、codice_11、codice_12等、表示過程的codice_13、codice_14等，以及所有其他的系統任務、編譯指令，都是關鍵字。可以查閱官方完整的關鍵字的列表。轉義識別符號.轉義識別符號等。資料型別.四值邏輯.上面列出了Verilog採用的具有八種訊號強度的四值邏輯，數位電路中的訊號可以用邏輯值、訊號強度加以描述。當系統遇到訊號之間的競爭時，需要考慮各組訊號的狀態和強度。如果驅動統一線網的訊號強度不同，則輸出結果是訊號強度高的值；如果兩個強度相同的訊號之間連線到同一個線網，將會發生競爭，結果為不確定值codice_22。:20線網與暫存器.Verilog所用到的所有變數都屬於兩個基本的型別：線網型別和暫存器型別。:30線網與我們實際使用的電線類似，它的數值一般只能透過連續賦值。如果未連線驅動源，則該線網變數的當前數值為codice_24，即高阻態。線網型別的變數有以下幾種：codice_10、codice_26、codice_27、codice_28、codice_29、codice_30、codice_31、codice_32、codice_33、codice_34、codice_23，其中codice_10作為一般的電路連線使用最為普遍，而其他幾種用於構建匯流排，即多個驅動源連線到一條線網的情況，:79-80或搭建電源、接地等。當進行模組的埠宣告時，如果沒有明確指出其型別，那麼這個埠會被隱含地宣告為codice_10型別。因此，在宣告輸出埠時應該注意是否有必要加上codice_11關鍵字。以下面的程式碼片段為例：module my_moule (out1, out2, in1, in2); //該模組具有兩個輸出埠output reg out1; //out1埠被宣告為為reg型別，它可以儲存當前值output out2; //out2埠隱含地被宣告為為wire型別，它的數值必須依賴連續賦值語句維持endmodule暫存器與之不同，它可以儲存當前的數值，直到另一個數值被賦值給它。在保持當前數值的過程中，不需要驅動源對它進行作用。如果未對暫存器變數賦值，它的初始值則為codice_22。Verilog中所說的暫存器型別變數與真實的硬體暫存器是不同的，它是指一個儲存數值的變數。如果要在一個過程，其中codice_11作為一般的暫存器使用最為普遍。利用暫存器變數的陣列，還可以對ROM進行建模。關於選擇線網型別還是暫存器型別，需要符合一定的規定。模組的輸入埠可以與外界的線網或暫存器型別的變數連線，但是這個模組輸出埠只能連線到外界的線網。再簡單點，就是在兩個模組的訊號連線點，提供訊號的一方可以是暫存器或者線網，但是接受訊號的一方只能是線網。:35-36此外，在codice_13、codice_14過程程式碼塊中賦值的變數必須是暫存器型別的，:58:30而連續賦值的物件只能是線網型別的變數。:81:81數字的表示.在Verilog裡，當一個變數的型別確定，即已經知道它是暫存器型別或者是線網型別，當把具體的數值賦值給它時，需要利用下面所述的數字表示方法。數字表示的基本語法結構為codice_49。:31其中，位寬是與資料大小相等的對應二進位制數的位數加上佔位所用0的位數，這個位數需要使用十進位制來表示。位寬是可選項，如果沒有指明位寬，則預設的資料位寬與模擬器有關；數制需要用字母來表示，codice_50對應十六進位制，codice_51對應十進位制，codice_52對應八進位制，codice_53對應二進位制。如果沒有指明數制，則預設資料為十進位制數。:18例如：如果某個數的最高位為codice_22或codice_24，那麼系統會自動使用codice_22或codice_24來填充沒有佔據的更高位。如果最高位為其他情況，系統會自動使用0來填充沒有佔據的更高位。向量.向量形式的資料是Verilog相對C語言較為特殊的一種資料，但是這種資料在硬體描述語言中十分重要。在Verilog中，標量的意思是隻具有一個二進位制位的變數，而向量表示具有多個二進位制位的變數。如果沒有特別指明位寬，系統預設它為標量。:21在真實的數位電路，例如將兩個四位二進位制數相加的進位加法器中，我們可以發現，其中一個數是透過四條電線。:22當然，如果沒有進行位選或域選，則這個多位數整體被選擇。向量的表示需要使用方括號，方括號裡的第一個數字為向量第一個分量的序號，第二個數字為向量最後一個分量的序號，中間用冒號隔開。向量分量的序號不像C語言的陣列一樣必須從0開始，不過為了和數字電路里二進位制數高低位的表示方法一致，我們常常讓最低位為0，當然這只是一種習慣。例如，上面提到的四位二進位制數用向量表示為：wire [3:0] input_add; //宣告名為input_add的4位wire型向量wire [4:1] input_add1; //也是4位wire型向量，但是分量序號從4到1wire [0:3] input_add2; //也是4位wire型向量，但是分量序號從0到3上面的向量宣告之後，我們就可以方便地選擇其中的某幾個分量進行操作。請注意用於域選的方括號的位置在向量名稱之後，方括號內的數字為所需的位數。例如我們可以進行以下操作：input_add [3] = 1'b1; //將1賦值給input_add向量的第三位input_add [1:0] = 2'b01; //將0和1分別賦值給input_add向量的第1、0位當對向量進行賦值時，如果右邊的數值位寬大於左邊的變數，則多出來的位被丟棄；如果右邊的數值位寬小於左邊的變數，則不夠的位用0填補。陣列.Verilog中的幾種暫存器型別的資料，:32包括codice_11、codice_12、codice_44、codice_45，以及由這幾種資料構成的向量，都可以構成陣列。宣告陣列時，方括號位於陣列名的後面，括號內的第一個數字為第一個元素的序號，第二個數字為最後一個元素的序號，中間用冒號隔開。如果陣列是由向量構成的，則陣列的其中某個元素是向量。同樣，出於習慣考慮，我們一般讓陣列第一個元素的序號為0，後面元素的序號依次遞增。此外，和C語言類似，使用者可以宣告多維陣列。例如：integer number [0:100]; //宣告一個有101個元素的整數陣列number [25] = 1234; //將1234賦值給25號元素reg [7:0] my_input [65535:0]; //宣告一個有65536個元素的8位向量暫存器my_input [97] = 8'b10110101; //將10110101分別賦值給97號元素的7至0位reg my_reg [0:3][0:4]; //宣告一個具有20個元素的二維暫存器陣列my_reg [1][2] = 1'b1; //將1賦值給上述二維陣列的第2行、第3列元素由於陣列和向量的表示都使用了方括號，因此使用時需要注意這個變數或向量的名稱在最初被宣告為何種型別的資料。上面第三行的例子是65536個8位向量組成的向量陣列，它可以描述一個64KB的儲存器。表示陣列某個元素時，允許使用變數來表示元素的索引，但是表示一個向量的一位或者幾位時，只允許使用數字來表示位的索引；此外，使用陣列時一次只能對一個元素進行操作，而不能向向量那樣同時對連續的幾個位進行操作，例如codice_63將一個四位二進位制數賦值給第65536個元素的高四位。:86引數.可以透過codice_64關鍵字宣告引數。引數與常數的意義類似，不能夠透過賦值運算改變它的數值。在模組進行例項化時，可以能夠透過codice_65，即引數過載語句塊來改變模組例項的引數。另一種方法是在模組例項化時，使用codice_66將所需的例項引數覆蓋模組的預設引數。區域性引數可以用codice_67關鍵字宣告，它不能夠進行引數過載。:25在設計中使用引數，可以使得模組程式碼在不同條件下被重複利用，例如四位數全加器和十六位數全加器可以透過引數例項化同一個通用全加器模組。:29字串.Verilog中的字串總體來說與C語言中的字串較為類似，其中每個字元以ASCII表示，佔8位。字串儲存在位寬足夠的向量暫存器中。字串中的空格、換行等特殊內容，以轉義識別符號的形式表示。流程控制.為了使設計人員方便地使用暫存器傳輸級描述，Verilog提供了多種流程控制結構，包括codice_68、codice_69、codice_70等形式的條件結構，codice_71分支結構，codice_72、codice_73迴圈結構。這些流程控制結構與C語言有著相似的用法。不同的迴圈結構可能造成不同的邏輯綜合結果。Verilog也提供了一些C語言中沒有的流程控制結構以適應硬體描述語言的需要，例如codice_74、codice_75兩種選擇結構，前者可以條件數值中的codice_22、codice_24均作為無關值，後者僅將codice_24作為無關值；:53:87-88此外還提供了codice_79、codice_80兩種迴圈結構，分別用於無限迴圈和指定次數迴圈。:56-65:109-126數位電路的邏輯功能描述常常使用到這些流程控制結構，例如，codice_71結構可以清晰地描述一個數據選擇器。運算子.Verilog的許多運算子和C語言類似，但是有一部分運算子是特有的，例如拼接運算子、縮減運算子、帶有無關位的相等運算子等。系統任務.系統任務可以被用來執行一些系統設計所需的輸入、輸出、時序檢查、模擬控制操作。:51-53所有的系統任務名稱前都帶有美元符號codice_9使之與使用者定義的任務和函式相區分。例如，codice_149用於顯示指定的字串，然後自動換行；codice_151用於監視變數，一旦被監視的變數發生變化，會顯示指定的字串；而codice_152可以提取當前的模擬時間。完整的列表請查閱參考工具、Verilog手冊或標準文件。編譯指令.Verilog具有一些編譯指令，它們的基本格式為codice_153，注意第一個符號不是單引號，而是鍵盤上數字1左邊那個鍵對應的撇號。常用的編譯指令有文字宏預定義codice_154、codice_155，它們的功能與C語言中類似，分別提供文字替換、檔案包含的功能。Verilog還提供了codice_156、codice_157等一系列條件編譯指令，設計人員可以使得程式碼在滿足一定條件的情況下才進行編譯。此外，codice_158指令可以對時間單位進行定義。:132詳細的編譯指令清單請關參考書籍。暫存器傳輸級描述.兩種過程.在Verilog中，可以宣告兩種不同的過程：always過程和initial過程。過程可以是包含時序的過程描述，而不包含時序的過程還可以表達組合邏輯。:170always過程從關鍵字codice_14開始，可以連續多次執行，當過程的最後一行程式碼執行完成後，再次從第一行程式碼開始執行。如果沒有使用系統任務codice_160，always過程將不斷迴圈執行。initial過程從關鍵字codice_13開始，它只能執行一次。:140-145一個模組中可以包含多個過程，各個過程相互之間是併發執行的。不過，過程不能夠巢狀使用。如果過程中有多個語句，則需要使用關鍵字codice_162、codice_163或codice_164、codice_165將它們組成一個程式碼塊。這兩種關鍵字組合代表著順序程式碼塊和並行程式碼塊，後面的部分會講述這兩種結構。例如，利用always過程迴圈執行的特點，可以為模組提供一個時間脈衝：initiala = 1'b0;always#1 a=~a;end雖然，always程式碼塊和codice_73語句、codice_79語句都能提供迴圈功能，但是always程式碼塊的迴圈更側重過程的迴圈執行，而後二者更側重程式碼的迴圈執行。因此，為了使程式碼更具條理，過程的迴圈應當用codice_14語句描述。當然，在實際使用過程中，強制使用其中的某一種在功能實現上都是可行的。暫存器變數的過程賦值.在Verilog中，有兩種賦值運算，一種叫做阻塞賦值，其運算子為codice_126。在順序程式碼塊中使用阻塞賦值語句，如果這一句沒有執行完成，那麼後面的語句不會執行；如果在順序程式碼塊中使用非阻塞賦值，則執行這一句的同時，並不會阻礙下一句程式碼的執行。:47而且，如果後一個語句涉及前面一個非阻塞賦值語句中的變數，由於這兩個語句“同時”執行，因此後一個語句所用到的是前面一個語句執行前變數的數值。非阻塞賦值是Verilog作為硬體描述語言與普通程式語言的一個重大區別。帶有兩個觸發器輸出端的簡單示例如下always @ (posedge reset or posedge clock)begina bigger_than_two; //如果a大於2，則事件bigger_than_two被觸發endalways @(bigger_than_two) //當bigger_than_two被觸發，執行下面的過程begin//過程的程式碼end一種經典的用法結構如下，可以理解為“在整個模擬過程中，一旦某變數發生變化，就執行某操作”：always @(a)beginx = x+1;end另一種用法稱為OR事件時序控制，其程式碼結構為codice_194或codice_195，即當codice_142或codice_53其中任意一個變數發生變化時，程式碼或程式碼塊才被觸發執行。監視的變數如果有3個，則其程式碼結構變為codice_198或codice_199，以此類推。如果需要監視的變數很多，則可以使用codice_200或codice_201，它表示對之後程式碼塊中的所有輸入變數敏感。此外，敏感列表中除了變數，還可以是前面所提到過的常規事件、命名事件。:87-89電平敏感時序控制.Verilog中還有一種電平敏感時序控制方式，即使用codice_202，當變數codice_142為真，則執行後面的程式碼塊。:69順序程式碼塊與並行程式碼塊.codice_162、codice_163組合代表了這個程式碼塊的各行程式碼是順序執行的，這種程式碼塊稱為順序程式碼塊；:66-67後面的codice_164、codice_165代表了這個程式碼塊的各行程式碼是併發執行的，這種程式碼塊稱為並行程式碼塊。:68-69與模組、過程不同，兩種程式碼塊是可以巢狀，即順序程式碼塊中可以包含並行程式碼塊。:69-72下面的例子展示了這兩種程式碼塊巢狀使用的效果：initialforkx = 1;y = 2;beginz = 3;w = 4;endjoin由於這個codice_13過程使用了關鍵字codice_164、codice_165，其中codice_22、codice_187、codice_24的賦值同時於系統零時刻發生，而codice_24和codice_215由於位於一個順序程式碼塊中，因此codice_215的賦值在codice_24的賦值後才進行。在使用並行程式碼塊的時候，有可能引起程式碼的競爭，例如兩個語句對一個變數同時進行賦值。雖然理論上兩個語句同時執行，但是具體的情況是必然有一句先執行，但這與順序語句塊的“先後”有本質區別。實際的先後順序取決於所用的模擬系統。:95這並不是Verilog硬體描述語言本身的缺陷，並行語句塊是一種人為設定的功能，這可以讓設計人員更容易地描述某些過程，當然他們必須認真考慮競爭帶來的潛在問題。任務和函式.如果某部分程式碼需要在不同地方多次使用，可以在模組中定義任務或函式。任務透過關鍵字codice_218來宣告。任務可以有零個或者多個輸入變數，但是沒有輸出返回值。呼叫任務時，將按照任務內指定的方式處理這些變數。由於它相當於一個子過程，因此任務中賦值的變數只能是暫存器型別的，而且只能使用過程賦值語句。任務可以具有時序結構，例如延遲、非阻塞賦值等。任務中可以呼叫任務和函式。:79與模組的宣告不同，任務的宣告沒有類似模組埠列表的輸入變數列表。儘管如此，呼叫任務的時候，還是需要在括號裡按照任務宣告時的順序羅列輸入變數。:57在某種程度上，任務和C語言中沒有返回值的函式有些類似。函式透過關鍵字codice_219來宣告。函式不僅有輸入變數，還有一個返回值作為輸出變數，這個返回值的名稱與函式的名稱相同。函式與任務不同，它是一個只有邏輯功能的部分，不能包含時序結構。函式中只能呼叫函式。:79Verilog中的函式與C語言中有返回值的函式有些類似。通常將函式放在賦值運算子的右邊，它的返回值被賦值給左邊的變數。如果任務或函式同時在多個地方被呼叫，則需要使用codice_220關鍵字宣告，這樣系統可以為不同地方的呼叫分配獨立的記憶體空間。:118:121-122邏輯閘級描述.邏輯閘級描述的抽象級別較低，僅次於電晶體級。實際的硬體電路往往都是以邏輯閘級網表作為基礎構建的，而設計人員常常會在進行更高抽象級別的設計。儘管如此，邏輯閘級的設計還是更接近真實電路形式。Verilog提供了一系列邏輯閘原語。邏輯閘原語和模組類似，可以透過例項引用的方式使用。:156電晶體級描述.Verilog能夠在低抽象級別對電路進行描述，是它的一個重要特點。Verilog中提供了多種電晶體級等。所有的電晶體都可以設定延遲屬性。:9設計人員可以利用這些低抽象級元件構建所需要的邏輯閘或直接構成其他高階元件。:158-167延遲.邏輯閘和電晶體的延遲.真實的硬體電路不可避免地都存在延遲現象。在Verilog中，可以對邏輯閘、電晶體這些元件的延遲資訊進行描述。可以為元件的延遲指定一個時間，則上升、下降、關斷的延遲都使用這個時間；也可以按照先後順序分別指定上升延遲、下降延遲，而關斷延遲取二者較小值；當然也可以為上升、下降、關斷各指定一個時間。:50-51例如，下面的程式碼為與門例項添加了三個延遲時間，分別對應上升、下降、關斷：and #(1, 2, 3) my_and (out, in1, in2);邏輯閘和電晶體的延遲屬於“慣性延遲”。它的意思是，邏輯閘和電晶體獲得外部輸入之後，延遲指定的時間後，才會將結果呈現在輸出端上。在延遲期間，如果輸入改變，但是這個訊號的持續時間小於指定延遲的時間，則不會影響邏輯閘和電晶體的輸出；如果這個訊號的持續時間大於指定延遲的時間，則之前的結果將不會呈現在輸出端，改變輸入訊號後的結果將經過延遲後將呈現在輸出端:143-144Verilog還允許設計人員為每個延遲時間設定最大值、典型值、最小值，在編譯階段可以透過編譯程式碼選擇其中一個。:51-52線網延遲.在宣告線網或對線網進行連續賦值的時候，可以為線網新增延遲資訊。這樣，所有連續賦值給線網的表示式都會立即計算出結果，但是這個結果在延遲時間後才會賦值給線網。:43如果在這段延遲時間內，右側表示式的結果發生變化，則用於賦值的表示式結果取變化後的。另外，如果如果輸入變數變化的脈衝寬度小於延遲的時間，其變化不會對輸出造成影響。這種延遲被稱為“慣性延遲”，:59邏輯閘和電晶體的延遲也是這種情況。過程延遲.過程延遲在前面的延遲時序控制一部分講述過。過程賦值語句中的延遲主要分為常規延遲兩種，其中前者先延遲，再計算表示式、賦值給左邊的變數；而後者先立即計算表示式，經過延遲後再將結果賦值給左邊的變數。:89-93路徑延遲.設計人員可以在模組中關鍵字codice_234、codice_235之間對路徑延遲進行描述。與元件的延遲不同，路徑延遲是指訊號在某兩個暫存器型別或線網型別變數之間傳遞所需的延遲時間。在codice_234程式碼塊中可以使用條件結構來根據情況選擇所需的延遲時間值。與元件延遲相同的是，延遲的時間值可以指定上升、下降、關斷的情況，同時也可以包含最大值、典型值、最小值。:148-153邏輯綜合.概念簡介.設計人員編寫的Verilog程式碼通常是在較高抽象級別的，例如暫存器傳輸級。這一抽象級別包含了對電路訊號在暫存器之間傳輸情況的描述。但是邏輯閘級的網表，即邏輯閘的相互連線形式，才最接近真實的硬體電路。這一形式與暫存器傳輸級的描述，在功能上是等效的。為了給後續硬體製造人員提供這種低抽象級別的描述，需要將高抽象級別的Verilog程式碼轉換為低抽象級別的邏輯閘級網表。這一過程稱為邏輯合成。:5:253在自動化邏輯合成工具出現之前，儘管人們可以用硬體描述語言進行設計，但是還是需要人工進行邏輯合成。例如，如果電路模組只有少數幾個輸入端，我們可以使用類似卡諾圖的方法來對邏輯函式進行化簡。隨著電路規模不斷增加，人工邏輯合成的容易出錯、耗費大量時間的缺點逐漸凸顯。同時，在某種特殊器件製程下最最佳化的綜合結果不一定在另一種製程下還合適，如果需要採用另外的製程，設計人員需要花費很長時間重新進行邏輯合成。隨著自動化邏輯合成工具的出現，硬體描述語言、所需器件製程資訊的邏輯閘級網表。藉助自動合成工具，設計人員可以將更多的精力放在高抽象級別的硬體描述語言設計。:203-204可合成程式碼.邏輯合成工具不能接受所有的Verilog程式碼。設計人員需要確保硬體描述語言程式碼是週期到週期的暫存器傳輸級描述。諸如codice_73的迴圈結構必須透過訊號邊緣的形式，這就可能產生規模非常龐大的邏輯閘級網表，其中一部分是不必要的，這將造成資源的浪費。與未知邏輯codice_22、高阻態codice_24有關的運算子不能被轉換，例如codice_129、codice_130。此外，條件結構如果只有codice_68而沒有對codice_245的情況進行設計，或者選擇結構缺少預設情況codice_246，很可能產生預期之外的鎖存器。:93由於需要使用與製程相關的邏輯閘，因此使用者自定義的原語很可能不能被轉換。:91設計人員需要採取良好的程式碼風格，以獲得更最佳化的邏輯合成結果。:204-219為了適應符合可重用設計思想的系統晶片、IP核設計，設計人員還應該遵循更嚴格的編碼規範。高階功能.使用者自定義原語.除了系統提供的26種邏輯閘、電晶體原語，:103-104Verilog也提供使用者自定義原語。原語與模組的層次結構類似，但是原語的輸入輸出關係是完全透過查表實現的。組合邏輯的使用者自定義原語的核心是真值表，時序邏輯的使用者自定義原語的核心是激勵表。設計人員需要在狀態表中羅列可能出現的輸入和輸出情況。如果在實際使用過程中，遇到狀態表中沒有定義的情況，則輸出不確定值codice_22。:62使用自定義原語很直觀，但是如果輸入變數較多，狀態表就會變得很複雜。在很多情況中，使用者自定義原語並不能被邏輯綜合工具轉換。:91:200程式語言介面.程式語言介面提供了透過C語言函式對Verilog資料結構進行儲存、讀取操作的途徑。:9Verilog程式語言介面的發展先後經過了三代，其中第一代為任務或函式子程式，它可以在C程式和Verilog設計之間傳遞資料；第二代為存取子程式，它可以在使用者自定義C程式和Verilog的內部資料表示的介面上被使用；第三代為Verilog過程介面，它進一步擴充套件了前兩代程式語言介面的功能。:199-200透過使用程式語言介面，設計人員可以自定義介面的功能，然後透過類似呼叫系統任務的方式呼叫這些自定義功能。這樣，設計人員可以很大程度地擴充套件他們能使用的功能，例如監視、激勵、除錯功能，或者用它來提取設計資訊、顯示輸出等。:184-186相關電子設計自動化工具.Verilog作為業界使用最廣泛的硬體描述語言之一，有大量的電子設計自動化工具對它予以支援。透過使用整合開發環境，設計人員可以在常見的Windows或其他圖形化系統中進行設計、模擬、驗證，例如Cadence和Synopsys等公司提供的積體電路計算機輔助設計系統。與VHDL的比較.Verilog硬體描述語言的英語縮寫Verilog HDL和另一種類似的硬體描述語言VHDL在名稱上容易混淆，實際上二者是兩種不同的硬體描述語言。一些高階的電子設計自動化工具支援使用者在專案內同時使用Verilog和VHDL來進行硬體設計。:18VHDL是由美國國防部主持研發的硬體描述語言，成為了第一個成為電氣電子工程師學會標準的硬體描述語言，美國政府相關的專案都是基於VHDL；而Verilog由民間商業公司的私有產品發展為IEEE標準的，因此在商用領域的市場佔有量更大，設計人員和支援資源比VHDL更廣。在美國大約有10萬設計人員、200所大學教授採用Verilog硬體描述語言。Verilog和VHDL作為業界廣泛認可、同為電氣電子工程師學會標準的硬體描述語言，有著各自的特點。VHDL的設計之初就更加針對標準化進行設計，Verilog則具有簡明、高效的程式碼風格。:4兩種語言都能夠在多個抽象層次對數位電路建模，並且可以與驗證、模擬、綜合工具協同工作。其中，Verilog的邏輯閘級、電晶體級級電路描述能力更強，VHDL不具備這樣低階的描述能力，但是另一方面，VHDL的系統級抽象描述能力則比Verilog強。:255另外，由於Verilog與C語言在語法上有相似之處，因此具有C語言基礎的設計人員更容易掌握它，:11而VHDL設計人員需要具有Ada語言程式設計基礎，並且學習週期比Verilog更長。相關學術示，在美國的高階數字系統設計領域，Verilog和VHDL的使用比率大約分別為80%和20%，這項比率在日本和臺灣和美國相似。隨著Verilog-A被合併到Verilog標準之中，而該部分後來成為了Verilog-AMS的一部分，該語言增加了對模擬電子系統的描述能力，因此它在混合訊號積體電路中有著更廣泛的應用。