目录

1.位宽自适应MAC技术的原理

(一)硬件架构设计

(二)位宽配置与控制

2.位宽自适应MAC技术的构架

3.位宽自适应MAC技术的优势

(一)提高计算效率

(二)降低功耗

(三)优化资源利用

4.位宽自适应MAC的Verilog实现


1.位宽自适应MAC技术的原理

(一)硬件架构设计

      位宽自适应 MAC 单元通常包含多个不同精度的乘法器模块以及相应的控制逻辑电路。以实现 8bit/16bit 位宽自适应的 MAC 单元为例,它可能包含两个 8×16bit 乘法器。当配置为 8bit 模式时,这两个乘法器可以并行处理数据,分别计算高 8bit 和低 8bit 部分与输入数据的乘积;当需要进行 16bit 操作时,两个乘法器可以组合成一个 16×16bit 乘法器。

       此外,还需要设计专门的配置寄存器,用于存储当前的位宽配置信息。控制逻辑电路根据配置寄存器中的值,动态地选择乘法器的工作模式,并对数据通路进行相应的切换,以确保数据能够正确地在不同精度的乘法器之间流动。

(二)位宽配置与控制

      位宽配置可以通过软件编程的方式进行,芯片的驱动程序或上层应用可以根据当前的计算任务需求,向配置寄存器写入相应的配置字。例如,在图像识别任务的前期特征提取阶段,数据的动态范围较小,可将MAC单元配置为8bit模式,提高计算速度;而在后期的分类决策阶段,为了提高计算精度,可将其配置为16bit模式。

       控制逻辑电路在接收到配置信息后,会对乘法器的输入输出接口、数据选择器以及时钟门控等模块进行控制。在8bit模式下,控制逻辑会确保两个8×16bit乘法器独立工作,并将各自的计算结果进行拼接;在16bit模式下,会将两个乘法器组合,并对数据通路进行调整,以实现16×16bit的乘法运算。

2.位宽自适应MAC技术构架

位宽自适应MAC技术的构架如下图所示:

此图来自《人工智能芯片设计》一书

当权重数据位宽小于8bit时(对应图上半部分流程):

权重拼接:来自不同卷积核或神经元的两个低bit权重,会被拼接整合为一个 16bit 权重数据。例如,两个4bit权重可组合成高8bit+低8bit的16bit结构,充分利用硬件乘法器的位宽资源。

并行乘法:拆分后的高8bit与低8bit权重段,会分别接入两个独立的8×16bit乘法器,与相同的16bit 输入数据同步运算。这种并行设计让两个乘法操作无冲突执行,避免了传统设计中因共享硬件导致的等待开销。

结果处理:每个乘法器输出25bit结果(含保留位用于精度扩展 ),随后两个25bit结果被拼接为 50bit数据。此时,配置字S11置0,硬件选通“直接拼接结果”输出,跳过额外运算。

无保护间隔优势:由于双乘法器独立工作,输入数据无需像赛灵思INT8优化方案那样预留9bit保护间隔(用于分离结果 )。少了间隔填充的冗余步骤,数据通路更简洁,8bit乘法场景下的运算效率显著提升 —— 可理解为 “用硬件并行性替代了软件间隔补偿”。

当权重位宽≥8bit 时(对应图下半部分流程):

乘法器重组:两个8×16bit乘法器会被逻辑重构,组合为一个16×16bit乘法器。这种 “硬件复用” 设计让单一模块支持更高精度运算,适配复杂场景对数据范围的需求。

移位加法流程:乘法结果先进入移位和加法单元。高25bit结果会被移位8bit(相当于左移补位 ),再与低 25bit 结果相加融合。此操作通过移位对齐数据位宽,保证加法运算的精度连续性。

选通控制:配置字S11置1,硬件切换为 “移位相加结果” 输出模式。相比传统固定16bit乘法器设计,Thinker 架构的乘法器可在“8bit 并行”与“16bit组合” 模式灵活切换,避免了硬件资源的闲置 —— 例如,无需为16bit场景单独部署专用乘法器,用一套模块覆盖多精度需求,资源利用率更高。

3.位宽自适应MAC技术的优势

(一)提高计算效率

       通过根据数据的实际精度需求动态调整MAC单元的位宽,可以避免不必要的高精度计算,从而显著提高计算效率。在一些简单的AI任务中,采用8bit位宽计算可以使计算速度提升数倍,因为 8bit 乘法运算的电路延迟相对较小,且数据传输带宽需求也较低。

       例如,在基于MobileNet的轻量级图像分类任务中,使用位宽自适应MAC技术后,推理速度相比固定32bit位宽的MAC单元提高了2-3倍,能够在更短的时间内完成图像分类任务,满足实时性要求。

(二)降低功耗

       未使用的数据通路采用时钟门控技术是位宽自适应 MAC 技术降低功耗的重要手段。当 MAC 单元处于 8bit 模式时,对于 16bit 乘法器中未使用的部分,控制逻辑会关闭其时钟信号,使其进入低功耗状态,从而减少动态功耗。

       研究表明,在一些典型的深度学习推理任务中,采用位宽自适应MAC技术可以将芯片的整体功耗降低30%-50%。这对于电池供电的移动设备,如智能手表、智能手机等,具有重要的意义,能够显著延长设备的续航时间。

(三)优化资源利用

        位宽自适应MAC技术可以根据不同的计算任务灵活配置硬件资源,提高硬件资源的利用率。在处理低精度数据时,不需要占用高分辨率乘法器的全部资源,从而可以将节省下来的资源用于其他计算任务或存储操作。

       例如,在多任务处理的AI芯片中,当一个任务对计算精度要求较低时,MAC单元可以配置为低精度模式,释放出的资源可以分配给其他对计算资源需求较大的任务,提高芯片的整体资源利用效率。

4.位宽自适应MAC技术的verilog实现

根据上述的原理,我们编写如下的verilog程序:

module adaptive_mac (
    input wire         clk,          // 时钟信号
    input wire         rst_n,        // 异步复位信号(低有效)
    input wire         s11,          // 模式配置信号(0:8bit模式,1:16bit模式)
    input wire [15:0]  data_in,      // 16bit输入数据
    input wire [15:0]  weight_in,    // 权重输入(8bit模式下高/低8bit为两个权重)
    input wire         acc_en,       // 累加使能信号
    output reg [49:0]  mac_out,      // MAC输出结果
    output reg         mac_valid     // 输出有效信号
);

// 内部信号定义
reg [24:0] mult1_out;  // 乘法器1输出(25bit)
reg [24:0] mult2_out;  // 乘法器2输出(25bit)
reg [49:0] comb_result;// 组合结果寄存器
reg [24:0] shifted_high;// 移位后的高25bit结果
reg        clk_gate1;  // 乘法器1时钟门控
reg        clk_gate2;  // 乘法器2时钟门控

// 时钟门控逻辑(低功耗优化)
always @(*) begin
    if (s11) begin  // 16bit模式:两个乘法器都工作
        clk_gate1 = 1'b1;
        clk_gate2 = 1'b1;
    end else begin  // 8bit模式:两个乘法器都工作(并行处理)
        clk_gate1 = 1'b1;
        clk_gate2 = 1'b1;
        // 注意:实际应用中可根据具体场景添加更精细的门控逻辑
    end
end

// 乘法器1实现(8x16)
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        mult1_out <= 25'd0;
    end else if (clk_gate1) begin
        if (s11) begin  // 16bit模式:处理16bit权重的高8bit
            mult1_out <= $signed(data_in) * $signed({1'b0, weight_in[15:8]});
        end else begin  // 8bit模式:处理低8bit权重
            mult1_out <= $signed(data_in) * $signed({1'b0, weight_in[7:0]});
        end
    end
end

// 乘法器2实现(8x16)
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        mult2_out <= 25'd0;
    end else if (clk_gate2) begin
        if (s11) begin  // 16bit模式:处理16bit权重的低8bit
            mult2_out <= $signed(data_in) * $signed({1'b0, weight_in[7:0]});
        end else begin  // 8bit模式:处理高8bit权重
            mult2_out <= $signed(data_in) * $signed({1'b0, weight_in[15:8]});
        end
    end
end

// 结果组合逻辑
always @(*) begin
    if (s11) begin  // 16bit模式:移位相加(高25bit左移8位)
        shifted_high = mult1_out << 8;
        comb_result = shifted_high + mult2_out;
    end else begin  // 8bit模式:直接拼接
        comb_result = {mult2_out, mult1_out};  // 高25bit+低25bit
    end
end

// 累加器与输出逻辑
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        mac_out <= 50'd0;
        mac_valid <= 1'b0;
    end else if (acc_en) begin
        // 累加操作(支持累加链扩展)
        mac_out <= mac_out + comb_result;
        mac_valid <= 1'b1;
    end else begin
        mac_valid <= 1'b0;
    end
end

endmodule

对应的testbench如下:

`timescale 1ns/1ps

module adaptive_mac_tb;

// 测试信号定义
reg         clk;
reg         rst_n;
reg         s11;
reg [15:0]  data_in;
reg [15:0]  weight_in;
reg         acc_en;
wire [49:0] mac_out;
wire        mac_valid;

// 实例化被测模块
adaptive_mac uut (
    .clk(clk),
    .rst_n(rst_n),
    .s11(s11),
    .data_in(data_in),
    .weight_in(weight_in),
    .acc_en(acc_en),
    .mac_out(mac_out),
    .mac_valid(mac_valid)
);

// 时钟生成(100MHz)
initial begin
    clk = 1'b0;
    forever #5 clk = ~clk;
end

// 测试流程
initial begin
    // 初始化
    rst_n = 1'b0;
    s11 = 1'b0;
    data_in = 16'd0;
    weight_in = 16'd0;
    acc_en = 1'b0;
    
    // 释放复位
    #20 rst_n = 1'b1;
    
    // 测试8bit模式(两个并行乘法)
    // 场景: data=10, weight1=3, weight2=5
    #10
    s11 = 1'b0;
    data_in = 16'd10;
    weight_in = {8'd5, 8'd3};  // 高8bit=5,低8bit=3
    acc_en = 1'b1;
    
    // 预期结果: (10*3)=30, (10*5)=50 → 拼接结果=50<<25 + 30
    #10
    acc_en = 1'b0;
    
    // 测试16bit模式(组合乘法)
    // 场景: data=10, weight=0x0503(1283)
    #20
    s11 = 1'b1;
    data_in = 16'd10;
    weight_in = 16'h0503;  // 16bit权重=1283
    acc_en = 1'b1;
    
    // 预期结果: 10*1283=12830 → 移位相加后累加
    #10
    acc_en = 1'b0;
    
    // 测试累加功能
    #20
    acc_en = 1'b1;  // 再次累加相同值
    #10
    acc_en = 1'b0;
    
    // 结束测试
    #50 $finish;
end

// 监控输出
always @(posedge clk) begin
    if (mac_valid) begin
        $display("Time: %0t, MAC Output: %0d", $time, mac_out);
    end
end

endmodule

该位宽自适应MAC设计实现了8bit和16bit两种运算模式的动态切换。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐