一、常规算法模块的开发流程
日常芯片开发工作中,挺多看工作是把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代码进行过局部的微调,还比较可控——例如,要求某个函数的返回值类型、函数的调用方式从循环改为递归等等。
增量转换:例如仅修改变化的代码段