全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

verilog/systemverilog中隐藏的初始化说明

时间:2023-08-25 09:47

人气:

作者:admin

标签: VaR  仿真器 

导读:在Verilog和SystemVerilog中经常需要在使用变量或者线网之前,期望变量和线网有对应的初始值...

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

1 线网初始化

【示例】

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

仿真结果】

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

示例中,net1在声明的同时进行了赋值操作(初始化),同时在代码中通过连续赋值语句对net1又进行了赋值(与声明时初始化的值不同),此时从仿真结果可以观测到net1显示结果为不定态;net2在声明时并没有进行赋值操作,对其的赋值操作发生在连续赋值语句中,从仿真结果可以看到net2并没有出现不定态,其获得了确切的数值。

出现线网net1这种现象的主要是因为线网声明时的“初始化”是一种“隐式的连续赋值语句”,并且在仿真过程中会一直保持,当有其他语句驱动该线网时,此时相当于对该线网进行了多驱动,在仿真波形上就会表现出不定态。那么对于变量的初始化操作是否也会像示例中net1这样的情况呢?请看下例。

2 变量初始化

【示例】

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

【仿真结果】

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

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

【示例】

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

【仿真结果】

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

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

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






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信