转载:verilog组合逻辑描述用assign或者always@(*)的区别

///转载
verilog描述组合逻辑一般常用的有两种:assign赋值语句和always@()语句。两者之间的差别有:
1. 被assign赋值的信号定义为wire型,被always@(
)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。
2. 另外一个区别则是更细微的差别:举个例子,

wire a;

  reg b;

assign a = 1’b0;

always@(*)

   b = 1'b0;

在这种情况下,做仿真时a将会正常为0, 但是b却是不定态。这是为什么?verilog规定,always@(*)中的*是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化,而像always@(*) b = 1'b0;

这种写法由于1'b0一直没有变化,所以b的信号状态一直没有改变,由于b是组合逻辑输出,所以复位时没有明确的值(不定态),而又因为always@(*)块内没有敏感信号变化,因此b的信号状态一直保持为不定态。事实上该语句的综合结果有可能跟assign一样(本人没有去尝试),但是在功能仿真时就差之千里了。

3 状态机编码中,组合逻辑部分的条件一定要记得if else两个语句要完整,不然可能进行default状态中

//---- asyn. status skip ----
always @( * )
begin
   next_state = IDLE;
   case (current_state)
      IDLE :  //4'b0001  
         begin
            if (s_parma_cfg_start_r == 1'b1) 
                next_state = PARAM;
            else 
                next_state = IDLE;
         end
      PARAM:   //4'b0010
         begin
            if (s_conv_start_r == 1'b1) 
                next_state = WORKING;
            else 
                next_state = PARAM;
         end
      WORKING: //4'b0100
         begin
            if (I_ofmap_done == 1'b1) 
                next_state = END;
            else 
                next_state = WORKING;
         end
      END: //4'b1000
         begin
            if (s_clear_cnt == 4'd10)     //hold clear time 10 clock
                next_state = IDLE;
            else 
                next_state = END;
         end
      default:  next_state = IDLE;
   endcase
end
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值