在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2392|回复: 7

[求助] 同步复位的计数器在后仿时无法复位

[复制链接]
发表于 2017-5-26 19:54:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 verilog_ 于 2017-5-26 19:57 编辑

做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的方式去解决,所以求助下,看下有没有大神遇到过、或者有什么建议
发表于 2017-5-27 14:02:08 | 显示全部楼层
把复位信号用时钟打一拍再用
 楼主| 发表于 2017-5-27 14:44:41 | 显示全部楼层
回复 2# haimo


   复位信号已经做过同步处理了,同步的时候还多打了几拍。
发表于 2017-5-27 15:05:22 | 显示全部楼层
你说的同步复位是复位做同步处理了,
不是代码写成:
always@(posedge clk)
if(!rst_n)
    out<= 1'h0;
else
    out <= in;
 楼主| 发表于 2017-5-27 15:24:25 | 显示全部楼层
回复 4# haimo


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};
发表于 2017-5-27 15:40:57 | 显示全部楼层
因为时钟会对复位进行同步,也就是说,时钟来时,至少有2个周期都会将
if(!rst_n)
     out<= 1'h0;
所以Q端此时是有固定值0的。
发表于 2017-5-27 18:59:05 | 显示全部楼层
回复 5# Verilog_


   使用同步复位,记得保证复位信号rst_n=0时clk是翻转的,然后再撤销复位,这样才能复位到电路。时序这么给一般仿真不会红X的,你再查查还有没有其他原因。实在不行只能force一段再release了
发表于 2021-4-14 22:23:37 | 显示全部楼层
我也碰到这问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 04:21 , Processed in 0.024675 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表