You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为实例化SystemVerilog模块调度多输入?能否复用乘法器实现立方计算?

复用乘法器实现参数化立方模块及输入调度方案

复用乘法器的实现思路

要复用单个fast_mul完成两次乘法(in0*in0和(in0*in0)*in0),必须将原组合逻辑改为时序电路,通过控制逻辑分时调度乘法器的输入与结果存储。以下是具体实现:

代码示例

module cuber #(
    parameter BW = 32
) (
    input  logic             clk,
    input  logic             rst_n,
    input  logic             in_valid,
    input  logic [BW-1:0]    in0,
    output logic             out_valid,
    output logic [BW*3-1:0]  cubed_op  // 注意:32位输入立方需要96位输出,原代码BW*2位宽错误
);

// 状态定义
typedef enum logic [1:0] {IDLE, SQR_STAGE, CUBE_STAGE} state_t;
state_t curr_state, next_state;

// 寄存器定义
logic [BW-1:0]       in0_reg;       // 寄存输入值,避免运算周期内输入变化
logic [BW*2-1:0]     sqr_result;    // 寄存平方运算结果
logic [BW*2-1:0]     mul_input1;    // 乘法器输入1选择
logic [BW-1:0]       mul_input2;    // 乘法器输入2选择
logic [BW*2-1:0]     mul_product;   // 乘法器输出寄存

// 实例化单个乘法器
fast_mul #(.BW(BW))
fm_inst (
    .input1(mul_input1),
    .input2(mul_input2),
    .product(mul_product)
);

// 状态寄存器更新
always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        curr_state <= IDLE;
    end else begin
        curr_state <= next_state;
    end
end

// 下一状态逻辑
always_comb begin
    next_state = curr_state;
    out_valid = 1'b0;
    mul_input1 = '0;
    mul_input2 = '0;

    case (curr_state)
        IDLE: begin
            if (in_valid) begin
                next_state = SQR_STAGE;
            end
        end
        SQR_STAGE: begin
            // 第一次乘法:计算输入的平方
            mul_input1 = in0_reg;
            mul_input2 = in0_reg;
            next_state = CUBE_STAGE;
        end
        CUBE_STAGE: begin
            // 第二次乘法:用平方结果乘输入得到立方
            mul_input1 = sqr_result;
            mul_input2 = in0_reg;
            out_valid = 1'b1;
            next_state = IDLE;
        end
    endcase
end

// 数据路径寄存器更新
always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        in0_reg <= '0;
        sqr_result <= '0;
        cubed_op <= '0;
    end else begin
        if (in_valid && curr_state == IDLE) begin
            in0_reg <= in0;
        end
        if (curr_state == SQR_STAGE) begin
            sqr_result <= mul_product;
        end
        if (curr_state == CUBE_STAGE) begin
            cubed_op <= mul_product;
        end
    end
end

endmodule

关键细节说明

  1. 位宽修正:原代码中立方输出位宽设为BW*2存在溢出风险,32位输入的立方需要3*BW位(96位)才能完整存储结果。
  2. 时序控制:通过两阶段状态机分时复用乘法器,输入值提前寄存,保证运算周期内数据稳定。
  3. 握手信号:新增in_valid和out_valid实现输入输出的时序同步,符合时序电路的设计规范。

实例化模块的多输入调度方法

对SystemVerilog模块(如fast_mul)进行多输入调度,核心是通过**控制逻辑(状态机/计数器)**分时切换输入源,配合寄存器存储中间结果,常见方案包括:

  • 状态机调度:如上述示例,不同状态对应不同输入组合,适合固定步骤的运算场景(如平方→立方)。
  • 计数器调度:若运算步骤较多,可采用计数器计数,根据计数值切换输入源,适配多轮重复运算。
  • 多路选择器配合寄存:用多路选择器(mux)根据控制信号切换乘法器的输入端口,同时用寄存器缓存输入和中间结果,确保每个周期乘法器都能获取正确输入。

需注意:分时复用硬件会增加运算延迟(原组合逻辑无延迟,复用后需要2个时钟周期输出结果),需根据项目的面积-延迟需求权衡选择。

内容的提问来源于stack exchange,提问作者Suhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:41:17