1. 程式人生 > 其它 >8位流水燈程式verilog_閱讀筆記:《Verilog HDL入門》第3章 Verilog語言要素

8位流水燈程式verilog_閱讀筆記:《Verilog HDL入門》第3章 Verilog語言要素

技術標籤:8位流水燈程式verilog

3.1識別符號

1.Verilog中的Identifier是由任意字母、數字、下劃線和$符號組成的,第一個字元必須是字母或者下劃線。區分大小寫。

2.Escaped Identifier是為了解決簡單識別符號不能以數字和$符號開頭的缺點。如下所示:

f3ee41d74cb85a9862e0ef8a0a6b27b5.png

3.關鍵字。我的理解是保留字包括關鍵字,verilog中關鍵字都是小寫的。

3.2註釋

  1. /* */

2. //

3.3格式

語句結構既可以跨越多行編寫,也可以在一行內編寫。

3.4系統任務和系統函式

以$開頭的識別符號被認為是系統任務或者系統函式。任務可以返回0個或者多個值,函式只能返回一個值。函式的執行不允許由任何延遲,任務可以有延遲。但是系統任務不能有延遲。簡單做個測試,但是發現控制檯沒有輸出。

cad7250a6f029e72b8d70cc746609453.png

3.5編譯器指令

某些以`(反引號)開頭的標誌符是編譯器指令。

1. `define和`undef指令:巨集定義以及取消前面的巨集。

2.`ifdef、`ifndef、`else、`elseif和`endif:條件編譯。

3.`default_nettype:該指令用於為隱式線網指定線網型別。

8e0997422fb3ed1052c92e3a56e45a45.png

4.`include:可以包含其他檔案的內容(替換的方式)。絕對路徑和相對路徑都可以。

5.`resetall:將所有的編譯指令重新設定為預設值。

6.`timescale:一般放在模組宣告的外部,影響其後所有的延遲值。直到遇到另一個`timescale指令或者`resetall指令。

3.6值集合

Verilog中有四種基本值:0,1,x,z。其中x、z是不區分大小寫的。這四種基本值構成了Verilog語言中3種類型的常數:Integer、Real和String。下劃線可以自由地在整數中或者實數中使用,用來改進常量的易讀性。

3.6.1整數型

1.簡單的十進位制:+、-這兩個操作符只能作用於十進位制,不能作用於其他進位制。

2.基數格式表示法:

[size] '[signed] base value

基數格式的數通常為無符號數。若某整型數的位寬沒有定義,則預設是32位的。無符號數在左邊補零,有符號數在左邊補符號位。若數的最左邊是x或者z,則補x或z。

base是必須要有的。

3.6.2實數

1.十進位制:小數點兩側必須有數字。

2.科學計數法:23_5.1e2。

Verilog將實數隱式地轉換成整數。

3.6.3字串

字串是雙引號括起的字元序列。字串是8位ASCII值的序列。

3.7資料型別

Verilog有兩大資料型別:Net Type和Variable Type。

3.7.1線網型別

關於這部分,多個激勵源驅動的線網,線網的值有效值由表決定。

2e1e702c1173f47961e5e803a5668a9c.png

3.7.2未宣告的線網

3.7.3向量線網和標量線網

3.7.4變數型別

1.reg變數型別

使用了關鍵詞signed的reg變數,會以補碼的形式儲存。

2.儲存器

儲存器是由reg變數組成的陣列。儲存器宣告格式如下:

reg[[msb : lsb]] memory1[upper1 : lower1], ...;

儲存器中的每一個元素被稱為字,對儲存器賦值可以分別對儲存器中的每個字進行賦值。文中提到了使用for迴圈對儲存器進行賦值。還可以使用$readmemb和$readmemh這兩個函式對儲存器進行賦值。

3.整型變數

整型變數的宣告格式如下所示:

integer integer1, integer2, ... integerN[msb : lsb];

[msb : lsb]指定了整型陣列的範圍。一個整形數至少有32位。

整型能被當作向量處理。可以通過賦值將整數型轉換為位向量。

4.time變數

5.real和realtime變數

3.7.5陣列

看一下二維陣列的宣告:

integer a[0:15][0:15]; //16*16的陣列,其中每個元素都是整型變數。

一維reg變數的陣列也被稱為儲存器。不能對整個陣列進行賦值。只能對陣列的一個元素進行賦值。

3.8引數

引數宣告語句的格式如下:

parameter [signed][msb : lsb] param1 = const_expr,...;

引數值在編譯的時候可以使用defparam進行改變。引數是區域性的,只能在其定義的模組內部其作用,而巨集定義對同時編譯的多個檔案起作用。