色偷偷偷久久伊人大杳蕉,色爽交视频免费观看,欧美扒开腿做爽爽爽a片,欧美孕交alscan巨交xxx,日日碰狠狠躁久久躁蜜桃

SystemVerilog語言簡介(下)

發(fā)布時間:2010-10-9 22:28    發(fā)布者:conniede
關(guān)鍵詞: SystemVerilog , 函數(shù) , 控制符 , 語言
15. 強(qiáng)制類型轉(zhuǎn)換

Verilog不能將一個值強(qiáng)制轉(zhuǎn)換成不同的數(shù)據(jù)類型。SystemVerilog通過使用’操作符提供了數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換功能。這種強(qiáng)制轉(zhuǎn)換可以轉(zhuǎn)換成任意類型,包括用戶定義的類型。例如:

int’ (2.0 * 3.0) // 將結(jié)果轉(zhuǎn)換為int類型

mytype’ (foo) // 將foo轉(zhuǎn)換為mytype類型

一個值還可以通過在強(qiáng)制轉(zhuǎn)換操作符前指定一個10進(jìn)制數(shù)來轉(zhuǎn)換成不同的向量寬度,例如:

17’ (x - 2) // 將結(jié)果轉(zhuǎn)換為17位寬度

也可以將結(jié)果轉(zhuǎn)換成有符號值,例如:

signed’ (x) // 將x轉(zhuǎn)換為有符號值

16. 操作符

Verilog沒有C語言的遞增(++)和遞減(--)操作符。而SystemVerilog加入了幾個新的操作符:

 ++和--:遞增和遞減操作符;

 +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、<<<=和>>>=賦值操作符;

17. 唯一性和優(yōu)先級決定語句

在Verilog中,如果沒有遵循嚴(yán)格的編碼風(fēng)格,它的if-else和case語句會在RTL仿真和RTL綜合間具有不一致的結(jié)果。如果沒有正確使用full_case和parallel_case綜合指令還會引起一些其它的錯誤。

SystemVerilog能夠顯式地指明什么時候一條決定語句的分支是唯一的,或者什么時候需要計(jì)算優(yōu)先級。我們可以在if或case關(guān)鍵字之前使用 unique或requires關(guān)鍵字。這些關(guān)鍵字可以向仿真器、綜合編譯器、以及其它工具指示我們期望的硬件類型。工具使用這些信息來檢查if或 case語句是否正確建模了期望的邏輯。例如,如果使用unique限定了一個決定語句,那么在不希望的case值出現(xiàn)的時候仿真器就能夠發(fā)布一個警告信息。

bit [2:0] a;

unique if ((a==0) || (a==1)) y = in1;

else if (a==2) y = in2;

else if (a==4) y = in3; // 值3、5、6、7會引起一個警告

priority if (a[2:1]==0) y = in1; // a是0或1

else if (a==0) y = in2; // a是2或3

else y = in3; // 如果a為其他的值

unique case (a)

0, 1: y = in1;

2: y = in2;

4: y = in3;

endcase // 值3、5、6、7會引起一個警告

priority casez (a)

2’b00? : y = in1; // a是0或1

2’b0?? : y = in2; // a是2或3

default : y = in3; //如果a為其他的值

endcase

18. 底部檢測的循環(huán)

Verilog包含for、while和repeat循環(huán),這幾個循環(huán)都是在循環(huán)的起始處檢測循環(huán)條件。SystemVerilog加入了一個do-while循環(huán),這種循環(huán)在執(zhí)行語句的結(jié)尾處檢測循環(huán)條件。

19. 跳轉(zhuǎn)語句

在語句的執(zhí)行過程中,C語言提供了幾種方式來跳轉(zhuǎn)到新的語句,包括:return、break、continue和goto。在Verilog中除了通過使用disable語句跳轉(zhuǎn)到語句組的尾部外,沒有提供任何其它跳轉(zhuǎn)語句。使用disable語句執(zhí)行中止和繼續(xù)功能要求加入塊的名字,并且會產(chǎn)生不直觀的代碼。SystemVerilog加入了C語言的break和continue關(guān)鍵字,這兩個關(guān)鍵字不要求使用塊名字。另外,SystemVerilog還加入了一個return關(guān)鍵字,它可以用來在任何執(zhí)行點(diǎn)上退出一個任務(wù)或函數(shù)。

break:退出一個循環(huán),與C語言相同;

continue:跳轉(zhuǎn)到一個循環(huán)的尾部,與C語言相同;

return 表達(dá)式:退出一個函數(shù);

return:退出一個任務(wù)或void類型的函數(shù)。

SystemVerilog沒有包含C語言中的goto語句。

20. 塊名字和語句標(biāo)簽

在Verilog中,我們可以通過在begin或fork關(guān)鍵字之后指定名字來為begin-end或fork-jion語句指定名字。這個指定的名字代表整個語句塊。SystemVerilog還允許在end或jion關(guān)鍵字之后指定一個匹配的塊名字。這種機(jī)制很容易將end或jion與對應(yīng)的 begin或fork聯(lián)系起來,尤其是在一個長的塊或嵌套的塊中。塊結(jié)尾處的名字是可選的,但如果使用的話,它必須與塊起始處的名字相同。例如:  

begin: foo// 在begin之后的塊名字



fork: bar // 具有名字的嵌套的塊



jion: bar // 必須具有相同的名字



end: foo // 必須具有相同的名字

SystemVerilog還允許像C語言一樣為單個語句設(shè)置標(biāo)簽。語句標(biāo)簽放置在語句的前面,用來標(biāo)識這條語句。例如:

initial begin

test1: read_enable = 0;



test2: for (i=0; i<=255; i++)



end

21. 對事件控制的增強(qiáng)

Verilog使用@標(biāo)記來控制基于特定事件的執(zhí)行流,SystemVerilog增強(qiáng)了@事件控制。

*有條件的事件控制

@標(biāo)記的一個基本應(yīng)用就是推斷一個具有使能輸入的鎖存器。下面的例子演示了一個鎖存器建模的基本風(fēng)格。

always @(data or en)

if (en) y <= data;

這種編碼風(fēng)格對仿真來說是效率低下的,因?yàn)榧词乖谑鼓茌斎霟o效的時候,數(shù)據(jù)輸入的每次改變都會觸發(fā)事件控制。

SystemVerilog在事件控制中加入了一個iff條件。只有iff條件為真的條件下,事件控制才會被觸發(fā)。通過將使能判斷移入到事件控制里面,使得只有在鎖存器輸出能夠改變的時候事件控制才會被觸發(fā)。例如:

always @(a or en iff en==1)

y <= a;

* 事件控制中的表達(dá)式

Verilog允許在@事件控制列表中使用表達(dá)式,例如:

always @((a * b))

always @(memory[address])

在第一個例子中,是當(dāng)操作數(shù)發(fā)生改變的時候還是只有當(dāng)運(yùn)算結(jié)果發(fā)生改變的時候才會觸發(fā)事件控制?在第二個例子中,是當(dāng)memory的地址發(fā)生變化的時候還是只有當(dāng)memory的值發(fā)生變化的時候才會觸發(fā)事件控制?當(dāng)@事件控制中包含表達(dá)式的時候,IEEE Verilog標(biāo)準(zhǔn)允許仿真器進(jìn)行不同的優(yōu)化。這就可能導(dǎo)致在不同的仿真器間有不同的仿真結(jié)果,可能還會導(dǎo)致仿真與綜合之間的結(jié)果不一致。

SystemVerilog加入了一個changed關(guān)鍵字,在事件控制列表中它被用作一個修飾符。@(changed (表達(dá)式))能夠顯式地定義只有當(dāng)表達(dá)式的結(jié)果發(fā)生改變的時候才會觸發(fā)事件控制。例如:

always @(changed (a * b))

always @(changed memory[address])

* 事件控制中的賦值

Verilog不允許在事件控制中使用賦值。SystemVerilog允許在事件控制中使用賦值表達(dá)式。事件控制僅僅敏感于賦值表達(dá)式右側(cè)的變化。例如:

always @(y = a * b)

22. 新的過程

Verilog使用always過程來表示時序邏輯、組合邏輯和鎖存邏輯的RTL模型。綜合工具和其它軟件工具必須根據(jù)過程起始處的事件控制列表以及過程內(nèi)的語句來推斷always過程的意圖。這種推斷會導(dǎo)致仿真結(jié)果和綜合結(jié)果之間的不一致。SystemVerilog增加了三個新的過程來顯式地指示邏輯的意圖。

always_ff:表示時序邏輯的過程;

always_comb:表示組合邏輯的過程;

always_latch:表示鎖存邏輯的過程。

例如:

always_comb @(a or b or sel) begin

if (sel) y = a;

else y = b;

end

軟件工具能夠檢查事件控制敏感列表和過程的內(nèi)容來保證邏輯的功能匹配過程的類型。例如,工具能夠檢查一個always_comb過程能夠敏感過程內(nèi)讀取的所有外部值,對邏輯的每一個分支的相同變量進(jìn)行賦值,并且檢查分支是否覆蓋了所有可能的條件。如果任何一個條件沒有滿足,軟件工具均會報告該過程沒有正確建模組合邏輯。

23. 動態(tài)過程

Verilog通過使用fork-jion提供了一種靜態(tài)的并發(fā)過程。每一個分支都是一個分離的、并行的過程。fork-jion中任何語句的執(zhí)行必須在組內(nèi)的每一個過程完成后才會執(zhí)行。例如:

initial begin

fork

send_packet_task (1, 255, 0);

send_packet_task (7, 128, 5);

watch_result_task (1, 255, 0);

watch_result_task (7, 128, 5);

jion // 所有的任務(wù)必須完成后才會到達(dá)這里

end

SystemVerilog通過process關(guān)鍵字加入了一個新的、動態(tài)的過程。它為一個過程產(chǎn)生分支,然后繼續(xù)執(zhí)行而無需等待其他過程完成。過程不會阻塞過程或任務(wù)內(nèi)的語句執(zhí)行。這種方式能夠建模多線程的過程。例如:  
initial begin

process send_packet_task (1, 255, 0);

process send_packet_task (7, 128, 5);

process watch_result_task (1, 255, 0);

process watch_result_task (7, 128, 5);

end // 所有的過程并行運(yùn)行

24. 任務(wù)和函數(shù)增強(qiáng)

SystemVerilog為Verilog的任務(wù)和函數(shù)作了幾個增強(qiáng)。

* 靜態(tài)和自動的存儲

缺省情況下,在Verilog任務(wù)或函數(shù)內(nèi)的所有存儲都是靜態(tài)的。Verilog-2001允許將任務(wù)和函數(shù)聲明成自動的。在SystemVerilog 中:(1). 在一個靜態(tài)任務(wù)和函數(shù)內(nèi)的特定數(shù)據(jù)可以顯式地聲明成自動的。聲明成自動的數(shù)據(jù)在塊中具有完整的生命周期,并且在任務(wù)和函數(shù)調(diào)用的入口處初始化;(2). 在一個自動的任務(wù)或函數(shù)中的特定數(shù)據(jù)可以顯式地聲明成靜態(tài)的。自動的任務(wù)或函數(shù)中聲明成靜態(tài)的數(shù)據(jù)在一個塊的本地范圍內(nèi)具有靜態(tài)的生命周期。

* 從任何點(diǎn)返回

Verilog在一個任務(wù)或函數(shù)中執(zhí)行到endtask或endfunction關(guān)鍵字的時候返回。函數(shù)的返回值是給函數(shù)名賦的最后一個值。SystemVerilog加入了一個return關(guān)鍵字,使用這個關(guān)鍵字,一個任務(wù)或函數(shù)可以在任何點(diǎn)上返回。

*多語句

Verilog要求一個任務(wù)或函數(shù)只具有一個語句或語句塊。多條語句必須組合到一個單一的begin-end或fork-jion塊中。 SystemVerilog去除了這種限制。因此,多條語句可以在一個任務(wù)或函數(shù)中列出而無需使用的begin-end或fork-jion。每有分組的語句就像在begin-end中一樣順序執(zhí)行。我們還可以產(chǎn)生一個沒有語句的任務(wù)或函數(shù)定義。

*void函數(shù)

Verilog要求一個函數(shù)具有一個返回值,函數(shù)的調(diào)用接收這個返回值。

SystemVerilog加入了一個void數(shù)據(jù)類型,這個數(shù)據(jù)類型可以作為一個函數(shù)的返回值類型。void函數(shù)可以像Verilog任務(wù)一樣進(jìn)行調(diào)用,而無需接收一個返回值。

void函數(shù)和任務(wù)的差別在于函數(shù)存在幾個限制,例如沒有時間控制等。

*函數(shù)的輸入和輸出

Verilog標(biāo)準(zhǔn)要求一個函數(shù)至少具有一個輸入并且函數(shù)只能具有輸入。SystemVerilog去除了這些限制。函數(shù)可以具有任意數(shù)目的輸入、輸出以及輸入輸出,也可以什么也沒有。

25. 連續(xù)賦值的增強(qiáng)

在Verilog中,連續(xù)賦值語句的左側(cè)只能是線網(wǎng)類型,例如wire。連續(xù)賦值語句被認(rèn)為是線網(wǎng)的驅(qū)動源,而線網(wǎng)可以擁有任意數(shù)據(jù)的驅(qū)動源。 SystemVerilog允許除reg類型以外的任何數(shù)據(jù)類型用于連續(xù)賦值語句的左側(cè)。與線網(wǎng)不同,所有其它數(shù)據(jù)類型被限制為只能有一個連續(xù)賦值語句驅(qū)動。為相同的變量混合使用連續(xù)賦值語句和過程賦值語句是不被允許的。

26. $bit系統(tǒng)函數(shù)

在Verilog中沒有類似于C語言中sizeof的函數(shù)。SystemVerilog加入一個新的$bit內(nèi)建函數(shù)。這個函數(shù)返回保存一個值所需的硬件位的數(shù)目(一個四態(tài)值要求一個硬件位),這個函數(shù)還可以用來確定一個結(jié)構(gòu)體所代表的硬件位的數(shù)目。

27. `define的增強(qiáng)

SystemVerilog增強(qiáng)了`define編譯器指令的能力以便支持將字符串作為宏的參數(shù)。宏的文本字符串中可以包含一個隔離的引號,它的前面必須具有一個反勾號(`”),這就允許字符串中包含宏參數(shù)。宏文本可以在行的尾部包含一個反斜杠(’’)來表示在下一行繼續(xù)。如果宏文本字符串中包含反斜杠,則反斜杠應(yīng)該被放在兩個反勾號之間,這樣它就不會被認(rèn)為是Verilog轉(zhuǎn)義標(biāo)識符的開始。宏文本字符串還可以包含雙反勾號(``),它允許標(biāo)識符能夠從參數(shù)中構(gòu)建。這些增強(qiáng)使得`define指令更加靈活。例如:`include指令后可以緊跟一個宏名字來替代一個字符串。

`define f1 “../project_top/opcode_defines”

`include `f1

28. 狀態(tài)機(jī)建模

SystemVerilog允許在更高的抽象層次上對狀態(tài)機(jī)建模。這些結(jié)構(gòu)包括:

*枚舉類型

*一個特殊的state數(shù)據(jù)類型;

*一個遷移語句

*一個遷移操作符

29. 斷言

SystemVerilog中加入了斷言的功能來改善系統(tǒng)的驗(yàn)證過程。

30. 結(jié)論  

SystemVerilog為Verilog-2001標(biāo)準(zhǔn)提供了一系列的擴(kuò)展。這些擴(kuò)展使得大型設(shè)計(jì)的建模和驗(yàn)證更加容易。
本文地址:http://www.54549.cn/thread-31211-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
2611lab 發(fā)表于 2011-5-5 11:38:45
tks
wwof3w 發(fā)表于 2011-12-1 22:06:59
正好,學(xué)習(xí)前有個初步了解,謝樓主!
spy007868 發(fā)表于 2015-3-3 09:11:18
謝謝分享
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表