verilog小坑——注意delay中valid使能的使用

例子:

reg     [DATA_WIDTH-1:0]        data_dly    [SHIFT_NUM-1:0];
reg     [SHIFT_NUM-1:0]         data_dly_v;

always @(posedge clk) begin : l
   integer i;
   if(~rst_n)
      for(i=0; i<SHIFT_NUM; i=i+1)    begin
         data_dly[i]     <=  'd0;
         data_dly_v[i]   <=  1'b0;
      end
      else if(idata_v)    begin    // this line has problem
      // else    begin
         data_dly[0]     <=  idata;
         data_dly_v[0]   <=  idata_v;
         for(i=0; i<SHIFT_NUM-1; i=i+1)  begin
            data_dly[i+1]   <=  data_dly[i];
            data_dly_v[i+1] <=  data_dly_v[i];
         end
      end

如上代码,想要的效果为做输入idata的delay,输出为idata/idata_v做相应的delay后的结果。

而实际上由于注释有问题一行的valid使能,使得输入idata_v的下降沿无法传递给data_dly_v,因而实际效果是:data_dly_v能捕捉到idata_v的上升沿并做delay,但下降沿无法捕捉,从而data_dly_v在idata_v下降后仍然一直为高。

正确写法为下一行注释的代码,正确的行为是既要捕捉到idata_v的上升沿又要捕捉到下降沿,所以在else的分支上的data_dly_v的代码无条件执行,而不需要idata_v有效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值