用於記錄學習數字前后端中總結得到的對verilog代碼編寫的注意事項
良好的運算順序
a <= bd + cd + eb;
盡量不要寫這種運算表達式,最好經過化簡:
a <= b(d + e) + c*d
減少寄存器連線
一個寄存器設計很多邏輯時可能會導致負載太大。同一個信號在很多地方使用,布線也會變復雜,比如最常見的是參數信號,在很多模塊都會有用到的情況,用寄存器復制的方法。
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

先選后比再加
面積:加法器 > 比較器 > 選擇器
乘法器本質上也是全加器。
所以就有先選后比,先選后加,先選后乘。
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;

數據通路與控制通路
數據通路打拍可以不帶復位,帶着使能信號去打拍,減少信號翻轉,減少功耗。保證數據用的時候不是X態,
組合邏輯路徑是否需要插入pipeline,插入pipeline的位置需要注意。寄存器能少用就少用。
盡量不要用除法,首先除法器面積更大,除法也會有余數,余數是否需要保留就很麻煩。除以常數可以做成乘以定點常數的方法。
乘以常數用移位加,也可直接用*號。例如a * 2‘d3,工具會幫你優化成 a << 2’d1 + a。甚至可能優化得更好。(杠:不要過度依賴工具)。關於用移位加還是*號的問題,博主做過綜合后的面積對比,相對來說,工具還是優化那么一點點。直接用 * 號吧。
盡量不要用減法,減法要考慮到減翻的問題,盡量用加法。