• 【verilog 设计】 reg有没有必要全部赋初值?


    一、前言

    在知乎发现“reg有没有必要全部赋初值”这个问题,与自己近期对Verilog reg的进一步学习相契合,此文对这个问题进行总结。

    二、reg的初值赋值方式

    就语法意义赋初值而言,就是在声明reg时对其赋值。在工程中,对于数字系统的初始化一般是在上电后使用全局复位变量来实现的,也即利用复位信号来赋初值。

    三、reg是否有必要全部赋初值

    由于verilog不仅用于ASIC,还用于FPGA,关于reg是否需要全部赋初值又与这两个应用方向二存在差异。

    3.1 FPGA场景下reg赋初值

    3.1.1 FPGA reg赋初值方式选择

    在声明reg变量时对其赋初值,寄存器初值可以靠上电时给对应存储单元置位,可以做初值置位。此外也可以通过复位来赋初值。

    但如果只靠声明时赋初值,而不用复位赋初值时,整个系统需要复位重启时,这时FPGA只能通过重新上电来获取处置,这是比直接拉复位信号麻烦的,甚至在某些系统中不可实现的。

    如果用复位赋初值,则声明变量时赋初值则完全没必要,因为数字系统一般上电后紧接着就是给一个复位信号。

    因此,fpga场景下最好还是采用复位赋初值的方式来实现。

    3.1.2 reg是否需要全部赋初值

    此处对reg是否全部赋初值等价是否全部的reg都需要复位逻辑。我在之前自己编写的代码中基本上是全部都写了复位逻辑,但最近也看到了别人写不复位的寄存器,因此引发了对是否需要对全部reg赋初值的思考。

    首先,全部复位是完全可以的(如果FPGA资源时序允许的话),这样电路复位后的状态是完全可知的,可以避免电路刚上电是出现X态。

    其次,控制流需要复位,数据流不进行复位,保证所有数据寄存器在使用前被正确数据覆盖也是可以的。这时上电带来的随机值(X态)对电路功能并没有影响,而且当电路设计错误时,保留X态的传播可以让开发者在波形上更快的发现错误,加快调试进程。另一方面,没有复位逻辑的寄存单元,也可以减少复位信号的扇出,对功耗面积布线都是好处的。

    至于,具体是否需要全部编写复位逻辑,可以根据具体的应用场景需求和可用资源而决定。

    3.2 ASIC场景下reg赋初值

    3.2.1 ASIC reg赋初值方式

    对于ASIC来说,在声明reg时赋初值毫无意义,不同于FPGA查找表方式,数字电路并没有某种机制让这个寄存器在一开始确定为某个值。在声明reg时赋初值虽然不算不可综合但是也没哪家的cell上能生效。因此对于ASIC而言,都是通过上电复位来实现赋初值的。

    3.2.2 reg 是否需要全部赋初值

    这点与FPGA场景下的思路是一致的。

    四、参考资料

    Verilog reg有没有必要全部初始赋值? - 知乎 (zhihu.com)

  • 相关阅读:
    洛谷千题详解 | P1004 [NOIP2000 提高组] 方格取数【C++、Java、Pascal语言】
    ClickHouse技术研究及语法简介
    输出格式说明符%u
    【JavaScript】对象的复制和引用处理方法
    AIOPS:Zabbix结合讯飞星火做自动化告警+邮件通知并基于人工智能提供解决方案
    让.NET 8 支持 Windows Vista RTM
    精灵宝可梦属性克制表(精灵属性相克图)
    Java大整数乘法知识点(含面试大厂题和源码)
    SpringBoot整合JWT、实现登录和拦截
    快速上手Linux基础开发工具
  • 原文地址:https://blog.csdn.net/weixin_43593478/article/details/137839430