在Verilog中获得MAX或MIN(签名)?

时间:2018-06-18 11:44:32

标签: max verilog fpga

我正在尝试创建一个函数来获取最大值(我正在使用带符号的数字)。

这是我的功能:

  function integer max(input integer  a, input integer  b, input integer  c, input integer  d);
    integer i;
    begin

            max = a;
    if ($signed(b) > $signed(max))
        max = b;
    if ($signed(c) > $signed(max))
        max = c;
    if ($signed(d) > $signed(max))
        max = d;

    end

  endfunction

由于某种原因,这不是计算有符号数的最大值。这是将数字视为未签名。

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

我刚刚在模拟器中运行了代码,发现max函数按预期工作。

我可以想到三个原因:

  1. 你在其他地方有错误。
  2. 你的期望是错误的。
  3. 你的模拟器坏了(我怀疑。)

答案 1 :(得分:0)

您的问题是您假设max函数的参数是无符号的,这就是您尝试使用$signed函数的原因。但是作为调用函数的一部分,它们已经被转换为有符号整数。您正在尝试传入8位无符号值,这些值将0扩展为32位有符号值。您需要执行以下操作之一:

  • 更改输入参数类型以匹配您的实际类型 通过。然后函数内部的转换$signed是有意义的。
  • 更改实际参数类型以匹配该函数 参数类型。执行转换以在函数调用之外签名,或者使变量签名开始。