Verilog學習筆記基本語法篇(一)·········數據類型


Verilog中共有19種數據類型。

基本的四種類型: reg型、wire型、integer型、parameter型。

其他類型:large型、medium型、small型、scalared型、time型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。

這14中數據類型除time外都與基本邏輯單元建庫有關。

 

A、常 量

(1)數 字

整數,整型常量即整常數有以下4種進制表示形式:1)二進制(b或B);2)十進制(d或D);3)十六進制(h或H);4)八進制(o或O)。

數字表達式分為三種:

1)<位寬><進制><數字>,這是最完整的形式。

2)<進制><數字>,數字的位寬采用默認位寬(不同的機器系統不同,至少32位)。

3)<數字>,采用默認進制(十進制)。

示例:(位寬指的是時間所占位數,而不是指十六進制有幾位。如示例二,每一位十六進制數字需要4位二進制數字表示,所以2位十六進制的位寬為8)

8'b10101100    //位寬為8的二進制數字10101100

8'ha2               //位寬為8的十六進制數字a2

x值和z值:在數字電路中,x代表不定值,z代表高阻值。一個x可以定義十六進制的4位,八進制的3位。z的表示方式同x相同,另外z亦可以用“?”來表示。(case塊中用得較多)

4'b10x0            //位寬為4的二進制數從低位數起第二位為不定值

4'b101z            //位寬為4的二進制數從低位數起第一位為高阻值

12'dz               //位寬為12的10進制數,其值為高阻值(形式一)

12'd?               //位寬為12的10進制數,其值為高阻值(形式二)

8'h4x               //位寬為8的十六進制數,其低4位為不定值

負數:在位寬前面加一個減號,減號必須在數字定義表達式的最前面。

-8'd5               //代表5的補數(采用8位二進制表示)

下划線:用於區別開數字的表達式以提高程序的可讀性。不能用在位寬和進制的地方,只能用在數字之間(數字前也不可以)。

16'b1010_1011_1111_1010    //合法形式

常量未加標志時,默認為32位的十進制數,字母用八位的ASCII值表示。

"AB"=16'b01000001_01000010             //字符串AB,為十六進制數16'h4142

 

(2)參數型(parameter)

用parameter來定義一個標志符代表一個常量,稱作符號常量,他可以提高程序的可讀性和可維護性。parameter是參數型數據的關鍵字,在每一個賦值語句的右邊都必須是一個常數表達式。即該表達式只能包含數字或先前已經定義的參數。

parameter     msb=7;                 //定義參數msb=7

parameter     r=5.7;                   //定義r為一個實型參數5.7

parameter     byte_size=8,byte_msb=byte_size-1;        //利用常數表達式賦值

參數型常量經常用於定義延遲時間和變量寬度。在模塊和實例引用時,可以通過參數傳遞改變在被引用模塊或實例中已經定義的參數。

本書(1)(p31)介紹了兩種方法:

1)引用實例時,通過參數的傳遞來改變已經定義的參數值。    Decode   #(4,0) D1(A4,F16)

2)在多層次的模塊中,改變參數需要使用defparam命令。     defparam   Test.T.B1.P=2;         //Test、T、B1分別是高層模塊中的底層模塊實例。

 

B、變 量

  網絡數據類型表示結構實體之間的物理連接。網絡數據類型的變量不能儲存數值,而且必須受到驅動器(門或連續賦值語句assign)的驅動。

(1)wire型,默認為高阻值z。

網絡數據類型包括 wire型 和 tri型 數據。

wire用於表示單個門驅動或者連續賦值語句驅動的網絡數據類型;

tri型則用來表示多驅動器驅動的網絡型數據。

如果沒有定義wire和tri的邏輯強度,在多驅動元的情況下邏輯值會發生沖突,從而產生不確定值。(z的優先級最低,x的優先級最高)

 
wire / tri 0 1 x z

0

0 x x 0
1 x 1 x

1

x

x x x x

z

0 1 x z

 

 

 

 

 

 

 

 

wire經常用來表示以assign為關鍵字的組合邏輯信號。Verilog程序模塊中輸入輸出的信號類型默認時自動定義為wire型。參數定義格式如下;

wire [n-1,0] 數據名1,數據名2...數據名i;          //表示共有 i 條總線,每台總線內有n條線路。或者 wire [n,1] 數據名1,數據名2...數據名i;

[n-1,0] 和 [n,1] 表示該數據的位寬為n。如:

wire      a;            //定義了1個1位的wire數據

wire    [7,0] b;       //定義了1個8位的wire數據

wire    [4,1] a,b;    //定義了2個4位的wire數據

 

(2)reg型,默認為不定值x。

寄存器是存儲單元的抽象,寄存器數據類型的關鍵字是reg。常用來表示always模塊內的指定信號,代表觸發器。在always模塊內被賦值的每一個信號都必須定義成reg型。格式與wire型類似:

reg [n-1,0] 數據名1,數據名2,...數據名i;

reg [n,1]  數據名1,數據名2,...數據名i;

reg數據可以賦正值,也可以賦負值。但是當一個reg數據是一個表達式的操作式時,它的值被當做無符號值,即正值。如:4位的reg被賦值為-1,在表達式中為+15.

reg型只是表示被定義的信號將被用在always模塊中,並不是說reg型數據就一定是存儲器或觸發器的輸出。

 

(3)memory型(特殊的reg)

在Verilog中通過對reg數據建立數組來對存儲器進行建模,用來買哦書RAM ROM和reg文件。verilog中沒有多維數組存在,memory型數據是通過擴展reg型數據的地址范圍實現的。存儲器的地址索引必須是常數表達式(n-1,m-1等必須是常量,符號常量也可以)。如:

reg      [n-1,0] 存儲器名[m-1,0];

reg      [n-1,0] 存儲器名[m,1];

在這里[n-1,0]定義了存儲器中每一個存儲單元的大小,即n位寄存器。存儲器名后面的[m-1,0],表示定義的存儲器中有多少個這樣的寄存器。

reg     [7,0] mem[255,0];           //256個8位寄存器的存儲器mem

reg     [n-1,0] rega;                   //一個n位的寄存器

reg     mema[n-1,0]                   //n個1位的寄存器形成的存儲器

rega = 0;                                  //合法,對n位的寄存器賦值位0

mema = 0;                               //非法,不能對完整的存儲器直接賦值

mema[3] = 0;                          //合法,將mema中第三個存儲單元賦值為0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM