2

任何有 Xilinx Vivado HLS 和 FPGA 设计经验的人的疑问/问题:

我需要帮助减少在 HLS 范围内的设计利用率(即不能只重做 HDL 中的设计)。我的目标是 Zedboard (Zynq 7020)。

我正在尝试在 HLS 中实现 2048 位 RSA,使用 Tenca-koc 多字基数 2 蒙哥马利乘法算法,如下所示(更多算法细节here):

在此处输入图像描述

我在 HLS 中编写了这个算法,它在模拟和 C/RTL cosim 中工作。我的算法在这里:

#define MWR2MM_m 2048  // Bit-length of operands
#define MWR2MM_w 8     // word size
#define MWR2MM_e 257   // number of words per operand

// Type definitions
typedef ap_uint<1> bit_t;             // 1-bit scan
typedef ap_uint< MWR2MM_w > word_t;     // 8-bit words
typedef ap_uint< MWR2MM_m > rsaSize_t;  // m-bit operand size


/*
 * Multiple-word radix 2 montgomery multiplication using carry-propagate adder
 */
void mwr2mm_cpa(rsaSize_t X, rsaSize_t Yin, rsaSize_t Min, rsaSize_t* out)
{
    // extend operands to 2 extra words of 0
    ap_uint<MWR2MM_m + 2*MWR2MM_w> Y = Yin; 
    ap_uint<MWR2MM_m + 2*MWR2MM_w> M = Min;
    ap_uint<MWR2MM_m + 2*MWR2MM_w> S = 0;

    ap_uint<2> C = 0; // two carry bits
    bit_t qi = 0;     // an intermediate result bit

    // Store concatenations in a temporary variable to eliminate HLS compiler warnings about shift count
    ap_uint<MWR2MM_w> temp_concat=0; 

    //  scan X bit-by bit
    for (int i=0; i<MWR2MM_m; i++)
    {
        qi = (X[i]*Y[0]) xor S[0];

        // C gets top two bits of temp_concat, j'th word of S gets bottom 8 bits of temp_concat
        temp_concat = X[i]*Y.range(MWR2MM_w-1,0) + qi*M.range(MWR2MM_w-1,0) + S.range(MWR2MM_w-1,0);
        C = temp_concat.range(9,8);
        S.range(MWR2MM_w-1,0) = temp_concat.range(7,0);

        // scan Y and M word-by word, for each bit of X
        for (int j=1; j<=MWR2MM_e; j++)
        {
            temp_concat = C + X[i]*Y.range(MWR2MM_w*j+(MWR2MM_w-1), MWR2MM_w*j) + qi*M.range(MWR2MM_w*j+(MWR2MM_w-1), MWR2MM_w*j) + S.range(MWR2MM_w*j+(MWR2MM_w-1), MWR2MM_w*j);
            C = temp_concat.range(9,8);
            S.range(MWR2MM_w*j+(MWR2MM_w-1), MWR2MM_w*j) = temp_concat.range(7,0);

            S.range(MWR2MM_w*(j-1)+(MWR2MM_w-1), MWR2MM_w*(j-1)) = (S.bit(MWR2MM_w*j), S.range( MWR2MM_w*(j-1)+(MWR2MM_w-1), MWR2MM_w*(j-1)+1));
        }
        S.range(S.length()-1, S.length()-MWR2MM_w) = 0;
        C=0;
    }

    // if final partial sum is greater than the modulus, bring it back to proper range
    if (S >= M)
        S -= M;

    *out = S;
}

不幸的是,LUT 的利用率很高。 在此处输入图像描述

这是有问题的,因为我需要能够在硬件中安装多个这些块作为 axi4-lite 从站。

有人可以就如何在 HLS 范围内降低 LUT 利用率提供一些建议吗?

我已经尝试过以下方法:

  • 尝试不同的字长
  • 将顶级输入切换到数组,使其成为 BRAM(即不使用 ap_uint<2048>,而是使用 ap_uint foo[MWR2MM_e])
  • 尝试各种指令:划分为多个内联函数、数据流架构、lshr 的资源限制等。

但是,没有什么能真正以有意义的方式降低 LUT 利用率。是否有一种显而易见的方法可以降低对任何人来说显而易见的利用率?

特别是,我看过有关 mwr2mm 算法实现的论文(仅使用一个 DSP 块和一个 BRAM)。这甚至值得尝试使用 HLS 来实现吗?还是没有办法在不使用 HDL 描述的情况下实际控制算法映射到的资源?

谢谢您的帮助。

4

0 回答 0