0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

隐式初始化操作说明

sanyue7758 来源:硅芯思见 2023-07-24 15:00 次阅读

Verilog和SystemVerilog中经常需要在使用变量或者线网之前,期望变量和线网有对应的初始值,为此经常会在过程块或者连续赋值语句中对相关变量或者线网进行初始化,这样的初始化我们称之为“显式初始化”,其实除了这种初始化操作方式之外,也有人会在变量和线网声明的同时进行初始化,这种初始化方式成为“隐式初始化”,只不过在使用“隐式初始化”时经常会出现一些不期望的结果,下面将通过示例对这些初始化操作进行说明。

1 线网初始化

【示例】

54632f9c-29ef-11ee-a368-dac502259ad0.png

仿真结果】

54712a98-29ef-11ee-a368-dac502259ad0.png

示例中,net1在声明的同时进行了赋值操作(初始化),同时在代码中通过连续赋值语句对net1又进行了赋值(与声明时初始化的值不同),此时从仿真结果可以观测到net1显示结果为不定态;net2在声明时并没有进行赋值操作,对其的赋值操作发生在连续赋值语句中,从仿真结果可以看到net2并没有出现不定态,其获得了确切的数值。出现线网net1这种现象的主要是因为线网声明时的“初始化”是一种“隐式的连续赋值语句”,并且在仿真过程中会一直保持,当有其他语句驱动该线网时,此时相当于对该线网进行了多驱动,在仿真波形上就会表现出不定态。那么对于变量的初始化操作是否也会像示例中net1这样的情况呢?请看下例。

2 变量初始化

【示例】

547f69b4-29ef-11ee-a368-dac502259ad0.png

【仿真结果】

5499f090-29ef-11ee-a368-dac502259ad0.png

编译报错,从报错信息上可以知道,var1同时被过程块代码和结构级代码驱动,这主要是因为var1为变量,在声明时进行了初始化,同时又在连续赋值语句中也进行了赋值,从而导致了编译错误,即错误原因是变量声明时进行了初始化的话,那么该变量不能作为连续赋值语句的赋值对象进行使用,即SystemVerilog中不允许对于同一变量在连续赋值语句和过程语句中同驱动。对上述代码进行修改,如下。

【示例】

54b40052-29ef-11ee-a368-dac502259ad0.png

【仿真结果】

54c277c2-29ef-11ee-a368-dac502259ad0.png

示例中,var1声明时进行了初始化,但是本例中并没有其他连续赋值语句对该变量的值进行修改驱动,所以此时var1中的值在仿真过程中一直保持,var2在声明时没有进行初始化,其值由连续赋值语句驱动为4’b0100,可见,SystemVerilog中变量可以用于连续赋值语句中,var3声明时进行了初始化,但在过程块(initial)中对var3进行了修改,此时var3的值更新为了过程块中的值,由此我们可以看出,变量在声明时的初始化先于过程块的执行,其次变量声明时的初始化并不具有持续性,会被后续的赋值操作所更新,否则就会出现多驱动情况,即并不具有“隐式连续赋值的特点”

通过上述示例可以看到,线网声明时的初始化实际上是一种“隐式连续赋值语句”,其“初始化”具有持续性,而变量声明时的初始化会被后续的赋值操作更新,并不具有持续性,同时需要注意如果变量在声明时进行初始化,此时该变量不能同时被连续赋值语句驱动。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    52

    文章

    8079

    浏览量

    145749
  • 仿真器
    +关注

    关注

    14

    文章

    1011

    浏览量

    83581
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8204

原文标题:隐藏的初始化

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread自动初始化详解

    初始化函数不需要被显调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行,非常的方便。 1 普通初始化 前面也讲了,我们在写单片机的程序时,需要对硬件进行初始化
    的头像 发表于 06-25 21:38 1.1w次阅读
    RT-Thread自动<b class='flag-5'>初始化</b>详解

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 939次阅读
    自动<b class='flag-5'>初始化</b>机制原理详解

    手机模块初始化向导

    手机模块初始化向导:为了刚好的对手机模块进行初始化,所以把最基本的向导写下来.本向导适用于本公司的西门子TC35I和华为GT9000模块。一、在初始化手机模块前,请先确定DT
    发表于 09-18 09:41 17次下载

    RDA1846S初始化设置

    RDA1846S初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 0次下载

    UCOS_III_配置与初始化

    UCOS_III_配置与初始化
    发表于 12-20 22:53 5次下载

    HX711初始化程序

    这是HX711的初始化程序
    发表于 02-08 01:51 89次下载

    嵌入开发复位和初始化详细讨论

    初始化序列。 图13.14 ARM嵌入系统的初始化序列 系统启动时立即执行复位处理程序,然后进入$Sub$$main()的代码执行。 复位处理程序是用汇编语言编写的代码块,它在系统复位时执行,完成系统
    发表于 10-19 09:12 1次下载
    嵌入<b class='flag-5'>式</b>开发复位和<b class='flag-5'>初始化</b>详细讨论

    SEED-DEC2812初始化函数说明

    SEED-DEC2812系统初始化函数。
    发表于 04-13 09:05 11次下载
    SEED-DEC2812<b class='flag-5'>初始化</b>函数<b class='flag-5'>说明</b>

    uboot和内核里phy的初始化_内核里的双网络配置及phy的初始化

    uboot 和内核里 phy 的初始化,以及内核里的双网络配置及 phy 的初始化。 本文以盈鹏飞嵌入的CoM-335x(基于AM335x)核心板及网络芯片LAN8720 为例,说明
    的头像 发表于 05-17 08:19 1.2w次阅读

    8259a初始化的步骤及代码介绍

    本文首先介绍了8259a工作初始化的步骤及程序,其次介绍了通过OCW对8259A进行操作方法,最后介绍了8259A初始化编程。
    的头像 发表于 05-23 14:24 3w次阅读
    8259a<b class='flag-5'>初始化</b>的步骤及代码介绍

    8253初始化程序分享_8253应用案例

    本文首先介绍了8253概念及8253各通道的工作方式,其次详细介绍了8253初始化要求及编程,最后用一个例子介绍了8253的初始化程序。
    发表于 05-23 15:52 2.2w次阅读
    8253<b class='flag-5'>初始化</b>程序分享_8253应用案例

    在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决

    本文档的主要内容详细介绍的是在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决。
    发表于 08-20 17:31 0次下载
    在51平台下<b class='flag-5'>初始化</b>文件的引入导致全局变量无法<b class='flag-5'>初始化</b>的问题如何解决

    C++之初始化列表学习的总结

    类中可以使用初始化列表对成员进行初始化
    的头像 发表于 12-24 17:39 801次阅读

    Armlinux内核移植及系统初始化过程分析

    Armlinux内核移植及系统初始化过程分析说明
    发表于 04-06 15:53 11次下载

    Nand Flash驱动(实现初始化以及读操作)

    Nand Flash驱动(实现初始化以及读操作)
    发表于 12-02 12:36 11次下载
    Nand Flash驱动(实现<b class='flag-5'>初始化</b>以及读<b class='flag-5'>操作</b>)