微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请大家看一下这种代码会有什么样的风险?

请大家看一下这种代码会有什么样的风险?

时间:10-02 整理:3721RD 点击:
小弟正在做一个模块的设计,模块中用到了一些诸如下面写法的逻辑,领导看完后说这样写会有风险,过不了我们内部的代码审查,问他有什么风险,他又解释不清楚,代码如下:
always @ (posedge clk or negedge rst_n)
begin
    if (!rst_n)
    begin
        a <= 'b0;
    end
    else if (flag)
    begin
        a <= a + 1'b1;
    end
    else
    begin
        a <= a;
    end
end
不明白会出现什么样的风险,请各位大神前辈知无不言言无不尽,都说说这种计数器写法存在的问题,如何能改进,谢谢!



   感觉没什么问题。看代码审查会给什么意见吧!

我看也没什么问题啊。



   谢谢,我也是实在看不出什么问题, 以前在上家单位的时候基本会用到很多这样的写法,都没有问题的。


谢谢,我也觉得没啥问题,领导说else分支的赋值是把输出接到输入上了。

那是组合逻辑环,你这个是时序电路



   谢谢,我也知道组合逻辑环是不可以,时序逻辑我也没听说这样有什么不可以~只以为自己孤陋寡闻了~而且以前都这样写也一直没问题。

应该正如你说的产生了反馈应该多少会影响,建议你再看看反馈是什么回事吧

这样应该没有设么问题的

最后一个else可以不写,不过写上去可读性更直观。
综合后,效率是一样的。

  1. <= #`DLY

复制代码

没问题的,别瞎想了。

建议用原代码问那个领导。贴出来的没问题。



    也就是说这种计数器本质上是锁存对么?



    好!不纠结了~哈哈~



    Good idea!


组合逻辑这么写会出现组合逻辑回环的warning,时序逻辑写不写这句综合结果是一样的,小编可以自己试验下,这么写我觉得应该是没问题的,不管是FPGA还是ASIC,至少没人说我这么写得有问题。

没问题,最标准的写法

明显你老大一知半解,以为环路出现在组合逻辑有风险,时序逻辑也有风险

你写的是取反操作吗?1bit不用加吧,或者你可以把你的代码贴准确点。
或者你这个是时钟分频,分频的话是通过flag作门控吗?
还是贴个准确的吧

a的位宽是多少?  
      a <= a + 1'b1;
右边有被截断的风险吧



   这个就是准确的啊~



   能具体解释一下吗?谢谢~

凑热闹,看看到底风险在哪!



   我也是囫囵吞枣,如果不慎误人子弟不要怪我   不是问你a的位宽么,如果a的位宽大于1位, a + 1'b1的结果很可能是a[0] + 1'b1,然后再赋值给左边a,则高位自动补零
    a[N:1] <={N{1'b0}};
    a[0]    <= ~a[0];

作为一个纯粹的受控计数器,没有任何问题,不管是仿真还是实现
可以问下你们头儿具体问题在哪里



   我觉得 这个在所有的计数器中都不会有影响



    我决定不修改,等所谓内部审查的结果出来我再来分享给大家讨论~

异步复位有没有同步到当前时钟域? 否则会有风险。

可能是coding style不好吧,给你一个我写的参考一下,a_r就是a,我们这边一般都要求这么写,尽量不要在时序always块中加入运算逻辑,最多加一个使能信号(flag),一般逻辑运算都放在组合逻辑中完成。
assign a_p = a_r + 1'b1;
always @ (posedge clk or negedge rst_n)
begin
    if(!rst_n)
        a_r <= 'b0;
    else if(flag)
        a_r <= a_p;   
end

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top