日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ
		


Verilog基本語法

現(xiàn)在做芯片設(shè)計(jì)已經(jīng)不是門級(jí)電路設(shè)計(jì)了,一個(gè)系統(tǒng)設(shè)計(jì)達(dá)到的門電路規(guī)模都是十幾二十多個(gè)G的規(guī)模,所以必須要借助EDA工具進(jìn)行芯片設(shè)計(jì),而描述電路也不是通過畫邏輯門電路了,而是用硬件描述語言對(duì)電路進(jìn)行描述,比如verilog和VHDL。通過硬件描述語言把電路描述出來,在通過EDA進(jìn)行輔助設(shè)計(jì),包括前端驗(yàn)證,后端綜合等等,整個(gè)芯片設(shè)計(jì)流程都必須要有EDA工具輔助。

在國內(nèi)大部分還是使用verilog硬件描述語言來進(jìn)行芯片設(shè)計(jì),介紹verilog語法的書也很多,并且verilog的語法是最簡(jiǎn)單的,沒有之一。這里我們也不會(huì)像書本上那樣詳細(xì)系統(tǒng)的去羅列出verilog語法。我們主要列舉一些筆試和面試中經(jīng)??疾斓膙erilog語法,提煉出來,方便大家復(fù)習(xí),也是為自己做一個(gè)學(xué)習(xí)記錄。







內(nèi)容概括

電路的抽象層次

Verilog描述RTL的框架

模塊端口定義

模塊I/O格式

模塊內(nèi)部信號(hào)聲明

模塊功能定義

參數(shù)

變量

運(yùn)算符及表達(dá)式

函數(shù)與TASK

綜合與不可綜合語法

建立可綜合模型的原則


01電路的抽象層次


一個(gè)電路我們可以按照五個(gè)層次來抽象,具體抽象層次如下所示:

  • 系統(tǒng)級(jí)(system): 用語言提供的高級(jí)結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)模塊外部性能的模型。

  • 算法級(jí)(algorithm): 用語言提供的高級(jí)結(jié)構(gòu)實(shí)現(xiàn)算法運(yùn)行的模型。

  • RTL級(jí)(Register Transfer Level):描述數(shù)據(jù)在寄存器之間流動(dòng)和如何處理和控制這些數(shù)據(jù)流動(dòng)的模型。

  • 門級(jí)(gate-level):描述邏輯門以及邏輯門之間的連接的模型。

  • 開關(guān)級(jí)(switch-level):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)以及它們之間連接的模型

抽象層次越高,設(shè)計(jì)的難度就越低,除了模擬電路還在開關(guān)級(jí)上進(jìn)行設(shè)計(jì),數(shù)字電路基本上都已經(jīng)在RTL級(jí)以上進(jìn)行設(shè)計(jì)了。

現(xiàn)在數(shù)字芯片的規(guī)模越來越大,工藝越來越復(fù)雜,已經(jīng)不可能在開關(guān)級(jí)或者門級(jí)層次上來設(shè)計(jì)電路了。當(dāng)然有一些定制電路還是會(huì)在開關(guān)級(jí)或者門級(jí)進(jìn)行設(shè)計(jì),但電路的規(guī)模都很小。因?yàn)樵O(shè)計(jì)的層次越高,那么就需要依賴EDA工具輔助設(shè)計(jì),對(duì)性能和面積肯定不是最優(yōu)的,這就是為什么有些專用定制電路還是會(huì)采用開關(guān)級(jí)或者門級(jí)層級(jí)進(jìn)行設(shè)計(jì)。

Verilog語言可以支持上面五個(gè)層級(jí)進(jìn)行電路設(shè)計(jì),但我們平常一般都是在RTL級(jí)別進(jìn)行設(shè)計(jì),再通過EDA工具進(jìn)行輔助設(shè)計(jì),這樣可以使硬件設(shè)計(jì)師們得以專注于邏輯,而不需要考慮硬件層面的實(shí)現(xiàn)。同樣的代碼只要經(jīng)過不同的庫綜合,就可以在不同的硬件上運(yùn)行。因此Verilog的代碼具有極高的可復(fù)用性




02Verilog描述RTL的框架


從上面的典型例子可以看出,Verilog結(jié)構(gòu)位于在module和endmodule聲明語句之間,每個(gè)Verilog結(jié)構(gòu)包括四個(gè)主要部分:端口定義、I/O說明、內(nèi)部信號(hào)聲明、功能定義。

下面詳細(xì)介紹各個(gè)部分的具體語法。




03模塊端口定義

模塊的端口聲明了模塊的輸入輸出口。其格式如下:

module 模塊名(1,口2,口3,口4, ………);

…….

endmodule

模塊的端口表示的是模塊的輸入和輸出口名,也就是它與別的模塊聯(lián)系端口的標(biāo)識(shí)。

在模塊被引用時(shí),在引用的模塊中,有些信號(hào)要輸入到被引用的模塊中,有的信號(hào)需要從被引用的模塊中取出來。在引用模塊時(shí)其端口可以用兩種方法連接:

1)在引用時(shí),嚴(yán)格按照模塊定義的端口順序來連接,不用標(biāo)明原模塊定義時(shí)規(guī)定的端口名,舉例說明如下:

模塊名 實(shí)例化名( 連接端口1信號(hào)名, 連接端口2信號(hào)名,….,,,);

2)在引用時(shí)用“.”標(biāo)明原模塊定義時(shí)規(guī)定的端口名,舉例說明如下:

模塊名 實(shí)例化名(

.端口1名( 連接信號(hào)1名),

.端口2名( 連接信號(hào)2名),….,,,

);

這樣表示的好處在于可以用端口名與被引用模塊的端口對(duì)應(yīng),不必嚴(yán)格按端口順序?qū)?yīng),提高了程序的可讀性和可移植性。


04
04模塊I/O格式


輸入口:

input [信號(hào)位寬-1 :0] 端口名1;

input [信號(hào)位寬-1 :0] 端口名2;

………;

input [信號(hào)位寬-1 :0] 端口名i; //(共有i個(gè)輸入口)

輸出口:

output [信號(hào)位寬-1 :0] 端口名1;

output [信號(hào)位寬-1 :0] 端口名2;

………;

output [信號(hào)位寬-1 :0] 端口名j; //(共有j個(gè)輸出口)

輸入/輸出口:

inout [信號(hào)位寬-1 :0] 端口名1;

inout [信號(hào)位寬-1 :0] 端口名2;

………;

inout [信號(hào)位寬-1 :0] 端口名k; //(共有k個(gè)雙向總線端口)

I/O說明也可以寫在端口聲明語句里。其格式如下:

module module_name(

input port1,

input port2,…

output port1,

output port2… );


0405模塊內(nèi)部信號(hào)聲明


在模塊內(nèi)用到的和與端口有關(guān)的wire 和 reg 類型變量的聲明。如:

reg [width-1 : 0] R變量1,R變量2;

wire [width-1 : 0] W變量1,W變量2;reg[width-1:0] mem[depth-1:0];

//聲明了一個(gè)數(shù)組


0406模塊功能定義


模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產(chǎn)生邏輯。

1)用“assign”聲明語句,如:

assign a = b & c;

2)實(shí)例化模塊,如:and u1( q, a, b );

3)用“always”塊

如:

采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時(shí)序邏輯。上面的例子用“always”塊生成了一個(gè)帶有異步清除端的D觸發(fā)器。“always”塊可用很多種描述手段來表達(dá)邏輯,例如上例中就用了if...else語句來表達(dá)邏輯關(guān)系。如按一定的風(fēng)格來編寫“always”塊,可以通過綜合工具把源代碼自動(dòng)綜合成用門級(jí)結(jié)構(gòu)表示的組合或時(shí)序邏輯電路。

理解要點(diǎn):

如果用Verilog模塊實(shí)現(xiàn)一定的功能,首先應(yīng)該清楚哪些是同時(shí)發(fā)生的,哪些是順序發(fā)生的。上面分別采用了“assign”語句、實(shí)例化模塊和“always”塊,描述的邏輯功能是同時(shí)執(zhí)行的。也就是說,如果把這三項(xiàng)寫到一個(gè) VeriIog 模塊文件中去,它們的次序不會(huì)影響邏輯實(shí)現(xiàn)的功能。這三項(xiàng)是同時(shí)執(zhí)行的,也就是并發(fā)的。

然而,在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的?!癮lways”塊中的語句稱為“順序語句”,因?yàn)樗鼈兪琼樞驁?zhí)行,所以“always”塊也稱作“過程塊”。請(qǐng)注意,兩個(gè)或更多的“always”語句塊,它們是同時(shí)執(zhí)行的,而模塊內(nèi)部的語句是順序執(zhí)行的??匆幌隆癮lways”塊內(nèi)的語句,你就會(huì)明白它是如何實(shí)現(xiàn)功能的。if..else… if必須順序執(zhí)行,否則其功能就沒有任何意義。如果else語句在if語句之前執(zhí)行,其功能就會(huì)不符合要求!為了能實(shí)現(xiàn)上述描述的功能,“always”語句塊內(nèi)部的語句將按照書寫的順序執(zhí)行。

在Verilog 模塊中所有過程塊(如:initial塊、always塊)、連續(xù)賦值語句、實(shí)例引用都是并行的。它們表示的是一種通過變量名互相連接的關(guān)系。在同一模塊中這三者出現(xiàn)的先后次序沒有關(guān)系。只有連續(xù)賦值語句assign 和實(shí)例引用語句可以獨(dú)立于過程塊而存在于模塊的功能定義部分。以上是與C語言有很大的不同。許多與C語言類似的語句只能出現(xiàn)在過程塊中,而不能隨意出現(xiàn)在模塊功能定義的范圍內(nèi)。


0407參數(shù)


在Verilog HDL中用parameter來定義常量,即用parameter來定義一個(gè)標(biāo)識(shí)符代表一個(gè)常量,稱為符號(hào)常量,即標(biāo)識(shí)符形式的常量,采用標(biāo)識(shí)符代表一個(gè)常量可提高程序的可讀性和可維護(hù)性。parameter型數(shù)據(jù)是一種常數(shù)型的數(shù)據(jù),其說明格式如下:

parameter參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式, …,參數(shù)名n=表達(dá)式;

parameter是參數(shù)型數(shù)據(jù)的確認(rèn)符,確認(rèn)符后跟著一個(gè)用逗號(hào)分隔開的賦值語句表。在每一個(gè)賦值語句的右邊必須是一個(gè)常數(shù)表達(dá)式。也就是說,該表達(dá)式只能包含數(shù)字或先前已定義過的參數(shù)。見下列:

parameter msb=7; //定義參數(shù)msb為常量7

parameter e=25, f=29; //定義二個(gè)常數(shù)參數(shù)

parameter r=5.7; //聲明r為一個(gè)實(shí)型參數(shù)

parameter byte_size=8, byte_msb=byte_size-1; //用常數(shù)表達(dá)式賦值

parameter average_delay = (r+f)/2; //用常數(shù)表達(dá)式賦值


0408變量


01

Wire型


wire型數(shù)據(jù)常用來表示用于以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。wire型信號(hào)可以用作任何方程式的輸入,也可以用作“assign”語句或?qū)嵗妮敵觥?/span>

wire型信號(hào)的格式同reg型信號(hào)的很類似。其格式如下:

wire [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i; //共有i條總線,每條總線內(nèi)有n條線路

wire [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;

wire是wire型數(shù)據(jù)的確認(rèn)符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束。如下格式:

wire a; //定義了一個(gè)一位的wire型數(shù)據(jù)

wire [7:0] b; //定義了一個(gè)八位的wire型數(shù)據(jù)

wire [4:1] c, d; //定義了二個(gè)四位的wire型數(shù)據(jù)


02

Reg型


寄存器是數(shù)據(jù)儲(chǔ)存單元的抽象。寄存器數(shù)據(jù)類型的關(guān)鍵字是reg。通過賦值語句可以改變寄存器儲(chǔ)存的值,其作用與改變觸發(fā)器儲(chǔ)存的值相當(dāng)。reg類型數(shù)據(jù)的缺省初始值為不定值,x。reg型只表示被定義的信號(hào)將用在“always”塊內(nèi)。

reg型數(shù)據(jù)常用來表示用于“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。通常,在設(shè)計(jì)中要由“always”塊通過使用行為描述語句來表達(dá)邏輯關(guān)系。在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型。

reg型數(shù)據(jù)的格式如下:

reg [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;

reg [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;

reg是reg型數(shù)據(jù)的確認(rèn)標(biāo)識(shí)符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位(bit)。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束。如下:

reg rega; //定義了一個(gè)一位的名為rega的reg型數(shù)據(jù)

reg [3:0] regb; //定義了一個(gè)四位的名為regb的reg型數(shù)據(jù)

reg [4:1] regc, regd; //定義了兩個(gè)四位的名為regc和regd的reg型數(shù)據(jù)。


03

Memory型


Verilog HDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:

reg [n-1:0] 存儲(chǔ)器名[m-1:0];

或 reg [n-1:0] 存儲(chǔ)器名[m:1];

在這里,reg[n-1:0]定義了存儲(chǔ)器中每一個(gè)存儲(chǔ)單元的大小,即該存儲(chǔ)單元是一個(gè)n位的寄存器。存儲(chǔ)器名后的[m-1:0]或[m:1]則定義了該存儲(chǔ)器中有多少個(gè)這樣的寄存器。最后用分號(hào)結(jié)束定義語句。下面舉例說明:

reg [7:0] mema[255:0];

這個(gè)例子定義了一個(gè)名為mema的存儲(chǔ)器,該存儲(chǔ)器有256個(gè)8位的存儲(chǔ)器。該存儲(chǔ)器的地址范圍是0到255。注意:對(duì)存儲(chǔ)器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。

另外,在同一個(gè)數(shù)據(jù)類型聲明語句里,可以同時(shí)定義存儲(chǔ)器型數(shù)據(jù)和reg型數(shù)據(jù)。見下例:

parameter wordsize=16, //定義二個(gè)參數(shù)

memsize=256;

reg [wordsize-1:0] mem[memsize-1:0], writereg, readreg;

盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組是不同于一個(gè)n位的寄存器的。見下例:

reg [n-1:0] rega; //一個(gè)n位的寄存器

reg mema [n-1:0]; //一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組

一個(gè)n位的寄存器可以在一條賦值語句里進(jìn)行賦值,而一個(gè)完整的存儲(chǔ)器則不行。見下例:

rega =0; //合法賦值語句

mema =0; //非法賦值語句

如果想對(duì)memory中的存儲(chǔ)單元進(jìn)行讀寫操作,必須指定該單元在存儲(chǔ)器中的地址。下面的寫法是正確的。

mema[3]=0; //給memory中的第3個(gè)存儲(chǔ)單元賦值為0。

進(jìn)行尋址的地址索引可以是表達(dá)式,這樣就可以對(duì)存儲(chǔ)器中的不同單元進(jìn)行操作。表達(dá)式的值可以取決于電路中其它的寄存器的值。例如可以用一個(gè)加法計(jì)數(shù)器來做RAM的地址索引。



09運(yùn)算符及表達(dá)式


Verilog HDL語言的運(yùn)算符范圍很廣,其運(yùn)算符按其功能可分為以下幾類:

  1. 算術(shù)運(yùn)算符(+,-,×,/,%)

  2. 賦值運(yùn)算符(=,<=)

  3. 關(guān)系運(yùn)算符(>,<,>=,<=)

  4. 邏輯運(yùn)算符(&&,||,!)

  5. 條件運(yùn)算符(?:)

  6. 位運(yùn)算符(~,|,^,&,^~)

  7. 移位運(yùn)算符(<<,>>)

  8. 拼接運(yùn)算符({ })

其他運(yùn)算符的功能可以參考各類書籍,這里主要講一下等式運(yùn)算

在Verilog HDL語言中存在四種等式運(yùn)算符:

  1. = = (等于)

  2. != (不等于)

  3. = = = (等于)

  4. != = (不等于)

注意:求反號(hào)、雙等號(hào)、三個(gè)等號(hào)之間不能有空格。

這四個(gè)運(yùn)算符都是二目運(yùn)算符,它要求有兩個(gè)操作數(shù)。'=='和'!='又稱為邏輯等式運(yùn)算符。其結(jié)果由兩個(gè)操作數(shù)的值決定。由于操作數(shù)中某些位可能是不定值x和高阻值z(mì),結(jié)果可能為不定值x。“===”“!==”運(yùn)算符則不同,它在對(duì)操作數(shù)進(jìn)行比較時(shí)對(duì)某些位的不定值x和高阻值z也進(jìn)行比較,兩個(gè)操作數(shù)必需完全一致,其結(jié)果才是1,否則為0。“===”和“!==”運(yùn)算符常用于case表達(dá)式的判別,所以又稱為“case等式運(yùn)算符”。這四個(gè)等式運(yùn)算符的優(yōu)先級(jí)別是相同的。

下面舉一個(gè)例子說明“==”和“===”的區(qū)別。

例:

if(A==1‘bx) $display(“AisX”);(當(dāng)A等于X時(shí),這個(gè)語句不執(zhí)行)

if(A===1‘bx) $display(“AisX”);(當(dāng)A等于X時(shí),這個(gè)語句執(zhí)行)


運(yùn)算符的優(yōu)先級(jí):


0410函數(shù)與Task


  • 任務(wù)的的定義

任務(wù)的定義語法如下:

task <任務(wù)名>;

<端口及數(shù)據(jù)類型聲明語句>

<語句1>

<語句2>

……

<語句n>

endtask


  • 任務(wù)的調(diào)用及變量的傳遞

任務(wù)的調(diào)用:

<任務(wù)名>(端口1,端口2,端口3,……端口n);


  • 定義函數(shù)的語法:

function <返回值的類型或范圍> (函數(shù)名);

<端口說明語句>

<變量類型說明語句>

begin

<語句>

……

end

endfuction

注:<返回值的類型或范圍>這一項(xiàng)是可選項(xiàng),如默認(rèn)則返回值為一位寄存器類型數(shù)據(jù)。


  • 從函數(shù)返回的值

函數(shù)的定義蘊(yùn)含聲明了與函數(shù)同名的、函數(shù)內(nèi)部的寄存器,函數(shù)的定義把函數(shù)返回值所賦值寄存器的名稱初始化為與函數(shù)同名的內(nèi)部變量。


  • 函數(shù)的調(diào)用:

函數(shù)的調(diào)用時(shí)通過將函數(shù)作為表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的。

調(diào)用格式如下:

<函數(shù)名>(<表達(dá)式>,…<表達(dá)式>)


  • 函數(shù)的使用規(guī)則:

  1. 函數(shù)的定義不能包含任何的時(shí)間控制語句,即用任何用#、@或wait來標(biāo)識(shí)的語句;

  2. 函數(shù)不能啟動(dòng)任務(wù),但可以調(diào)用其他函數(shù);

  3. 定義函數(shù)時(shí)至少要有一個(gè)輸入變量;

  4. 在函數(shù)定義中必須有一條賦值語句給函數(shù)中的一個(gè)內(nèi)部變量賦以函數(shù)的結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字。


  • 關(guān)于使用任務(wù)和函數(shù)的小結(jié)

  1. 任務(wù)和函數(shù)都是用來對(duì)設(shè)計(jì)中多處使用的公共代碼進(jìn)行定義;使用任務(wù)和函數(shù)可以將模塊分割成許多個(gè)可獨(dú)立管理的子單元,增加了模塊的可讀性和可維護(hù)性;它們和C語言中的子程序起相同作用;

  2. 任務(wù)可以具有任意多個(gè)輸入、輸出和輸入\輸出(inout)變量;在任務(wù)中可以使用延遲、事件和時(shí)序控制結(jié)構(gòu),在任務(wù)中可以調(diào)用其它的任務(wù)和函數(shù);

  3. 可重入任務(wù)使用關(guān)鍵字automatic進(jìn)行定義,它的每一次調(diào)用都對(duì)不同的地址空間進(jìn)行操作。因此在被多次并發(fā)調(diào)用時(shí),它仍然可以獲得正確的結(jié)果;

  4. 函數(shù)只能有一個(gè)返回值,并且至少要有一個(gè)輸入變量;在函數(shù)中不能使用延遲、事件和時(shí)序控制結(jié)構(gòu),但可以調(diào)用其它函數(shù),不能調(diào)用任務(wù);

  5. 當(dāng)聲明函數(shù)時(shí),Verilog仿真器都會(huì)隱含的聲明一個(gè)同名的寄存器變量,函數(shù)的返回值通過這個(gè)寄存器傳遞回調(diào)用處;

  6. 遞歸函數(shù)使用關(guān)鍵詞automatic進(jìn)行定義,遞歸函數(shù)的每一次調(diào)用都擁有不同的地址空間,因此對(duì)這種函數(shù)的遞歸調(diào)用和并發(fā)調(diào)用可以得到正確的結(jié)果;

  7. 任務(wù)和函數(shù)都包含在設(shè)計(jì)層次之中,可以通過層次名對(duì)它們進(jìn)行調(diào)用。


0411綜合與不可綜合語法


  • 一般綜合工具支持的verilog HDL結(jié)構(gòu):


  • 一般工具忽略的verilog HDL結(jié)構(gòu)


  • 一般綜合工具不支持的verilog HDL結(jié)構(gòu)


0412建立可綜合模型的原則

  1. 不使用initial。

  2. 不使用#10

  3. 不使用循環(huán)次數(shù)不確定的循環(huán)語句,如forever、while等。

  4. 不使用用戶自定義原語(UDP元件)。

  5. 盡量使用同步方式設(shè)計(jì)電路。

  6. 除非是關(guān)鍵路徑的設(shè)計(jì),一般不采用調(diào)用門級(jí)元件來描述設(shè)計(jì)的方法,建議采用行為語句來完成設(shè)計(jì)。

  7. always過程塊描述組合邏輯,應(yīng)在敏感信號(hào)列表中列出所有的輸入信號(hào)。

  8. 所有的內(nèi)部寄存器都應(yīng)該能夠被復(fù)位,在使用FPGA實(shí)現(xiàn)設(shè)計(jì)時(shí),應(yīng)盡量使用器件的全局復(fù)位端作為系統(tǒng)總的復(fù)位。

  9. 對(duì)時(shí)序邏輯描述和建模,應(yīng)盡量使用非阻塞賦值方式。對(duì)組合邏輯描述和建模,既可以用阻塞賦值,也可以用非阻塞賦值。但在同一個(gè)過程塊中,最好不要同時(shí)用阻塞賦值和非阻塞賦值。

  10. 不能在一個(gè)以上的always過程塊中對(duì)同一個(gè)變量賦值。而對(duì)同一個(gè)賦值對(duì)象不能既使用阻塞式賦值,又使用非阻塞式賦值。

  11. 如果不打算把變量推導(dǎo)成鎖存器,那么必須在if語句或case語句的所有條件分支中都對(duì)變量明確地賦值。

  12. 避免混合使用上升沿和下降沿觸發(fā)的觸發(fā)器。

  13. 同一個(gè)變量的賦值不能受多個(gè)時(shí)鐘控制,也不能受兩種不同的時(shí)鐘條件(或者不同的時(shí)鐘沿)控制。

  14. 避免在case語句的分支項(xiàng)中使用x值或z值。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉