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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: althars

[求助] 求助VCS仿真gatelevel

[复制链接]
 楼主| 发表于 2021-2-4 09:38:39 | 显示全部楼层


jake 发表于 2021-2-4 09:34
我眼神不太好,貌似这个寄存器 D 先变成 X, 造成该寄存器 Q 随后变 X。
要往上游查,找到最先变成 X 的 ...


明白,我按照这个思路往上检查下
微信截图_20210204093815.png
发表于 2021-2-4 09:57:47 | 显示全部楼层


althars 发表于 2021-2-4 09:38
明白,我按照这个思路往上检查下


找到最先开始变化出unknow的地方,然后在分析是怎么回事!
FM通过不一定表示时序没有问题哦,看看syn里面的时序有没有问题!
还有就是你的是不是异步复位没有在同步处理,然后因为reset的removel或者recovery导致的!
可以往前推理分析一下!
发表于 2021-2-4 10:30:44 | 显示全部楼层


althars 发表于 2021-2-3 19:34
有没有办法屏蔽掉这些只是单纯的把cell当成理想模型来仿真呢?


模型里这个默认的延迟没有简单办法改成 0。 模型这样做是有一定道理的,至少模拟了门的延迟,虽然很不准。 这样实际上暴露了 RTL 理想情况下仿真没有捕捉到的问题。


 楼主| 发表于 2021-2-4 11:31:47 | 显示全部楼层


jake 发表于 2021-2-4 10:30
模型里这个默认的延迟没有简单办法改成 0。 模型这样做是有一定道理的,至少模拟了门的延迟,虽然很不准 ...


您好,我刚才往回追查到了一个reg的复位没有成功,复位的时候就是不定态了,但是实在想不通为啥会这样: image.png
image.png
image.png

image.png
 楼主| 发表于 2021-2-4 11:37:51 | 显示全部楼层
本帖最后由 althars 于 2021-2-4 12:01 编辑

L185的那个state_sclk是复位成功的cnt_sclk问题出在【0】位上,涉及到它的代码我觉得没问题呀:




  1. reg [2:0] cnt_sclk;
  2.         reg [2:0] state_sclk;
  3.         
  4.         always @(posedge clk)
  5.         begin
  6.                 if(!rst)
  7.                         begin
  8.                                 cnt_sclk   <= 3'b0   ;
  9.                                 sclk_b     <= sclk;
  10.                                 state_sclk <= 3'b0   ;                        
  11.                         end
  12.                 else
  13.                         begin
  14.                                 case(state_sclk)
  15.                                         3'd0        :        begin
  16.                                                                 if(sclk_p)
  17.                                                                         begin
  18.                                                                                 cnt_sclk   <= cnt_sclk + 3'b1;
  19.                                                                                 sclk_b     <= 1'b0           ;
  20.                                                                                 state_sclk <= 3'd1        ;                                                                                       
  21.                                                                         end
  22.                                                                         else if(sclk_n)
  23.                                                                         begin
  24.                                                                                 cnt_sclk   <= cnt_sclk + 3'b1;
  25.                                                                                 sclk_b     <= 1'b1           ;
  26.                                                                                 state_sclk <= 3'd2        ;                                                                                                
  27.                                                                         end
  28.                                                                         else
  29.                                                                         begin
  30.                                                                                  cnt_sclk   <= 3'b0     ;
  31.                                                                                  sclk_b     <= sclk_b;
  32.                                                                                  state_sclk <= 3'd0  ;                                                                                       
  33.                                                                         end
  34.                                                                 end
  35.                                                                
  36.                                         3'd1        :        begin
  37.                                                                         if(cnt_sclk >= 3'd2)
  38.                                                                                 begin
  39.                                                                                   if(sclk)
  40.                                                                                       begin
  41.                                                                                          cnt_sclk   <= 3'b0   ;
  42.                                                                                          sclk_b     <= 1'b1   ;
  43.                                                                                          state_sclk <= 3'd0;                                                                                                        
  44.                                                                                      end
  45.                                                                                  else
  46.                                                                                       begin
  47.                                                                                           cnt_sclk   <= 3'b0   ;
  48.                                                                                           sclk_b     <= 1'b0   ;
  49.                                                                                           state_sclk <= 3'd0;                                                                                                        
  50.                                                                                       end
  51.                                                                                 end

  52.                                                                         else
  53.                                                                               begin
  54.                                                                                  sclk_b     <= 1'b0           ;
  55.                                                                                  cnt_sclk   <= cnt_sclk + 3'b1;
  56.                                                                                  state_sclk <= 3'd1        ;                                                                                       
  57.                                                                               end
  58.                                                                 end
  59.                                                                
  60.                                         3'd2        :        begin
  61.                                                                         if(cnt_sclk >= 3'd2)
  62.                                                                                 begin
  63.                                                                                   if(sclk)
  64.                                                                                        begin
  65.                                                                                            cnt_sclk   <= 3'b0   ;
  66.                                                                                            sclk_b     <= 1'b1   ;
  67.                                                                                            state_sclk <= 3'd0;                                                                                                        
  68.                                                                                        end
  69.                                                                                   else
  70.                                                                                         begin
  71.                                                                                            cnt_sclk   <= 3'b0   ;
  72.                                                                                            sclk_b     <= 1'b0   ;
  73.                                                                                            state_sclk <= 3'd0;                                                                                                        
  74.                                                                                         end
  75.                                                                                 end

  76.                                                                         else
  77.                                                                                 begin
  78.                                                                                   sclk_b     <= 1'b1           ;
  79.                                                                                   cnt_sclk   <= cnt_sclk + 3'b1;
  80.                                                                                   state_sclk <= 3'd2        ;                                                                                       
  81.                                                                                 end                                       
  82.                                                                 end
  83.                                                                         
  84.                                         default        :        begin                                       
  85.                                                                         sclk_b     <= sclk_b    ;
  86.                                                                         cnt_sclk   <= cnt_sclk  ;
  87.                                                                         state_sclk <= state_sclk;                                                
  88.                                                                 end
  89.                                 endcase                        
  90.                         end
  91.         end
  92.         


复制代码


发表于 2021-2-4 12:05:03 | 显示全部楼层


althars 发表于 2021-2-3 21:31
您好,我刚才往回追查到了一个reg的复位没有成功,复位的时候就是不定态了,但是实在想不通为啥会这样:
...


Verilog code 有问题。 1) rst 没有放到 always @() 的条件里。 这会造成综合工具认为寄存器不需要异步复位,综合生成的网表里的寄存器是无复位端的那种。 这种寄存器启动后默认状态是 X, 实际上要靠 rstn, clk 同步复位,即 rstn 先为 0,clk 上升沿来时锁存”复位值“。
2) sclk_b 这个寄存器复位的写法有问题。 异步复位值必须是一个 known value, 即 0 或 1。 异步复位值不能是一个变量。
3)如果设计意图确实需要异步复位,请参考我日志里的一篇 复位同步 reset synchronizer

always @(posedge clk or negedge rstn) begin
   if (!rstn) begin
      cnt_sclk <= 3'b000;
      sclk_b <= 1'b0;
      state_sclk <= 3'b000;
   end
   else begin
       ...


这里我把原先的 rst 改成了 rstn,好辨认一些,n 代表 low active 低电平有效。





 楼主| 发表于 2021-2-4 12:35:12 | 显示全部楼层


jake 发表于 2021-2-4 12:05
Verilog code 有问题。 1) rst 没有放到 always @() 的条件里。 这会造成综合工具认为寄存器不需要异步复 ...


学习了,我修改下代码综合试试
发表于 2021-2-4 12:44:58 | 显示全部楼层


althars 发表于 2021-2-3 22:35
学习了,我修改下代码综合试试


加油!

发表于 2021-2-4 12:51:35 | 显示全部楼层
这段 code 应该是一个 state machine。
State machine 有经典的 coding style,分三个 always block。
第一个 always (*) , 纯组合逻辑,case (fsm_cs_r)  根据当前 state machine state + 输入,决定 fsm_ns 下一个 state
第二个 always @(posedge clk or negedge rstn), 很简单,把 fsm_ns 锁存到 fsm_cs_r
第三个 always @(posedge clk or negedge rstn), case (fsm_cs_r), 根据当前 state machine state + 输入,决定 state machine 输出信号值
套用这个经典 coding style, 可以让代码组织得好一些,易懂,以后扩展维护也方便
 楼主| 发表于 2021-2-4 12:59:24 | 显示全部楼层


jake 发表于 2021-2-4 12:51
这段 code 应该是一个 state machine。
State machine 有经典的 coding style,分三个 always block。
第 ...


修改后问题解除了,感谢!学习了

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-24 15:31 , Processed in 0.026935 second(s), 7 queries , Gzip On, Redis On.

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