zoukankan      html  css  js  c++  java
  • 面向综合优化的Verilog代码风格

    用于记录学习数字前后端中总结得到的对verilog代码编写的注意事项

    良好的运算顺序

    a <= bd + cd + eb;
    尽量不要写这种运算表达式,最好经过化简:
    a <= b
    (d + e) + c*d

    减少寄存器连线

    https://mp.weixin.qq.com/s/e3kp7EcsoOxifyFGHctb4A

    一个寄存器设计很多逻辑时可能会导致负载太大。同一个信号在很多地方使用,布线也会变复杂,比如最常见的是参数信号,在很多模块都会有用到的情况,用寄存器复制的方法。

    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            data_para0 <= 4'b0;
            data_para1 <= 4'b0;
            data_para2 <= 4'b0;
        end
        else begin
            data_para0 <= data_para;
            data_para1 <= data_para;
            data_para2 <= data_para;            
        end
    end
    

    先选后比再加

    https://mp.weixin.qq.com/s/e3kp7EcsoOxifyFGHctb4A

    面积:加法器 > 比较器 > 选择器

    乘法器本质上也是全加器。

    所以就有先选后比,先选后加,先选后乘。

    assign sum[4:0] = enable ? (data_a + data_b) : (data_c + data_d);
    //换一种实现方式:
    assign add_a[3:0] = enable ? data_a : data_c;
    assign add_b[3:0] = enable ? data_b : data_d;
    assign sum[4:0]   = add_a + add_b;
    

    数据通路与控制通路

    https://mp.weixin.qq.com/s/e3kp7EcsoOxifyFGHctb4A

    数据通路打拍可以不带复位,带着使能信号去打拍,减少信号翻转,减少功耗。保证数据用的时候不是X态,

    组合逻辑路径是否需要插入pipeline,插入pipeline的位置需要注意。寄存器能少用就少用。

    尽量不要用除法,首先除法器面积更大,除法也会有余数,余数是否需要保留就很麻烦。除以常数可以做成乘以定点常数的方法。

    乘以常数用移位加,也可直接用*号。例如a * 2‘d3,工具会帮你优化成 a << 2’d1 + a。甚至可能优化得更好。(杠:不要过度依赖工具)。关于用移位加还是*号的问题,博主做过综合后的面积对比,相对来说,工具还是优化那么一点点。直接用 * 号吧。

    尽量不要用减法,减法要考虑到减翻的问题,尽量用加法。

  • 相关阅读:
    最小二乘拟合(转)good
    会议论文重新投稿算不算侵权?这肯定是所多人都遇到过的问题(转)
    吝啬的国度
    压力单位MPa、Psi和bar之间换算公式
    Oracle建立表空间和用户
    layoutSubviews总结
    C++中出现的计算机术语4
    445port入侵具体解释
    hdu
    ORM框架
  • 原文地址:https://www.cnblogs.com/lyc-seu/p/12423163.html
Copyright © 2011-2022 走看看