【小梅哥FPGA】verilog仿真高阻态与不定态问题解析

     Verilog HDL(Hardware Description Language)是在 C 语言的基础上发展起来的一种硬件描述语言(用它可以表示逻辑电路图、逻辑表达式、数字逻辑系统所完成的逻辑功能等)具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间内学习和掌握,目前已经在 FPGA 开发/IC 设计领域占据绝对的领导地位。                 
    在Verilog的逻辑电路中有四种值,即四种状态:

  • 逻辑 0:表示低电平
  • 逻辑 1:表示高电平
  • 逻辑 X:表示未知,有可能是高电平,也有可能是低电平
  • 逻辑 Z:表示高阻态,外部没有激励信号是一个悬空状态

  有很多人在进行模块例化时遇到了一些问题,导致仿真时出现了高阻态等现象,这里对问题的原因和解决方法进行一些总结。


1. 隐式例化

对于隐式例化,需要按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。如果原始工程和例化工程的连接不一致,可能导致信号未正确驱动,变成高阻态。

原工程

例化工程

顺序不一致时出现信号错误

2. 显式例化

原工程

例化工程

对于显式例化,例化的模块端口与外部信号按照其名字进行连接,端口顺序不一定一致,但要保证端口名字与外部信号匹配。未连接时,信号也会以高阻态显示。

3. 端口连接

    对于input端口,可以连接 wire 或 reg 型变量。
    对于output端口,必须连接 wire 型变量。
    对于inout端口,必须连接 wire 型变量。

4. 端口悬空

    output 端口可以悬空时,甚至可以在例化时将其删除,悬空时呈现为高阻态。input 端口悬空时,逻辑功能表现为高阻状态。但是,例化时一般不能将悬空的 input 端口删除,否则编译会报错或者告警,一般来说,建议 input 端口不要做悬空处理,一般给定初始常量。

5. 位宽不匹配

    没有定义位宽,如在代码模块里面定义了位宽,但是在仿真tb里没有定义位宽,或者是在仿真tb里面定义了位宽,但是代码模块里没有定义位宽,这样就会出现这个问题。
    当例化端口与连接信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。

6.未初始化寄存器
    寄存器变量未赋初值,仿真初始阶段为不定态,直到获得相应的值。

7.多驱动

    同一信号被多个驱动源(如多个always块或assign语句)同时驱动,且未通过三态逻辑控制。

8.顶层设置错误

 在vivado仿真时,如果错误的设置Simulation Sources顶层,会出现信号为高阻和不定的现象。

欢迎关注小梅哥!我们将持续分享FPGA学习与使用中的问题及解决思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值