Verilog HDL簡(jiǎn)介&基礎(chǔ)知識(shí)1
Verilog 是 Verilog HDL 的簡(jiǎn)稱,Verilog HDL 是一種硬件描述語(yǔ)言(HDL:Hardware Description Language),硬件描述語(yǔ)言是電子系統(tǒng)硬件行為描述、結(jié)構(gòu)描述、數(shù)據(jù)流描述的語(yǔ)言。利用這種語(yǔ)言,數(shù)字電路系統(tǒng)的設(shè)計(jì)可以從頂層到底層(從抽象到具體)逐層描述自己的設(shè)計(jì)思想,用一系列分層次的模塊來(lái)表示極其復(fù)雜的數(shù)字系統(tǒng)。然后,利用電子設(shè)計(jì)自動(dòng)化(EDA)工具,逐層進(jìn)行仿真驗(yàn)證,再把其中需要變?yōu)閷?shí)際電路的模塊組合,經(jīng)過(guò)自動(dòng)綜合工具轉(zhuǎn)換到門(mén)級(jí)電路網(wǎng)表。接下去,再用專(zhuān)用集成電路 ASIC 或現(xiàn)場(chǎng)可編程門(mén)陣列 FPGA 自動(dòng)布局布線工具,把網(wǎng)表轉(zhuǎn)換為要實(shí)現(xiàn)的具體電路布線結(jié)構(gòu)。在 FPGA 的設(shè)計(jì)中,我們有多種設(shè)計(jì)方式,如繪制原理圖、編寫(xiě)描述語(yǔ)言代碼等。早期的工程師對(duì)原理圖的設(shè)計(jì)方式情有獨(dú)鐘,這種輸入方式能夠很直觀的看出電路的結(jié)構(gòu)并快速理解電路。隨著邏輯規(guī)模的不斷攀升,邏輯電路也越來(lái)越復(fù)雜,這種輸入方式就會(huì)顯得力不從心,應(yīng)付簡(jiǎn)單的邏輯電路還算實(shí)用,應(yīng)付起復(fù)雜的邏輯電路就不行了。因此取而代之的便是編寫(xiě)描述語(yǔ)言代碼的方式,現(xiàn)今的絕大多數(shù)設(shè)計(jì)都是采用代碼來(lái)完成的。
本文引用地址:http://cafeforensic.com/article/202401/455162.htm基礎(chǔ)概念
首先我們先來(lái)講一下 Verilog 的四值邏輯系統(tǒng)。
在Verilog 的邏輯系統(tǒng)中有四種值,也即四種狀態(tài)。
邏輯 0:表示低電平,也就對(duì)應(yīng)我們電路 GND;
邏輯 1:表示高電平,也就是對(duì)應(yīng)我們電路的 VCC;
邏輯 X:表示未知,有可能是高電平,也有可能是低電平,仿真發(fā)生了不能解決的邏輯沖突;
邏輯 Z:表示高阻態(tài),外部沒(méi)有激勵(lì)信號(hào)是一個(gè)懸空狀態(tài)。
例如: 1.2, 0.1, 2394.26331 1.2.E12, 1.30e-2, 0.1e-0, 23E10, 29E-2 236.123_763_e-12 //underscores are ignored 當(dāng)把實(shí)數(shù)賦給一個(gè)整數(shù)變量時(shí),按四舍五入轉(zhuǎn)換后賦值。 例如,35.7和35.5都轉(zhuǎn)換成36,而35.2則轉(zhuǎn)換成35。 例如,-1.5轉(zhuǎn)換成-2,而1.5則轉(zhuǎn)換成2.
字符串
字符串的定義規(guī)則如下。
字符串是包含在兩個(gè)“(雙引號(hào))之間的字符。
字符串在表達(dá)式中或在賦值時(shí),被當(dāng)做一個(gè)由8-bit ASCII碼序列組成的無(wú)符號(hào)數(shù)。
字符串中可以使用如下的特殊字符:n、t、、”和ddd,ddd用于表示八進(jìn)制數(shù)。
使用reg變量操作字符串時(shí),每8-bit存一個(gè)字符。
因?yàn)樽址划?dāng)做無(wú)符號(hào)數(shù),所以在用整數(shù)的補(bǔ)齊和截去規(guī)則,就是如果字符串的位長(zhǎng)小于變量的位長(zhǎng),那么字符串做右對(duì)齊存放到變量的右側(cè),變量的左側(cè)補(bǔ)0;如果字符串的位長(zhǎng)大于變量的位長(zhǎng),那么字符串做右對(duì)齊存放到變量的右側(cè),多余的位截去。
標(biāo)識(shí)符
標(biāo)識(shí)符就是模塊、端口、任務(wù)、函數(shù)、變量、線網(wǎng)、參數(shù)、實(shí)例等的名字。定義標(biāo)識(shí)符要花一些心思,要含義清晰、簡(jiǎn)潔明了。
數(shù)據(jù)類(lèi)型
線網(wǎng)
線網(wǎng)(net)用于表示結(jié)構(gòu)體(如邏輯門(mén))之間的連接。除了trireg之外,所有其他的線網(wǎng)類(lèi)型都不能保存值,線網(wǎng)的值時(shí)由driver決定的,例如由連續(xù)賦值驅(qū)動(dòng)或由邏輯門(mén)驅(qū)動(dòng)。如果driver沒(méi)有驅(qū)動(dòng)線網(wǎng),那么線網(wǎng)的值是z,但是tri0、tri1、trireg除外,tri0將是0,tri1將是1,而trireg將保持之前driver驅(qū)動(dòng)的值。
線網(wǎng)有以下這些類(lèi)型:wire、wand、wor、tri、triand、trior、tri0、tri1、trireg、uwire、supply0、supply1。
1.1 wire和tri
wire和tri是一樣的,具有同樣的語(yǔ)法和功能,提供兩個(gè)名字是用于不同方面的建模:wire用于邏輯門(mén)的驅(qū)動(dòng)或連續(xù)賦值的驅(qū)動(dòng),而tri用于多driver驅(qū)動(dòng)。
當(dāng)多個(gè)具有相同驅(qū)動(dòng)強(qiáng)度的driver驅(qū)動(dòng)同一個(gè)wire或tri線網(wǎng)出現(xiàn)邏輯沖突時(shí),線網(wǎng)的值是x(unknown)。
1.2 wor、wand、trior、triand
線邏輯(model wired logic)類(lèi)型的線網(wǎng)有wor、wand、trior和triand,它們用于解決多個(gè)driver驅(qū)動(dòng)同一個(gè)線網(wǎng)時(shí)出現(xiàn)的邏輯沖突。wor和trior實(shí)現(xiàn)線或(or)邏輯,wand和triand實(shí)現(xiàn)線與(and)邏輯。
wor和trior是一樣的,wand和triand是一樣的,都是為了不同方面的建模。
1.3 tr0、tr1
tri0用于表示帶有下拉電阻(pulldown)的線網(wǎng)。當(dāng)沒(méi)有driver驅(qū)動(dòng)tri0線網(wǎng)時(shí),它的值是0,強(qiáng)度是pull。
tri1用于表示帶有上拉電阻(pullup)的線網(wǎng)。當(dāng)沒(méi)有driver驅(qū)動(dòng)tri1線網(wǎng)時(shí),它的值是1,強(qiáng)度是pull。
1.4 uwire
Verilog-2005增加了uwire,只能被一個(gè)driver驅(qū)動(dòng),如果被多個(gè)driver驅(qū)動(dòng),那么編譯時(shí)就會(huì)出錯(cuò)。但是不知為什么VCS現(xiàn)在還不支持uwire。
1.5 supply0、supply1
supply0和supply1用于模型電源,就是只能提供0和1值的線網(wǎng),通常只在Vendor提供的標(biāo)準(zhǔn)單元庫(kù)中使用,平時(shí)不用。
1.6 驅(qū)動(dòng)強(qiáng)度
線網(wǎng)驅(qū)動(dòng)強(qiáng)度(drive strength)包括:
1.7 默認(rèn) net
在Verilog-1995中,由連續(xù)賦值驅(qū)動(dòng)而且不是端口的1-bit線網(wǎng)必須聲明,用于端口連接的1-bit線網(wǎng)可以不必聲明。但是在Verilog-2001中,就去掉了這個(gè)限制。
變量
變量是數(shù)據(jù)存儲(chǔ)單元的抽象。變量具有如下特性。
- 變量將保持每次賦給它的值,直到下一次賦值給它。當(dāng)過(guò)程塊被觸發(fā)時(shí),過(guò)程塊中的賦值就會(huì)改變變量的值。
- reg、time和integer的初始化值是x,real和realtime的初始化值是0.0。如果使用變量聲明賦值(variable declaration assignment,例如reg abc = 1'b0;),那么就相當(dāng)于在initial塊中使用阻塞賦值。
- 對(duì)reg的賦值是過(guò)程賦值,因?yàn)閞eg能夠保持每次賦的值,所以它能用于模型硬件寄存器(例如,邊沿敏感的觸發(fā)器或電平敏感的鎖存器)。但是reg不只用于模型硬件寄存器,它也用于模型組合邏輯。
- 除了用于模型硬件,變量也有其他的用途。雖然reg很通用,但是integer和time可以提供更大的方便性和可讀性。time變量常和$time函數(shù)一起使用。
例子: integer i = 32'h1234_5678;
time t = 64'habcd_efab_1234_5678;
$display ("%x, %x", i[15:0], t[63:60]);
向量
標(biāo)量(scalar)是沒(méi)有范圍聲明的1-bit的線網(wǎng)(net)或reg。
向量(vector)是帶有范圍聲明的multi-bit的線網(wǎng)(net)或reg。
例子: wand w; // a scalar net of type "wand" wire w1, w2; // declares two wires tri [15:0] busa; // a three-state 16-bit bus reg a; // a scalar reg reg [3:0] v; // a 4-bit vector reg made up of v[3], // v[2], v[1], and v[0] reg signed [3:0] signed_reg; // a 4-bit vector in range -8 to 7 reg [4:-1] b; // a 6-bit vector reg reg [4:0] x, y, z; // declares three 5-bit regs
評(píng)論