基于Verilog结构级建模的1计数器实现仿真问题排查
8位1计数器仿真振荡与X值问题排查方案
- 先查测试平台的时钟生成逻辑
- 确保时钟是稳定的周期性信号,比如用
initial begin clk = 0; forever #10 clk = ~clk; end这种标准写法,别漏了初始赋值clk=0,没初始化就翻转会让时钟一开始是X,直接搞崩后续逻辑。另外要排查测试平台里有没有多个块同时驱动clk,多驱动会导致信号冲突,出现X。
- 确保时钟是稳定的周期性信号,比如用
- 核对核心模块的时钟敏感列表与同步逻辑
- 同步计数器的always块敏感列表只留
posedge clk(或negedge,看你设计),别把复位、输入数据这些也塞进去,混进去会变成异步逻辑,很容易振荡。 - 复位信号要处理对:同步复位就把
if(rst)放在always块里;异步复位要把posedge rst_n加到敏感列表里,而且测试平台里复位信号必须先给确定电平(比如先拉低复位,再释放),不能让复位一开始是X。
- 同步计数器的always块敏感列表只留
- 强制初始化所有关键信号
- 核心模块里的计数器寄存器,必须在复位时赋值为确定值(比如0),不然仿真一开始寄存器是X,后续运算全是X。测试平台里的输入信号(比如待计数的8位数据、复位)也要在仿真开始就赋初始值,别让输入悬空。
- 检查结构级建模的连线与逻辑闭环
- 排查各模块的端口连接,有没有悬空的信号线,悬空信号会显示X,直接影响输出。另外要确认有没有组合逻辑形成闭环,结构级建模不小心连错线搞出反馈回路,会直接导致输出振荡,这锅不一定是时钟的,但容易和时钟问题混淆。
- 仿真波形时序核查
- 看时钟波形有没有毛刺或者电平不确定的情况,比如时钟翻转时出现短暂X,会让寄存器采样错误。还要检查待计数的输入数据是否在时钟边沿前稳定下来,建立/保持时间不够的话,寄存器会采到X。
内容的提问来源于stack exchange,提问作者Cheng En Chung
相关产品推荐
相关产品推荐

