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

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

3天内不再提示

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

sanyue7758 来源:硅芯思见 2023-08-25 09:47 次阅读

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的值更新为了过程块中的值,由此我们可以看出,变量在声明时的初始化先于过程块的执行,其次变量声明时的初始化并不具有持续性,会被后续的赋值操作所更新,否则就会出现多驱动情况,即并不具有“隐式连续赋值的特点”

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






审核编辑:刘清

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

    关注

    14

    文章

    988

    浏览量

    82995
  • VaR
    VaR
    +关注

    关注

    0

    文章

    37

    浏览量

    11120
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8159

原文标题:verilog/systemverilog 中隐藏的初始化

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

收藏 人收藏

    评论

    相关推荐

    在modelsim初始化ROM

    要在modelsim初始化ROM,夏雨闻书上说的是用系统任务readmemb,可是我用了怎么就不能初始化呢,求大神指教!
    发表于 05-13 18:01

    AD9364初始化问题及标准初始化流程?

    AD9364初始化好像不成功。能否请官方给出一个使用外部晶体(如33MHz),FDD的标准初始化例子。
    发表于 09-28 14:56

    请问verilog如何实现SJA1000的初始化

    verilog 如何实现SJA1000的初始化
    发表于 11-01 10:03

    怎么在verilog初始化二维数组

    我想创建一个二维数组并在定义时初始化它。例如:reg [15:0] xyz_array [9:0];
    发表于 03-11 13:38

    没有初始化UART1

    创龙工程师你好,在使用创龙TL-6748-EVM时,发现UART1例程管脚初始化,没有初始化UART1,初始化的是核心板的LED,PSC初始化
    发表于 04-08 07:54

    labview顺序结构初始化问题

    Labview顺序结构,我想让第一帧执行完成后,程序初始化,再执行第二帧,以此类推执行九帧,因为是一个AO,AI口不停地接收发送,不初始化的话,前一帧的值会影响后面的值,请问大家,这种初始化
    发表于 12-25 11:37

    端口初始化初始化中断

    目录PA9(TX),PA10(RX)1、端口初始化2、初始化外设3、初始化中断4、使能中断5、使能外设5、发送数据PA9(TX),PA10(RX)1、端口初始化1.开启PA时钟2.PA
    发表于 08-16 06:54

    初始化封装

    初始化封装您可以在 Mask Editor 的 Initialization 窗格添加 MATLAB® 代码以初始化封装模块。Simulink® 将执行这些初始化命令以便在关键时刻(
    发表于 08-27 07:17

    【原创分享】变量的初始化技巧

    由于在嵌入式系统必须考虑程序规模的问题,因此,对程序的变量的初始化也需要进行慎重的考虑。在C语言中,基本数据结构(字符型、整型)的初始化相对简单;数组、结构体属于C语言中的构造类型
    发表于 09-08 15:28

    变量初始化的基本原则

    一、变量初始化变量初始化的基本原则为:可综合代码完成内部变量的初始化,Testbench完成可综合代码所需的各类接口信号的
    发表于 01-19 07:07

    基于RK3399 kernel的时钟系统初始化

    、复用、分频、倍频等功能。RK3399的时钟系统主体是clk-rk3399.c这个文件。初始化方式kernel的时钟初始化代码位于驱动初始化这个层面,相较于CPU
    发表于 06-30 17:36

    就Bits数据类型的初始化及使用方式做一个总结

    Bits:初始化Bits意味这一组有Bool类型组成的向量,类似与我们在Verilog的多比特位宽变量。在SpinalHDL,声明一个Bits变量可采用如下形式(“[]”
    发表于 07-12 16:31

    复合类型的初始化进阶使用方式

    很多。其实在文章《Mem初始化太复杂?》中曾提到过在Mem初始化场景,其实这里也是通用的,我们可以对dataBus增加一个initFrom函数,如此便可以在函数
    发表于 09-09 14:53

    RDA1846S初始化设置

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

    隐式初始化操作说明

    VerilogSystemVerilog中经常需要在使用变量或者线网之前,期望变量和线网有对应的初始
    的头像 发表于 07-24 15:00 336次阅读
    隐式<b class='flag-5'>初始化</b>操作<b class='flag-5'>说明</b>