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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6636|回复: 27

[讨论] 各位大侠来讨论一个verilog的问题

[复制链接]
发表于 2011-1-19 11:23:42 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 shxr 于 2011-1-19 14:30 编辑

不同的always里给同一个值赋值,一般是不可综合的,鄙人现在出现了一个这样的问题,,一个always里面的逻辑比较复杂,主要是状态机,当输入是一种很特别的情况时,在同一时刻对某一个变量赋不同值(0和1)了。。。仿真出来,这个变量总是选择了0.综合后的后仿结果和前仿一致,modelsim和DC都没有报错。
请问:
1、这种同一时刻赋不同值的情况出现的可能性特别特别小,就一个时钟周期的范围,而一个时钟周期相对于本设计的应用是很小很小的,可以忽略,但不知道由此综合出来的电路会不会有很大的潜在问题。或者没有什么大问题,可以跳过它。
2、此逻辑包含状态机a和状态机b,状态机a中给一变量f赋值了,f的值影响状态机b的状态,而b的状态是独立于a的,b中也对f进行赋值了。。。这种设计问题还是比较大的吧?

文字描述不太清楚,看例子。

例子如下:
  always @(posedge clk or negedge rstn)
   begin
    if(~rstn)
     ........
    else
       begin
          case(state)
              IDLE:
                          state<=s1;
                          .........
             s1  :
                          state<=s2;
                          .......   
             s2  :  
                          state<=s3;
                          f<=1;
                          ..........
             s3  :
                          ......
                          state<=s2;
       endcase
   
      case(second_state)
                       ss0:     begin
                                     if(f==1'b1)
                                          second_state<=ss1;
                                    else
                                          second_state<=ss0;
                                  end
                      ss1:     begin
                                    .............
                                    second_state<=ss0;
                                    f<=1'b0;
                                 end
      endcase
      
  就是在一种特殊情况下,s2向s3跳转,ss1向ss0跳转,这种情况下,f的值就不确定了。这个情况在现实中发生的可能性很小.   

希望各位大侠广开言路,只要与本帖子相关,欢迎讨论,谢谢各位了!
 楼主| 发表于 2011-1-19 11:36:39 | 显示全部楼层
回复 2# ccj507


    是同一个always里面赋值的,同一个always里面有两个状态机,逻辑比较复杂,会出现同一时刻x被赋同一值。
注:是同一个always里面!!!!
发表于 2011-1-19 12:07:17 | 显示全部楼层
这个是语法解释的问题,最终综合出来的电路一个状态下只会给信号一个赋值,就看这个值是不是你想要的了。
只是这样debug起来很困难。

always@(posedge clk or negedge xreset)
if (~xreset)
  a <= 1'b0;
else begin
  a <= 1'b0;      //这种并行的写法类似你说的,在一个always的两个状态机内对同一个信号赋值
  if(b==0)begin //一般会编译成 b!=0时a=0,else,b==0时a=1,而不会有冲突。
    a<= 1'b1;
  end
end
--------------------------------------------
但是会有与设计思想不符的风险。
 楼主| 发表于 2011-1-19 13:09:05 | 显示全部楼层
回复 4# jackertja


    额,,就你举的这个例子来说。。你说可能和设计思想不符。。如果编译的结果和我的设计思想是一致的话,,就不会有什么危险了?
发表于 2011-1-19 13:42:45 | 显示全部楼层
“状态机a中给一变量x赋值了,x的值影响状态机b的状态,而b的状态是独立于a的,b中也对x进行赋值了。”
从上面的句子看出,a和b是有关系的,你虽然这么写了,但是未必会a和b两个状态会同时出现吗?如果会,那还要取决于你采用什么赋值方式,如果是阻塞的,则最后一个有效,如果是非阻塞的,好像也是最后一个有效。确实是有风险,不太好分析。
 楼主| 发表于 2011-1-19 14:22:56 | 显示全部楼层
回复 6# gaurson


    你所说的最后一个是指什么呢?
发表于 2011-1-19 14:49:30 | 显示全部楼层
回复 5# shxr


    可以使用。
只要你脑袋里有这个意识,并确认了ok,当然可以使用。
发表于 2011-1-19 14:56:19 | 显示全部楼层
首先,不要以为写在同一个always块里就是一个电路。否则大可以把所有的同时钟电路放到一个always块里了。
一般来说,要求一个always块只完成一个功能。你这2个状态机完全不相关,因此按照coding style是要放在2个always块里,然后编译的时候会告诉你不建议在不同的always块里对同一个变量赋值,这样是有隐患的。除非你能保证这种情况下没有冲突,或者冲突不会导致你系统错误。
 楼主| 发表于 2011-1-19 15:20:38 | 显示全部楼层
回复 9# falloutmx


    恩,,冲突就是同时给它赋零和1,冲突发生时赋零和赋1对我功能没多大影响。。。这种情况下如何考量这种设计
发表于 2011-1-19 15:37:12 | 显示全部楼层
a影响X, X影响b,所以a与b相关。
你说的a与b独立有问题。
还有推荐一个always只对一个信号控制和赋值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-12 03:02 , Processed in 0.041916 second(s), 8 queries , Gzip On, Redis On.

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