面向綜合優化的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。甚至可能優化得更好。(杠:不要過度依賴工具)。關於用移位加還是*號的問題,博主做過綜合后的面積對比,相對來說,工具還是優化那么一點點。直接用 * 號吧。

盡量不要用減法,減法要考慮到減翻的問題,盡量用加法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM