微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC后端设计交流 > 同步复位的计数器在后仿时无法复位

同步复位的计数器在后仿时无法复位

时间:10-02 整理:3721RD 点击:

做vcs后仿时,发现存在X,最后定位到源头是一组寄存器无法正常复位。
先说设计背景:
1.出问题的部分是一组寄存器,功能为计数器(这里记为reg [10:0] cnt;),rtl中就是很简单的一个always块、几行代码。
2.寄存器组的功能很简单,就是可以清零、可以+1计数。3.因为一些原因,这里的逻辑是用的同步复位,现在也不方便再改异步复位。
4.仿真时,先给的复位、然后给的时钟、再然后复位释放。

然后说问题:
1.时钟来之前,都是X不定态。等时钟来了,大部分信号都复位清零了,但是cnt[0]和cnt[8]还是X,无法清零,导致复位释放之后、整个模块里的信号都被传成X了。
2.去看了网表里cnt[0]寄存器在D端的组合逻辑,发现是一个4输入的cell(内部逻辑是一个and、两个nor),在复位有效时,逻辑等价为~(Q | ~Q)。即不管Q是0或1,都应该得到0进行同步复位,但是Q初始是X,这就没法复位了。
3.检查了下cnt[1]的逻辑,D端的cell不同,复位时就不存在这个问题。
4.尝试仿真时在时钟来之后、复位释放之前,把cnt[0] force到0一拍,然后release,这里就过的去了。但是后面的模块里还是发现有这样的情况,而且还是计数器的寄存器,特别是[0]这一位出问题的几率似乎很高。
感觉这个问题不应该通过一个个force/release的方式去解决,所以求助下,看下有没有大神遇到过、或者有什么建议

把复位信号用时钟打一拍再用

复位信号已经做过同步处理了,同步的时候还多打了几拍。

你说的同步复位是复位做同步处理了,
不是代码写成:
always@(posedge clk)
if(!rst_n)
out<= 1'h0;
else
out <= in;

1.主逻辑是用的同步复位,就是你写的那样always@(posedge clk)
if(!rst_n)
out<= 1'h0;
else
out <= in;
2.复位信号做了同步处理,是说主逻辑的复位信号rst_n,已经在clk这个时钟域下做了同步处理、寄存器输出的
always@(posedge clk or negedge arstn)
if(!arstn)
{rst_n,rst_n_syn}<= 0;
else
{rst_n,rst_n_syn}<= {rst_n_syn,1'b1};

因为时钟会对复位进行同步,也就是说,时钟来时,至少有2个周期都会将
if(!rst_n)
out<= 1'h0;
所以Q端此时是有固定值0的。

使用同步复位,记得保证复位信号rst_n=0时clk是翻转的,然后再撤销复位,这样才能复位到电路。时序这么给一般仿真不会红X的,你再查查还有没有其他原因。实在不行只能force一段再release了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top