一、常規算法模塊的開發流程
日常芯片開發工作中,挺多看工作是把C語言轉verilog。例如ISP的代碼,都很先由算法進行C model的開發,驗證完性能后,輸出算法原理文檔和c代碼;數字設計接手,把C語言轉換為verilog代碼。
這其中C代碼,不同于通常的C仿真,通常是考慮數據在運算過程中的位寬——這就需要在C代碼的處理過程中,注意有效位寬的控制。
添加圖片注釋,不超過 140 字(可選)
二、轉變思路,思考能如何能用AI加速RTL的開發
關于算法代碼轉verilog,我見過的最早的商業嘗試是MATLAB。因為在MATLAB里面驗證算法,是很常見的方式;進而,它也推出了m語言或者simulink轉verilog(主要用于FPGA)的方式。但是生成的代碼面積或者效率還是乏善可陳。但是,還是一個很大的嘗試。后來,MATLAB還支持生成UVM驗證環境。
但是開發ASIC,通常對于PPA是有比較苛刻的要求的。通常都是要有經驗豐富的數字設計人員來完成C model(或者其他語言)轉verilog的工作。但是,團隊人員的經驗和數量,也限制了RTL的開發效率。
如果使用AI,最佳的方式應該是本地部署,自己調優。但是這個見效慢,對于小公司或者個人來說,除了硬件成本高,學習成為、維護成本都比較高。
對于還是AI菜鳥的我,就想先用網頁版的AI大模型看看能不能實現我的思路,等有一定的可行性,再考慮上本地部署。
之前用AI,都還是習慣于命令式的,例如:幫我做XX;幫我把XX轉換為YY。
這種情況得到的結果,通常AI理解的肯定不如一個經驗豐富的數字設計好;而且公司產品一些常用的設計方法,AI也無從知曉。
然后,就想到,是不是讓AI教我,如何深度定制C轉verilog的行為,讓它更懂我。下面是基于這個思路,和多個AI提問后,結果的融合。
三、如何深度定制AI的行為
書回正題,怎么利用現有的大模型(非本地部署,等有條件了,再嘗試本地部署)。
其實,我也不知道怎么能讓AI幫我把C轉換為verilog,那我先問問它們。
輸入提示詞:
我是一名芯片開發工程師,我能讓你幫我把C語言代碼翻譯為verilog嗎? 我之前已經有比較多的c轉verilog的代碼,如何能讓你按照我的工作習慣進行轉換?
得到的回答:
1、提供樣本,用于讓AI學習規則和開發習慣。
2、提供額外的規則文檔,深度定制verilog的編寫方式。
關于樣本
準備階段,需要喂給AI的代碼對(c-verilog)的樣本:
這些文檔是用來描述轉換規則的。建議準備3到5對轉換結果。
這些樣本中,AI可以學習到命名規范(例如C的函數名與verilog的module名的轉換關系);接口映射規則‘狀態機編碼風格;for循環的展開規則。因此,這些樣本,最好也有這些信息。
代碼對的示例(C),含for循環:
// C示例 (sum_array.c)
int sum(int arr[4]) { int s = 0; for(int i=0; i<4; i++) s += arr[i]; return s;
}
代碼對的示例(verilog):
// 對應Verilog(按你的風格)
module sum_array (input clk,input [31:0] arr [0:3],output reg [31:0] sum_out
);
always @(posedge clk) beginsum_out <= arr[0] + arr[1] + arr[2] + arr[3]; // 循環展開
end
endmodule
關于規則文檔
除了樣本,還可以提交結構化的規則文檔——描述你的一些習慣,深度定制:
例如:
- 接口命名:輸入加`_i`后綴,輸出加`_o`
- 狀態機:用三段式FSM,狀態名全大寫(如`IDLE`, `CALC`)
- 位寬聲明:顯式寫出`[MSB:0]`而非`[MSB-1:0]`
- 時序邏輯:非阻塞賦值統一用`<=`
- 組合邏輯:用`assign`或`always@(*)`,避免`wire/reg`混用
四、進一步的優化
局部優化或者修改:可以針對不滿意的地方,提出改進要求。之前對AI生成的python代碼進行過局部的微調,還比較可控——例如,要求某個函數的返回值類型、函數的調用方式從循環改為遞歸等等。
增量轉換:例如僅修改變化的代碼段