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

寻求SystemVerilog定点数算术ASIC可综合代码的标准化实现方案

ASIC综合友好的SystemVerilog定点数算术运算优化方案

针对ASIC综合场景,通过参数化typedef封装定点数类型,结合运算函数自动处理位宽对齐与精度截断,完全规避实数和类的使用,解决重复编写位宽代码和符号数移位问题。

一、参数化定点数类型封装

用SystemVerilog包(Package)封装参数化定点数类型,统一管理整数位宽(INT_W)和小数位宽(FRAC_W),避免硬编码位宽:

package fixed_pkg;
  // 参数化定点数类型:INT_W为整数位宽(含符号位),FRAC_W为小数位宽
  typedef logic signed [INT_W-1:-FRAC_W] fixed_t #(
    parameter int INT_W = 5,  // 默认整数位宽5
    parameter int FRAC_W = 5   // 默认小数位宽5
  );

  // 自动推导乘法结果类型:整数位=两个操作数整数位之和,小数位=两个操作数小数位之和
  function automatic fixed_t#(.INT_W(INT_Wa+INT_Wb), .FRAC_W(FRAC_Wa+FRAC_Wb)) 
    multiply(
      fixed_t#(.INT_W(INT_Wa), .FRAC_W(FRAC_Wa)) a, 
      fixed_t#(.INT_W(INT_Wb), .FRAC_W(FRAC_Wb)) b
    );
    return a * b;
  endfunction

  // 精度截断函数:自动处理符号数的算术移位,保证负数截断正确性
  function automatic fixed_t#(.INT_W(TGT_INT), .FRAC_W(TGT_FRAC)) 
    truncate(
      fixed_t#(.INT_W(SRC_INT), .FRAC_W(SRC_FRAC)) src
    );
    logic signed [TGT_INT-1:-TGT_FRAC] temp;
    begin
      if (SRC_FRAC > TGT_FRAC) begin
        // 小数位截断:用算术移位(>>>)保持负数符号
        temp = src >>> (SRC_FRAC - TGT_FRAC);
      end else if (SRC_FRAC < TGT_FRAC) begin
        // 小数位扩展:符号位填充低位
        temp = src << (TGT_FRAC - SRC_FRAC);
      end else begin
        temp = src;
      end

      // 整数位截断:若源整数位超过目标,截取高位(可添加溢出检测)
      if (SRC_INT > TGT_INT) begin
        temp = src[SRC_INT-1 - (SRC_INT-TGT_INT) : -TGT_FRAC];
        // 可选:添加溢出断言
        // $assert(0, "Integer overflow during truncation");
      end
      truncate = temp;
    end
  endfunction
endpackage

二、实际使用示例

在模块中导入包,直接通过参数指定定点数精度,无需手动计算位宽:

import fixed_pkg::*;

module top_module;
  // 定义不同精度的定点数信号
  fixed_t#(.INT_W(2), .FRAC_W(2)) a;  // 示例:10.01 = 2.25
  fixed_t#(.INT_W(2), .FRAC_W(3)) b;  // 示例:01.001 = 1.125
  
  // 乘法完整结果(自动推导位宽:2+2=4位整数,2+3=5位小数)
  fixed_t#(.INT_W(4), .FRAC_W(5)) full_mult_result;
  // 目标精度结果:1位小数,3位整数(示例结果:10.1 = 2.5)
  fixed_t#(.INT_W(3), .FRAC_W(1)) c;

  always_comb begin
    full_mult_result = multiply(a, b);  // 或直接用a*b,函数可选用于显式类型推导
    c = truncate(full_mult_result);     // 自动截断到目标精度,处理符号数
  end

  // 模块实例化:直接传递定点数信号
  my_mod u_my_mod (
    .o1(a),
    .o2(b)
  );
endmodule

三、关键细节说明

  • 综合兼容性:参数化typedef和function是主流ASIC综合工具(Synopsys DC、Cadence Genus等)完全支持的语法,无不可综合结构。
  • 符号数处理:截断函数使用>>>算术移位,确保负数截断时符号位正确扩展,解决原代码中移位的问题。
  • 加法扩展:可参照乘法函数实现加法结果类型推导,加法结果的整数位为max(INT_Wa, INT_Wb)+1,小数位为max(FRAC_Wa, FRAC_Wb)。
  • 溢出控制:可在截断函数中添加溢出检测逻辑(如断言、溢出标志输出),根据项目需求处理溢出场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:51:34