变量初始化的确定性
變量初始化的確定性
SystemVerilog初始化順序
SystemVerilog標(biāo)準(zhǔn)增強(qiáng)了變量的內(nèi)嵌初始化。SystemVerilog規(guī)定所有內(nèi)嵌初始化先于仿真時(shí)刻0執(zhí)行的事件。這就保證了如果Initial或者always過程塊讀取具有內(nèi)嵌初始值的變量時(shí)取得正確的初始值,這個(gè)確定行為消除了Verilog標(biāo)準(zhǔn)中的不確定性。
使用增強(qiáng)的SystemVerilog進(jìn)行的仿真結(jié)果完全包含在允許的、但不確定的使用Verilog進(jìn)行的仿真結(jié)果中,
logic resetN = 0; //聲明并初始化reset always@(posedge clock ,negedge resetN)if(!resetN) count <= 0; //reset低電平有效else count <= count + 1;SystemVerilog中是仿真器在激活always過程塊之前,先進(jìn)行resetN的初始化。此后,仍然在0仿真時(shí)刻,當(dāng)always塊被激活后,它會(huì)等待下一個(gè)時(shí)鐘上升沿或resetN下降沿。因?yàn)閞esetN的初始化已經(jīng)發(fā)生了,計(jì)數(shù)器在0時(shí)刻不會(huì)被觸發(fā),而是等待下一個(gè)時(shí)鐘上升沿或者resetN下降沿。
時(shí)序邏輯的異步輸入初始化
--在仿真時(shí)刻0,使用兩態(tài)數(shù)據(jù)類型施加復(fù)位 module counter (input wire clock,resetN,output logic[15:0] count ); always@(posedge clock,negedge resetN)if(!resetN) count <= 0; //reset低電平有效else count <= count + 1; endmodulemodule test; wire [15:0] count; bit clock; bit resetN = 1;//resetN初始化無效值 counter dut(clock,resetN,count); always #10 clock = ~clock; initial beginresetN = 0;//在0時(shí)刻插入低電平有效的復(fù)位#2 resetN = 1; //在clock上升沿之前去除復(fù)位$display("\n count = %0d(expect 0)\n",count);#1 $finish; end endmodule在上面的例子中,計(jì)數(shù)器有一個(gè)異步的復(fù)位輸入。這個(gè)復(fù)位低電平有效,也就是在resetN跳變?yōu)?時(shí),計(jì)數(shù)器會(huì)被復(fù)位。為了在仿真時(shí)刻0時(shí)對(duì)計(jì)數(shù)器進(jìn)行復(fù)位,resetN輸入必須跳變?yōu)檫壿?。如果resetN被聲明為一個(gè)兩態(tài)的數(shù)據(jù)類型,例如bit。如上面的測(cè)試平臺(tái)例子,其缺省初始值是邏輯0。測(cè)試平臺(tái)中的第一個(gè)測(cè)試是通過將resetN置為0來插入復(fù)位。第一個(gè)測(cè)試不會(huì)引發(fā)對(duì)resetN的仿真事件,因此counter模塊的敏感列表不會(huì)因resetN的變化而觸發(fā)過程塊對(duì)counter復(fù)位。
為保證resetN置為0時(shí)resetN發(fā)生變化,resetN的帶內(nèi)嵌初始化聲明為邏輯1–復(fù)位無效狀態(tài)
SystemVerilog內(nèi)嵌變量初始化的確定性可以保證0仿真時(shí)刻事件的發(fā)生順序。如果變量使用內(nèi)嵌初始化設(shè)成無效狀態(tài),然后使用initial或者always過程塊置為有效狀態(tài),SystemVerilog就保證了內(nèi)嵌初始化先發(fā)生,然后才進(jìn)行過程塊初始化賦值。
強(qiáng)制類型裝換
SystemVerilog加入強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換的能力。強(qiáng)制類型轉(zhuǎn)換不同于在賦值時(shí)轉(zhuǎn)變?yōu)閿?shù)值。使用強(qiáng)制類型轉(zhuǎn)換,不用賦值,在一個(gè)表達(dá)式內(nèi),一個(gè)數(shù)值就可以轉(zhuǎn)換成一個(gè)新的類型。
(1)靜態(tài)轉(zhuǎn)換(編譯時(shí)轉(zhuǎn)換)
靜態(tài)強(qiáng)制轉(zhuǎn)換和錯(cuò)誤檢測(cè)
靜態(tài)強(qiáng)制轉(zhuǎn)換操作符是一種編譯時(shí)的轉(zhuǎn)換。要強(qiáng)制轉(zhuǎn)換的表達(dá)式在運(yùn)行時(shí)總會(huì)被轉(zhuǎn)換,而不會(huì)檢查要轉(zhuǎn)換的表達(dá)式是否在要轉(zhuǎn)換成的類型的合法范圍內(nèi)。因此,必須注意不能將非法值賦給變量。
(2)動(dòng)態(tài)強(qiáng)制類型轉(zhuǎn)換
上面描述的SystemVerilog強(qiáng)制類型轉(zhuǎn)換是一種編譯時(shí)轉(zhuǎn)換,轉(zhuǎn)換操作總會(huì)運(yùn)行,而不會(huì)檢測(cè)結(jié)果的有效性。如果需要進(jìn)一步的檢驗(yàn),SystemVerilog提供一個(gè)新的系統(tǒng)函數(shù)$cast,這是動(dòng)態(tài)的,在運(yùn)行時(shí)進(jìn)行待轉(zhuǎn)換數(shù)值的檢查。
系統(tǒng)函數(shù) $cast有兩個(gè)變量,一個(gè)目標(biāo)函數(shù)和一個(gè)源變量
$cast試圖將源表達(dá)式賦給目標(biāo)變量。如果賦值是無效的,將會(huì)報(bào)告一個(gè)運(yùn)行時(shí)錯(cuò)誤,并且目標(biāo)變量保持不變。
將real類型轉(zhuǎn)換成int類型,而實(shí)數(shù)太大,沒有辦法用int來描述
將一個(gè)數(shù)值轉(zhuǎn)換成枚舉類型,而它不在枚舉類型的合法值列表中
$cast也可作為任務(wù)被調(diào)用
$cast可以作為系統(tǒng)函數(shù)調(diào)用,它會(huì)返回一個(gè)狀態(tài)標(biāo)志來顯示強(qiáng)制類型轉(zhuǎn)換成功與否。如果轉(zhuǎn)換成功, $cast返回1,;如果不成功, $cast函數(shù)返回0,并且不改變目標(biāo)變量。作為函數(shù)調(diào)用時(shí),不報(bào)告運(yùn)行時(shí)錯(cuò)誤。
靜態(tài)的編譯時(shí)強(qiáng)制轉(zhuǎn)換操作是可綜合的。綜合工具可能不支持動(dòng)態(tài)的$cast系統(tǒng)函數(shù)。一般情況下,系統(tǒng)任務(wù)和系統(tǒng)函數(shù)不是一種可綜合的結(jié)構(gòu)。用于綜合的更好的編碼方式是使用靜態(tài)強(qiáng)制轉(zhuǎn)換操作符進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
常數(shù)
parameter是一個(gè)可用確立(elaboration)時(shí)使用defparam或者內(nèi)嵌參數(shù)重定義進(jìn)行重新定義的常數(shù)。 specparam是一個(gè)可以在確立時(shí)從SDF文件中重定義的常數(shù)。 localparam是確立期常數(shù),不能重定義。但是它的值可以基于其他常數(shù)。常數(shù)負(fù)層次引用值不合法
常數(shù)不允許在自動(dòng)任務(wù)和函數(shù)中
SystemVerilog加入了將任何變量聲明為常數(shù)的能力–使用const關(guān)鍵字。const形式的常數(shù)知道確立完成后才被賦值。因?yàn)閏onst常量在確立后才獲得值,因此一個(gè)const常數(shù)可以:
- 在自動(dòng)任務(wù)和函數(shù)等動(dòng)態(tài)環(huán)境中聲明
- 被賦予一個(gè)線網(wǎng)或變量值而非常數(shù)表達(dá)式
- 被賦予一個(gè)對(duì)象值,這個(gè)值可以在任何設(shè)計(jì)層次定義。
const常數(shù)的聲明必須包含數(shù)據(jù)類型
const logic[23:0] c1 = 7; //24為常數(shù) const int c2 = 15; //32位常數(shù) const real c3 = 3.14; // 實(shí)數(shù)常數(shù) const c4 = 5; //錯(cuò)誤,沒有數(shù)據(jù)類型const可以用在自動(dòng)任務(wù)和函數(shù)中。
一個(gè)const常數(shù)實(shí)質(zhì)是一個(gè)只能被初始化的變量。因?yàn)閏onst形式的常數(shù)是在運(yùn)行期間確定數(shù)值而不是確立期。一個(gè)const常數(shù)可以在自動(dòng)任務(wù)和函數(shù)中聲明,也可以在模塊、靜態(tài)任務(wù)和函數(shù)中聲明。在begin…end塊和fork…join塊中聲明的變量也可以聲明為一個(gè)常數(shù)變量。
總結(jié)
- 上一篇: QQ 音乐内测 12.0.5 版本,可以
- 下一篇: 逆天!疑似魅族20 Pro外观设计曝光