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顶层,会出现信号为高阻和不定的现象。