浅尝AI辅助C转Verilog方法

一、常规算法模块的开发流程

日常芯片开发工作中,挺多看工作是把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循环:

cpp 复制代码
// 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):
python 复制代码
// 对应Verilog(按你的风格)
module sum_array (
  input clk,
  input [31:0] arr [0:3],
  output reg [31:0] sum_out
);
always @(posedge clk) begin
  sum_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代码进行过局部的微调,还比较可控------例如,要求某个函数的返回值类型、函数的调用方式从循环改为递归等等。

  • 增量转换:例如仅修改变化的代码段