优化此比较器以获得更好的合成

时间:2013-03-14 07:09:25

标签: verilog

我有一个模块,它基本上是一个输入为64位的LUT。 LUT始终块包含一个case语句,用于将输入与200多个不同的整数进行比较。 case语句中的默认情况检查输入是否为>在为输出分配默认值之前是否为100。

我的问题是,当我合成时,它会产生一个65位的比较器,我想知道是否有更好的方法来做到这一点,以便不会合成一个大的比较器。

这是我的代码段:

    always @(in)
    begin
    case (in) 
        -100: out <= 495050;
        -99: out <= 500000;
        ...
         99: out <= 99500000;
        100: out <= 99504950;

        default: 
        begin
            if (in > 100)
                out <= 99504950;
            else
                out <= 495050;
        end
    endcase
end

谢谢,

费萨尔

2 个答案:

答案 0 :(得分:3)

假设in是64位数字,你可以做的就是把它砍掉,这样你只需要“比较”最低的几位,然后你可以快速检查一下,看看是否数量超出了所需范围。

例如,让我们将8位的in斩掉,并将其分配给8位有符号寄存器。这应该允许您在-128和127之间表示。

您可以通过以下方式测试完整数字是否大于127 !in[63] && (|in[62:8])(检查是否有任何高位为1,并且未设置MSB。)

您可以通过以下方式测试完整数字是否小于-128:in[63] && !(&in[62:8])(检查是否有任何高位是0,并且MSB已设置。)

现在你知道三件事:

  1. 如果数字大于127
  2. 如果数字介于127和-128之间
  3. 如果数字小于-128。
  4. 您应该能够在中间情况下使用小的8位LUT,或者如果它在任何一个上限范围内,则使用默认值。

    注意我可能希望有一个好的合成器为你自动完成这项工作,但是如果你看一下生成的网表并且它太大了你可以试试看它是否能给你带来更好的结果。

答案 1 :(得分:2)

好像你已经用输入x = [-100; 100]的一些函数值计算了表。如果是这样,最好从一些基地址开始一个接一个地将它们存储在内存中。因此,要读取它们,您可以在地址总线上写入base + X + 100值,并获得所需的值。

如果您需要一个巨大的多路复用器,您可能想尝试使用“并行”案例指令。

对于“默认”中的比较器 - 我有同样的问题,所以我在等待答案。

我想把它写成评论,但我没有这样的特权