cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Highlighted
5,954 Views
Registered: ‎02-18-2013

A problem of using HLS

I have some code:

void subBytes_shiftRows(uint8_t input[16], uint8_t output[16])
{
lookup_sbox(input[0] , &output[0] );
lookup_sbox(input[5] , &output[1] );
lookup_sbox(input[10], &output[2] );
lookup_sbox(input[15], &output[3] );
lookup_sbox(input[4] , &output[4] );
lookup_sbox(input[9] , &output[5] );
lookup_sbox(input[14], &output[6] );
lookup_sbox(input[3] , &output[7] );
lookup_sbox(input[8] , &output[8] );
lookup_sbox(input[13], &output[9] );
lookup_sbox(input[2] , &output[10]);
lookup_sbox(input[7] , &output[11]);
lookup_sbox(input[12], &output[12]);
lookup_sbox(input[1 ], &output[13]);
lookup_sbox(input[6 ], &output[14]);
lookup_sbox(input[11], &output[15]);
}


void lookup_sbox(uint8_t sbox_in, uint8_t *sbox_out)
{

static uint8_t sbox[256] = {
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};

*sbox_out = (uint8_t) sbox[sbox_in];
}

 

I have reshaped the input and output of function subBytes_shiftRows, I hope I can read 128bits data at one time, there are16 lookup_sbox modules,we can get the output in 3 clock cycles. But it is optimized automatically, there is only one lookup_sbox module, what can I do to generate what I wante?

0 Kudos
2 Replies
Highlighted
Visitor
Visitor
5,873 Views
Registered: ‎12-13-2011

Have you tried this?

#include "ap_cint.h"

void subBytes_shiftRows(uint8 input[16], uint8 output[16])
{
#pragma HLS ARRAY_RESHAPE variable=input complete dim=1
#pragma HLS ARRAY_RESHAPE variable=output complete dim=1
lookup_sbox(input[0] , &output[0] );
lookup_sbox(input[5] , &output[1] );
[...]
}

void lookup_sbox(uint8 sbox_in, uint8 *sbox_out)
{
#pragma HLS PIPELINE

static uint8 sbox[256] = {
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
[...]
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};
#pragma HLS ARRAY_PARTITION variable=sbox complete dim=1

As far as I can see, this generates 16 lookup_sbox instances, with "some" LUTs in order to execute in 1 cycle. Adjust the directives in order to fit to your needs.

begin
    call_ret1_lookup_sbox_fu_88 : component lookup_sbox
    port map (
        sbox_in => call_ret1_lookup_sbox_fu_88_sbox_in,
        ap_return => call_ret1_lookup_sbox_fu_88_ap_return);

    call_ret2_lookup_sbox_fu_93 : component lookup_sbox
    port map (
        sbox_in => call_ret2_lookup_sbox_fu_93_sbox_in,
        ap_return => call_ret2_lookup_sbox_fu_93_ap_return);

    call_ret3_lookup_sbox_fu_98 : component lookup_sbox
    port map (
        sbox_in => call_ret3_lookup_sbox_fu_98_sbox_in,
        ap_return => call_ret3_lookup_sbox_fu_98_ap_return);

    call_ret4_lookup_sbox_fu_103 : component lookup_sbox
    port map (
   ...

 

0 Kudos
Highlighted
Moderator
Moderator
5,843 Views
Registered: ‎04-17-2011

Please let us know if the suggestion was helpful? If its fixed already we can close this post as an Accepted Solution for future usage. If you have found an alternate solution, kindly post it too for others.
Regards,
Debraj
----------------------------------------------------------------------------------------------
Kindly note- Please mark the Answer as "Accept as solution" if information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.
----------------------------------------------------------------------------------------------
0 Kudos