從學(xué)校里開(kāi)始,我所接觸的就一直是VerilogHDL而非更老牌的VHDL,而且后續(xù)接觸的項(xiàng)目中也多半是Verilog的用戶,坦白的講,Verilog的活力也確實(shí)更足一些,從IEEE1800-2005開(kāi)始的SystemVerilog的標(biāo)準(zhǔn)化,將Verification和Design的一體化的嘗試,我個(gè)人認(rèn)為,是走在正確的道路上。
所以,我確實(shí)想不到,我竟然也要回頭學(xué)起VHDL來(lái)了,畢竟一些老牌公司,特別是歐洲的公司,往往因?yàn)闅v史原因,仍然在使用VHDL,看來(lái)終究是繞不過(guò)去的了——正如一個(gè)Design Verification工程師在目前想完全的不和SpecmanE打交道是很難的一樣。
下面記載的是兩種語(yǔ)言學(xué)習(xí)過(guò)程中的一些體會(huì),而且更多的是從語(yǔ)法角度出發(fā),算是梳理一下思路吧,而且,以前從來(lái)沒(méi)有接觸過(guò)VHDL,當(dāng)然會(huì)存在很多非常初級(jí)的東西。
而在本文之后,打算再寫一篇簡(jiǎn)單闡述下結(jié)合Cadence的IUS工具,使用SystemVerilog對(duì)VHDL進(jìn)行驗(yàn)證的基本方法。
起手式
從Verilog撞進(jìn)VHDL的世界,有些東西要先搞清楚,否則會(huì)一頭霧水:
1. 大小寫敏感: Verilog是大小寫敏感的,VHDL則非;
2. 注釋:Verilog的行注釋為//,塊注釋為/**/;VHDL只支持行注釋–;[1. 這個(gè)算是不方便的一個(gè)地方了,不過(guò)不論是在Vim還是Emacs當(dāng)中,批量做行注釋也很容易實(shí)現(xiàn);]
基本結(jié)構(gòu)
VHDL被認(rèn)為是要求更嚴(yán)格,更多講究的語(yǔ)言,相比和C類似的Verilog,架構(gòu)上更嚴(yán)謹(jǐn)一些:
1. 基本結(jié)構(gòu):從上往下為
USE定義區(qū)(調(diào)用庫(kù)和包);
Package定義區(qū)(自定義程序包);
Entity定義區(qū)(定義電路實(shí)體外觀,I/O接口的規(guī)格);[2. Entity感覺(jué)像是C的頭文件定義之類的東西,而在Verilog當(dāng)中,這些其實(shí)都是被整合在Module里頭一起完成了。]
Architecture定義區(qū)(描述內(nèi)部功能);[3. 同上,相當(dāng)于Verilog的Module內(nèi)部實(shí)現(xiàn)。]
Configuration定義區(qū)(決定那個(gè)Architecture被使用)[4. 這也許就是之所以要分開(kāi)Arch和Entity的原因,類似的效果在Verilog里實(shí)現(xiàn),則需要使用那個(gè)configuration blocks/library map files這些在Verilog 2001當(dāng)中增加的features,不過(guò)這些部分在Verilog當(dāng)中屬于Beyond language,更多的是位于語(yǔ)言之上的scope中了。]
2. 并行與串行:
在這一點(diǎn)上,VHDL和Verilog有些類似,書(shū)寫在Architecture內(nèi)的語(yǔ)句,直接被認(rèn)為是并行執(zhí)行,無(wú)論書(shū)寫順序的(就如同Verilog中的并列的Always語(yǔ)句塊);而順序執(zhí)行的串行語(yǔ)句必須放置在進(jìn)程語(yǔ)句(process)當(dāng)中,正如Verilog的begin…end。
3. process:
和Verilog不同的是這里的Process是要求有敏感變量列表作為輸入的,正如試圖在Verilog中用Always語(yǔ)句實(shí)現(xiàn)組合邏輯時(shí)類似。所以當(dāng)寫這樣的語(yǔ)句,不妨多回想Verilog中對(duì)于敏感變量列表的要求。
4. 例化:
在VHDL當(dāng)中嘗試?yán)粋€(gè)entity,比起Verilog要麻煩不少。首先,必須在Architecture當(dāng)中用Component語(yǔ)法來(lái)聲明這個(gè)實(shí)體的Port和Generic(參數(shù));然后才可在后續(xù)內(nèi)容當(dāng)中例化實(shí)體,并且用generic map和port map來(lái)進(jìn)行參數(shù)賦值和port連接。
5. 庫(kù),包和配置:
VHDL這方面的組織比起Verilog顯然要嚴(yán)密多了,使用configuration,用簡(jiǎn)單的語(yǔ)句,就可以把不同的architecture實(shí)現(xiàn)和entity實(shí)現(xiàn)綁定,而此時(shí)我們就能看出VHDL之所以要分開(kāi)所謂entity和architecture的目的所在了。
CONFIGURATION 配置名 OF 實(shí)體名 IS
FOR 為實(shí)體選配的構(gòu)造體名
END FOR;
END 配置名;
而事實(shí)上,configuration還可以直接指定某個(gè)Hierachy的某個(gè)實(shí)體究竟適用那種entity來(lái)例化,語(yǔ)法如下(參見(jiàn)VHDL Configuration):
configuration TopMixed of Top is —TopMixed是配置名,Top是實(shí)體名
for Structure —Structure是結(jié)構(gòu)體名,是和實(shí)體Top相對(duì)應(yīng)的結(jié)構(gòu)體
for B1: Blk —B1和B2是結(jié)構(gòu)體structure中的元件例化語(yǔ)句的標(biāo)號(hào)
use entity Work.Blk(RTL);— 此語(yǔ)句說(shuō)明,在元件例化的時(shí)候,利用用戶自定義
—的實(shí)體blk來(lái)例化,其結(jié)構(gòu)體是RTL
end for;
for B2: Blk
use entity Work.GateLevelBlk(Synth)— 此語(yǔ)句說(shuō)明,元件例化B2時(shí),利用實(shí)體
—GateLevelBLK對(duì)應(yīng)的Synth構(gòu)造體來(lái)例化
port map (IP => To_Vector(A),
To_Int8(OP) => F);
end for;
end for;
end TopMixed;
只不過(guò)這似乎太麻煩了一點(diǎn)。而Library和Package更好理解一些。用戶可以將一些公共的定義統(tǒng)一靠Package和Package Body的關(guān)鍵字來(lái)定義到一個(gè)包里面去,而這些包又可以被編譯在Library當(dāng)中。不過(guò)Library的建立似乎只依賴于工具的解決,例如在編譯的時(shí)候選擇將包內(nèi)容編譯到某個(gè)庫(kù)之中,然后再使用。
使用的過(guò)程,則是利用Library,Use等關(guān)鍵字來(lái)import這些內(nèi)容。而要提醒的是,當(dāng)前編譯代碼都是被認(rèn)為是缺省的編入到了work庫(kù)當(dāng)中,所以如果需要引用代碼中定義的某個(gè)包內(nèi)容,應(yīng)該用 work.
操作
1. 強(qiáng)類型語(yǔ)言:
VHDL是強(qiáng)類型語(yǔ)言,對(duì)類型要求非常嚴(yán),一個(gè)對(duì)象只能有一種數(shù)據(jù)類型,而且不同類型數(shù)據(jù)間賦值是嚴(yán)格禁止的,這點(diǎn)Verilog用戶應(yīng)當(dāng)注意。
2. Procedure和Function:
很好理解,直接對(duì)應(yīng)Verilog的Task和Function,需要注意的就是在VHDL中還可以對(duì)Function進(jìn)行重載,這個(gè),也許有用吧。
3. 屬性:
VHDL針對(duì)不同的對(duì)象,都具有不同的屬性,這些屬性不妨理解成Verilog當(dāng)中的Predefined tasks or methods,但是似乎更加的豐富和多樣,相信能夠有效的減少代碼量。
小結(jié)
本文目的不在于語(yǔ)法的教程或者指導(dǎo)(本來(lái)我也剛看VHDL不過(guò)一個(gè)下午而已……),更希望能夠迅速、扼要的抽出VHDL和Verilog的一些區(qū)別和共性,加速學(xué)習(xí)的過(guò)程。不過(guò),我相信,一個(gè)熟悉Verilog的工程師,在吃透了上面這些不同點(diǎn)后,至少可以跌跌撞撞的開(kāi)始寫VHDL代碼了,更多的東西,自然需要在實(shí)踐中去體會(huì)和學(xué)習(xí)。
接下來(lái),我的計(jì)劃是結(jié)合Cadence的IUS工具,寫一寫最基本的SystemVerilog對(duì)于VHDL的驗(yàn)證的QuickStart了。[5. 從目前了解的來(lái)看,VHDL對(duì)于驗(yàn)證方面的支持還真是有限,比起Verilog都有所不及,在最基本的打印,仿真控制上都要麻煩一些,所以,這種情況下,干脆一律交給SystemVerilog/Vera/E/去做,可能還更直接一些]