无边界逻辑向量参数的VHDL定点舍入函数转SystemVerilog方法咨询
VHDL无边界定点舍入函数转SystemVerilog实现方案
核心转换要点
针对原函数无固定参数边界的特性,需适配VHDL与SystemVerilog在类型属性、归约操作上的语法差异:
- 用SV系统函数
$left()、$right()、$bits()替代VHDL的'left、'right、'length属性,保证变量范围与输入参数完全匹配 - 将VHDL的
or_reduce/and_reduce替换为SV的|/&向量归约操作符 - 使用
automatic关键字声明函数,确保每次调用动态分配变量,避免静态范围冲突 - SV中
logic signed对应VHDL的signed,logic对应std_logic,无需显式类型转换
转换后的SystemVerilog代码
// 定点舍入函数,支持原VHDL定义的所有舍入类型 function automatic logic signed[$left(int_part):$right(int_part)] fixed_round( input logic signed int_part, input logic signed frac_part, input int round_type, input logic saturation = 1'b0 ); logic sign_bit; // S:符号位 logic one_bit; // D:整数部分最低位 logic half_bit; // F:小数部分最高位 logic other_bit; // R:小数部分其余位的或值 logic is_saturated; logic signed[$left(int_part):$right(int_part)] addend; logic signed[$left(int_part):$right(int_part)] rounded; logic[$left(frac_part):$right(frac_part)] other_bits; logic[$left(int_part)-1 : $right(int_part)+1] int_slice; // 提取舍入判断所需的关键位 sign_bit = int_part[$left(int_part)]; one_bit = int_part[$right(int_part)]; half_bit = frac_part[$left(frac_part)]; // 计算小数部分除最高位外的其余位或值 if ($bits(frac_part) > 1) begin other_bits = frac_part; other_bits[$left(frac_part)] = 1'b0; other_bit = |other_bits; end else begin other_bit = 1'b0; end // 初始化舍入增量为0(后续根据round_type填充逻辑) addend = '0; // ---------------------- // 此处补充原VHDL中未展示的round_type分支逻辑 // ---------------------- // 判断是否需要饱和处理 int_slice = int_part[$left(int_part)-1 : $right(int_part)+1]; if (saturation && !sign_bit && (&int_slice)) begin is_saturated = 1'b1; end else begin is_saturated = 1'b0; end // 应用舍入增量或保持饱和值 if (!is_saturated) begin rounded = int_part + addend; end else begin rounded = int_part; end return rounded; endfunction
关键细节说明
- 动态范围匹配:所有变量(如
addend、rounded)的位宽与位序完全继承输入参数int_part/frac_part的属性,确保无固定边界限制 - 饱和判断逻辑:
int_slice提取了int_part除符号位和最低位外的中间部分,通过全1判断正数是否达到最大值,与原VHDL逻辑完全一致 - 归约操作简化:SV的向量归约操作符
|/&直接实现VHDL中or_reduce/and_reduce的功能,语法更简洁
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

