代碼規范的文檔,就是一份設計工程師的血淚史。
命名規范
命名規范包括模塊命名規范和代碼命名規范,代碼命名需要有確定的含義,提高代碼可讀性和可維護性。模塊名命名規范處理好認,一眼就能把看出你是哪個IP里面的一個子模塊之外,更重要的一個原因是防止兩個module重名 ,比如你把模塊起名叫,shift_reg_dly_module,但是整個soc中可能會有其他IP也叫這個module名,這樣同名不同工的文件,會影響集成級的工作。
所以代碼規范module命名這樣,子系統_子模塊_function_module。例如ddr_shift_reg_dly_module。避免模塊名重名。
綜合自動插時鐘門控
并不是所有的寄存器都需要帶復位,這樣規范顛覆初入行的朋友認知。有研究表明,帶復位的寄存器和不帶復位的寄存器相比,面積會相差10%。但是這樣也有一個原則,就是控制寄存器必須帶復位,數據寄存器可以不復位,但是不能用去做條件。
計數器,必須有使能端和清零端,不允許裸奔
always @(posedge clk or negedge rst_n)begin if(rst_n == 1'b0)begin o_cnt[7:0] <= 8’d0; end else if(cnt_clr == 1’b1)begin o_cnt[7:0] <= 8’d0; end else if (cnt_en == 1’b1)begin o_cnt[7:0] <= o_cnt[7:0] + 1'b1; end end
數據寄存器帶使能打拍鎖存使用
always @(posedge clk)begin if(data_vld) dout[63:0] <= din; end
這種寫法綜合自動插時鐘門控,而且不帶復位。注意不能裸奔。
always @(posedge clk)begin dout[63:0] <= din; end
這樣寫就GG了
優先使用spram
有一種代碼規范是要求必須使用spram,single port ram。即使有同時讀寫的需求,也自己做邏輯,將讀寫分開做。強烈這么要求的原因是,有研究數據表明,在某工藝下,spram比dpram的面積基本會小30%。
30%的memory收益,這個收益還是很猛的。
memory規范操作
Memory必須先寫后讀,讀寫使能默認復位值必須是無效值。不用的時候不允許讀,否則會出現上電后芯片的memory一直掃描讀寫,徒增功耗。
Memory的數據讀出必須鎖存后使用。
memory和logic分開
Memory不散在邏輯中,將memory的讀寫控制端口都從IP的頂層伸出統一管理,為的是mem方便統一替換處理。而且后端實現上memory放邊擺開。
方便不同工藝的適配,比如你要換一個工藝,那你的memory要全部替換,就要在logic里面找,假如有些工藝十分惡心,要加個寄存器或者輸出到寄存器上,你就要一層層穿線到頂層寄存器模塊。作為IP供應商也應該做好memory的wrapper提供給客戶,方便客戶替換。
后端實現memory放邊擺開,logic要也考慮到memory的走線,所以對于memory的入口和出口都要是寄存器。不然PR出了問題,該做的還是得做。
模塊必須寄存器入寄存器出
在后端布局布線過程中,邏輯少的模塊之間還好,但harden之間有邏輯交互,兩個harden的距離并不一定擺的位置靠近。如果不是寄存器入寄存器出,會導致兩個harden之間交互的信號時序差。造成工作反復。
自研IP不建議用`define來定義參數
要求用parameter,define使用要謹慎,因為define是全局定義的,如果再使用過程中不當,沒有undef掉,可能會影響其他IP的同名define值。正確使用沒問題,無對錯,遵守公司代碼規范即可 。
審核編輯:劉清
-
計數器
+關注
關注
32文章
2209瀏覽量
93370 -
數據寄存器
+關注
關注
0文章
32瀏覽量
7599 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8168
原文標題:那些年我不理解的Verilog代碼規范,現在終于悟了
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論