0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

verilog/systemverilog中隱藏的初始化說(shuō)明

sanyue7758 ? 來(lái)源:硅芯思見 ? 2023-08-25 09:47 ? 次閱讀

Verilog和SystemVerilog中經(jīng)常需要在使用變量或者線網(wǎng)之前,期望變量和線網(wǎng)有對(duì)應(yīng)的初始值,為此經(jīng)常會(huì)在過(guò)程塊或者連續(xù)賦值語(yǔ)句中對(duì)相關(guān)變量或者線網(wǎng)進(jìn)行初始化,這樣的初始化我們稱之為“顯式初始化”,其實(shí)除了這種初始化操作方式之外,也有人會(huì)在變量和線網(wǎng)聲明的同時(shí)進(jìn)行初始化,這種初始化方式成為“隱式初始化”,只不過(guò)在使用“隱式初始化”時(shí)經(jīng)常會(huì)出現(xiàn)一些不期望的結(jié)果,下面將通過(guò)示例對(duì)這些初始化操作進(jìn)行說(shuō)明。

1 線網(wǎng)初始化

【示例】

81d1a11c-4294-11ee-a2ef-92fbcf53809c.png

仿真結(jié)果】

81f8f47e-4294-11ee-a2ef-92fbcf53809c.png

示例中,net1在聲明的同時(shí)進(jìn)行了賦值操作(初始化),同時(shí)在代碼中通過(guò)連續(xù)賦值語(yǔ)句對(duì)net1又進(jìn)行了賦值(與聲明時(shí)初始化的值不同),此時(shí)從仿真結(jié)果可以觀測(cè)到net1顯示結(jié)果為不定態(tài);net2在聲明時(shí)并沒有進(jìn)行賦值操作,對(duì)其的賦值操作發(fā)生在連續(xù)賦值語(yǔ)句中,從仿真結(jié)果可以看到net2并沒有出現(xiàn)不定態(tài),其獲得了確切的數(shù)值。

出現(xiàn)線網(wǎng)net1這種現(xiàn)象的主要是因?yàn)?strong>線網(wǎng)聲明時(shí)的“初始化”是一種“隱式的連續(xù)賦值語(yǔ)句”,并且在仿真過(guò)程中會(huì)一直保持,當(dāng)有其他語(yǔ)句驅(qū)動(dòng)該線網(wǎng)時(shí),此時(shí)相當(dāng)于對(duì)該線網(wǎng)進(jìn)行了多驅(qū)動(dòng),在仿真波形上就會(huì)表現(xiàn)出不定態(tài)。那么對(duì)于變量的初始化操作是否也會(huì)像示例中net1這樣的情況呢?請(qǐng)看下例。

2 變量初始化

【示例】

820a4cce-4294-11ee-a2ef-92fbcf53809c.png

【仿真結(jié)果】

824f2632-4294-11ee-a2ef-92fbcf53809c.png

編譯報(bào)錯(cuò),從報(bào)錯(cuò)信息上可以知道,var1同時(shí)被過(guò)程塊代碼和結(jié)構(gòu)級(jí)代碼驅(qū)動(dòng),這主要是因?yàn)関ar1為變量,在聲明時(shí)進(jìn)行了初始化,同時(shí)又在連續(xù)賦值語(yǔ)句中也進(jìn)行了賦值,從而導(dǎo)致了編譯錯(cuò)誤,即錯(cuò)誤原因是變量聲明時(shí)進(jìn)行了初始化的話,那么該變量不能作為連續(xù)賦值語(yǔ)句的賦值對(duì)象進(jìn)行使用,即SystemVerilog中不允許對(duì)于同一變量在連續(xù)賦值語(yǔ)句和過(guò)程語(yǔ)句中同驅(qū)動(dòng)。對(duì)上述代碼進(jìn)行修改,如下。

【示例】

8265a876-4294-11ee-a2ef-92fbcf53809c.png

【仿真結(jié)果】

82847972-4294-11ee-a2ef-92fbcf53809c.png

示例中,var1聲明時(shí)進(jìn)行了初始化,但是本例中并沒有其他連續(xù)賦值語(yǔ)句對(duì)該變量的值進(jìn)行修改驅(qū)動(dòng),所以此時(shí)var1中的值在仿真過(guò)程中一直保持,var2在聲明時(shí)沒有進(jìn)行初始化,其值由連續(xù)賦值語(yǔ)句驅(qū)動(dòng)為4’b0100,可見,SystemVerilog中變量可以用于連續(xù)賦值語(yǔ)句中,var3聲明時(shí)進(jìn)行了初始化,但在過(guò)程塊(initial)中對(duì)var3進(jìn)行了修改,此時(shí)var3的值更新為了過(guò)程塊中的值,由此我們可以看出,變量在聲明時(shí)的初始化先于過(guò)程塊的執(zhí)行,其次變量聲明時(shí)的初始化并不具有持續(xù)性,會(huì)被后續(xù)的賦值操作所更新,否則就會(huì)出現(xiàn)多驅(qū)動(dòng)情況,即并不具有“隱式連續(xù)賦值的特點(diǎn)”。

通過(guò)上述示例可以看到,線網(wǎng)聲明時(shí)的初始化實(shí)際上是一種“隱式連續(xù)賦值語(yǔ)句”,其“初始化”具有持續(xù)性,而變量聲明時(shí)的初始化會(huì)被后續(xù)的賦值操作更新,并不具有持續(xù)性,同時(shí)需要注意如果變量在聲明時(shí)進(jìn)行初始化,此時(shí)該變量不能同時(shí)被連續(xù)賦值語(yǔ)句驅(qū)動(dòng)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1018

    瀏覽量

    83746
  • VaR
    VaR
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    11341
  • Verilog語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8235

原文標(biāo)題:verilog/systemverilog 中隱藏的初始化

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問verilog如何實(shí)現(xiàn)SJA1000的初始化

    verilog 如何實(shí)現(xiàn)SJA1000的初始化
    發(fā)表于 11-01 10:03

    手機(jī)模塊初始化向?qū)?/a>

    手機(jī)模塊初始化向?qū)?為了剛好的對(duì)手機(jī)模塊進(jìn)行初始化,所以把最基本的向?qū)懴聛?lái).本向?qū)нm用于本公司的西門子TC35I和華為GT9000模塊。一、在初始化手機(jī)模塊前,請(qǐng)先確定DT
    發(fā)表于 09-18 09:41 ?17次下載

    RDA1846S初始化設(shè)置

    RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置
    發(fā)表于 01-15 17:08 ?0次下載

    UCOS_III_配置與初始化

    UCOS_III_配置與初始化
    發(fā)表于 12-20 22:53 ?5次下載

    objc源碼NSObject如何進(jìn)行初始化

    + alloc 和 - init 這一對(duì)我們?cè)?iOS 開發(fā)每天都要用到的初始化方法一直困擾著我, 于是筆者仔細(xì)研究了一下 objc 源碼 NSObject 如何進(jìn)行初始化。 在具
    發(fā)表于 09-26 09:58 ?0次下載

    SEED-DEC2812初始化函數(shù)說(shuō)明

    SEED-DEC2812系統(tǒng)初始化函數(shù)。
    發(fā)表于 04-13 09:05 ?11次下載
    SEED-DEC2812<b class='flag-5'>初始化</b>函數(shù)<b class='flag-5'>說(shuō)明</b>

    uboot和內(nèi)核里phy的初始化_內(nèi)核里的雙網(wǎng)絡(luò)配置及phy的初始化

    uboot 和內(nèi)核里 phy 的初始化,以及內(nèi)核里的雙網(wǎng)絡(luò)配置及 phy 的初始化。 本文以盈鵬飛嵌入式的CoM-335x(基于AM335x)核心板及網(wǎng)絡(luò)芯片LAN8720 為例,說(shuō)明修改步驟
    的頭像 發(fā)表于 05-17 08:19 ?1.2w次閱讀

    8253初始化程序分享_8253應(yīng)用案例

    本文首先介紹了8253概念及8253各通道的工作方式,其次詳細(xì)介紹了8253初始化要求及編程,最后用一個(gè)例子介紹了8253的初始化程序。
    發(fā)表于 05-23 15:52 ?2.2w次閱讀
    8253<b class='flag-5'>初始化</b>程序分享_8253應(yīng)用案例

    在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問題如何解決

    本文檔的主要內(nèi)容詳細(xì)介紹的是在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問題如何解決。
    發(fā)表于 08-20 17:31 ?0次下載
    在51平臺(tái)下<b class='flag-5'>初始化</b>文件的引入導(dǎo)致全局變量無(wú)法<b class='flag-5'>初始化</b>的問題如何解決

    C++之初始化列表學(xué)習(xí)的總結(jié)

    可以使用初始化列表對(duì)成員進(jìn)行初始化。
    的頭像 發(fā)表于 12-24 17:39 ?849次閱讀

    Armlinux內(nèi)核移植及系統(tǒng)初始化過(guò)程分析

    Armlinux內(nèi)核移植及系統(tǒng)初始化過(guò)程分析說(shuō)明。
    發(fā)表于 04-06 15:53 ?11次下載

    RT-Thread自動(dòng)初始化機(jī)制

    共使用了 6 順序的初始化,本文以其中的一個(gè) INIT_APP_EXPORT(fn) 為例進(jìn)行自動(dòng)初始化的原理分析,其他順序的初始化的原理與之一致。
    的頭像 發(fā)表于 06-17 08:52 ?2655次閱讀
    RT-Thread自動(dòng)<b class='flag-5'>初始化</b>機(jī)制

    VHDL和Verilog數(shù)組定義、初始化、賦值方法

    方法:實(shí)際應(yīng)用里,通常需要在上電復(fù)位過(guò)程對(duì)變量進(jìn)行初始化,如果數(shù)組個(gè)數(shù)少時(shí),直接賦初始值即可,但是數(shù)組個(gè)數(shù)多時(shí),可以用循環(huán)實(shí)現(xiàn)賦值,通常的循環(huán)語(yǔ)句有FOR和WHILE。(注意變量的賦值方式)
    的頭像 發(fā)表于 09-23 14:20 ?1.1w次閱讀

    如何在Segger J-Flash設(shè)置芯片初始化序列?

    許多微控制器在燒錄之前需要一個(gè)自定義的初始化序列來(lái)初始化目標(biāo)硬件,例如初始化PLL時(shí)鐘,關(guān)閉看門狗或定義Flash的等待狀態(tài)。在使用這些對(duì)初始化過(guò)程有特殊要求的芯片時(shí),在Segger
    的頭像 發(fā)表于 12-12 10:56 ?2323次閱讀

    隱式初始化操作說(shuō)明

    VerilogSystemVerilog中經(jīng)常需要在使用變量或者線網(wǎng)之前,期望變量和線網(wǎng)有對(duì)應(yīng)的初始
    的頭像 發(fā)表于 07-24 15:00 ?559次閱讀
    隱式<b class='flag-5'>初始化</b>操作<b class='flag-5'>說(shuō)明</b>