List Info

Thread: RC5 verilog code generator




RC5 verilog code generator
country flaguser name
United States
2007-03-13 13:44:37
For those who may be interested, here is my Verilog pipeline
generator 
that I believe produces code that correctly computes any of
the RC5 
tests. It does NO pipeline retiming which is what I'm
working on fixing 
right now. This was adapted from my C program which I will
post. This 
program was not adapted from John Bass's work, but probably
wouldn't be 
possible without his assistance over the past year or two.
I'm posting 
this mainly in case anyone else has interest in it in the
future.
--
Martin Klingensmith

---
start builder_vlg.c
///
// Verilog Pipeline Builder code
// No pipeline retiming (work in progress)
// Martin Klingensmith: martin at nnytech.net

// References: Schneier, Bruce, Applied Cryptography
// John Bass

#include <stdio.h>
#include <math.h>

int main()
{
        int w=32;
        int r=12;
        int b=5;
        int c=2; // b/4 if remainder add 1

        int x=0, i=0, j=0, y=0, oldi=0, oldj=0;
        int An=0, Bn=0, Ln=0, Sn=0;
        long int S[6*r+6],P,Q;
        int ln[4];
        char n=20,oldn=20,oldoldn=20,tempn=20;
        ln[0] = 0;
        ln[1] = 0;
        ln[2] = 0;
        for(x=0;x<2*r+2;x++) S[x] = 0;

        printf("nmodule
pipe(A,B,key0,key1,key2,clock,clr);");
        printf("ntoutput [31:0]A,B;");
        printf("ntinput
[31:0]key0,key1,key2;");
        printf("ntinput clock,clr;");

        printf("n// RC5 - %d/%d/%d (%d bit word size /
%d rounds / %d 
byte key)nn",w,r,b,w,r,b);

        printf("treg[32:0]n");
        printf("A, B, L0, L1, L2, S0, S1,f,g");

        // determine how many times to do the main loop:
        y = 3*c;
        if((6*r+6)>y) y = (6*r+6);


        for(x=0;x<=c;x++) {
                for(An=0;An<(y/2);An++) {
                        printf(",L%d_%d",x,An); //
initialize Ln variables
                }
        }
        for(x=0;x<=2*r+1;x++){
                
printf(",S%da,S%db,S%dc",x,x,x);                  
             // 
output Sa/b/c vars
                if(!(x%5)) printf("n");
        }
        for(x=0;x<=r;x++){                               
      // 
output A/B vars
                printf(", A%d, B%d",x,x);
        }

    printf(";nnfunction [31:0]ROTL;ninput
[31:0]x;ninput 
[31:0]n;nbegin");
        printf("ntROTL = (((x) << (n[4:0])) |
((x) >> 
(32-(n[4:0]))));ntendnendfunction");
        printf("nfunction [31:0]ROTL3;ntinput
[31:0]x;ntROTL3 = 
(((x) << 3) | ((x) >>
(32-3)));nendfunction");


        printf("nnalways (posedge 
clock)nbeginntif(clr==1)ntbeginnnA=0; B=0");
        for(x=0;x<=c;x++) {
                for(An=0;An<(y/2);An++) {
                        printf(";L%d_%d=0",x,An); 
     // initialize Ln 
variables
                }
        }
        for(x=0;x<=2*r+1;x++){
               
printf(";S%da=0;S%db=0;S%dc=0",x,x,x);
                if(!(x%5)) printf("n");
        }
        for(x=0;x<=r;x++){                               
              
// initialize A/B vars
                printf("; A%d=0; B%d=0",x,x);
        }
        printf(";nnend elsenbeginn");
        printf("nn// Key Setup + Encryption");
        printf("nL2_0 = 32'h85;");
        printf("nL1_0 = 32'hfee1d4c0;");
        printf("nL0_0 = 32'h53030cc9;");
        printf("nA = 32'h3f3ca653;");
        printf("nB = 32'h2ff17af3;");

        P = 0xb7e15163;
        Q = 0x9e3779b9;
        S[0] = P;
        for(x=1;x<2*r+2;x++) S[x] = ( S[x-1] + Q ) &
0xFFFFFFFF;


        An=0;
        Bn=0;


        for(x=0;x<y;x++){
                if(x<(2*r+2)) {
                        if(n != 'a') oldn=n;
                        n = 'a';
                } else {
                        if(x<(4*r+4)) {
                                if(n != 'b') oldn=n;
                                n = 'b';
                        } else {
                                if(x<(6*r+6)) {
                                        if(n != 'c')
oldn=n;
                                        n = 'c';
                                }
                        }
                }
                printf("nn// loopn=%d, third=%c,
oldn=%c",x+1,n,oldn);

                if(x==0){
                        ln[j]++;
                        printf("nS%d%c = ROTL(32'h%X,

3);",i,n,S[x]);                                  //
case 0
                        printf("nL%d_%d = ROTL(L%d_%d
+ S%d%c, 
S%d%c);",j,ln[j],j,ln[j]-1,i,n,i,n);            // case
0
                } else {
                        if(x<=(2*r+1)){
                                printf("nS%d%c =
ROTL(32'h%X + S%d%c + 
L%d_%d, 3);",i,n,S[x],oldi,n,oldj,ln[oldj]); // first
third
                        } else {
                                if(oldn!=oldoldn) {
                                        oldoldn=oldn;
                                        printf("
*");
                                        tempn = oldn;
                                } else {
                                        tempn = n;
                                }
                                printf("nS%d%c =
ROTL(S%d%c + S%d%c + 
L%d_%d, 3);",i,n,i,oldn,oldi,tempn,oldj,ln[oldj]);     
 // last third
                        }
                        ln[j]++; // first+last third
                        printf("nL%d_%d = ROTL(L%d_%d
+ S%d%c + L%d_%d, 
S%d%c+L%d_%d);",j,ln[j],j,ln[j]-1,i,n,oldj,ln[oldj],i,n
,oldj,ln[oldj]);
                }
               
//printf("nprintf("\n%d.tf=%%xtg=%%x",f
,g);",x+1);

                if(i==0 && (x)>=(4*r+4))        {
// if i==0
                        printf("nA0 = A +
S0%c;",n);
                } else {
                        if(i==1 && (x)>=(4*r+4))
{ // if i==1
                                printf("nB0 = B +
S1%c;",n);
                        } else {
                                if(i%2 &&
(x)>=(4*r+4)) { // if i==odd
                                        Bn++;
                                        printf("nB%d =
ROTL(B%d^A%d, 
A%d) + S%d%c;",Bn,Bn-1,An,An,i,n);
                                }
                                if((i+1)%2 &&
(x)>=(4*r+4)) { // if i==even
                                        An++;
                                        printf("nA%d =
ROTL(A%d^B%d, 
B%d) + S%d%c;",An,An-1,Bn,Bn,i,n);
                                }
                        }
                }
                oldi = i;
                oldj = j;
                i = (i + 1) % (2*(r+1));
                j = (j + 1) % c;
        }

        printf("nnendnendnendmodule");

}


_______________________________________________
Hardware mailing list
Hardwarelists.distributed.net
http://lists.distributed.net/mailman/listinfo/hardware


Re: RC5 verilog code generator
country flaguser name
United States
2007-03-14 10:44:39
There are some errors with this. I thought I had made them
in this code 
but I suppose I have not. The main thing is that it should
use non 
blocking assignments. It will require tweaking to get the
correct 
[syntax] output anyway.
--
Martin K

Martin Klingensmith wrote:
> For those who may be interested, here is my Verilog
pipeline generator 
> that I believe produces code that correctly computes
any of the RC5 
> tests. It does NO pipeline retiming which is what I'm
working on fixing 
> right now. This was adapted from my C program which I
will post. This 
> program was not adapted from John Bass's work, but
probably wouldn't be 
> possible without his assistance over the past year or
two. I'm posting 
> this mainly in case anyone else has interest in it in
the future.
> --
> Martin Klingensmith
>
> ---
> start builder_vlg.c
> ///
> // Verilog Pipeline Builder code
> // No pipeline retiming (work in progress)
> // Martin Klingensmith: martin at nnytech.net
>
> // References: Schneier, Bruce, Applied Cryptography
> // John Bass
>
> #include <stdio.h>
> #include <math.h>
>
> int main()
> {
>         int w=32;
>         int r=12;
>         int b=5;
>         int c=2; // b/4 if remainder add 1
>
>         int x=0, i=0, j=0, y=0, oldi=0, oldj=0;
>         int An=0, Bn=0, Ln=0, Sn=0;
>         long int S[6*r+6],P,Q;
>         int ln[4];
>         char n=20,oldn=20,oldoldn=20,tempn=20;
>         ln[0] = 0;
>         ln[1] = 0;
>         ln[2] = 0;
>         for(x=0;x<2*r+2;x++) S[x] = 0;
>
>         printf("nmodule
pipe(A,B,key0,key1,key2,clock,clr);");
>         printf("ntoutput [31:0]A,B;");
>         printf("ntinput
[31:0]key0,key1,key2;");
>         printf("ntinput clock,clr;");
>
>         printf("n// RC5 - %d/%d/%d (%d bit word
size / %d rounds / %d 
> byte key)nn",w,r,b,w,r,b);
>
>         printf("treg[32:0]n");
>         printf("A, B, L0, L1, L2, S0,
S1,f,g");
>
>         // determine how many times to do the main
loop:
>         y = 3*c;
>         if((6*r+6)>y) y = (6*r+6);
>
>
>         for(x=0;x<=c;x++) {
>                 for(An=0;An<(y/2);An++) {
>                        
printf(",L%d_%d",x,An); // initialize Ln
variables
>                 }
>         }
>         for(x=0;x<=2*r+1;x++){
>                 
> printf(",S%da,S%db,S%dc",x,x,x);             
                  // 
> output Sa/b/c vars
>                 if(!(x%5)) printf("n");
>         }
>         for(x=0;x<=r;x++){                          
           // 
> output A/B vars
>                 printf(", A%d, B%d",x,x);
>         }
>
>     printf(";nnfunction [31:0]ROTL;ninput
[31:0]x;ninput 
> [31:0]n;nbegin");
>         printf("ntROTL = (((x) <<
(n[4:0])) | ((x) >> 
> (32-(n[4:0]))));ntendnendfunction");
>         printf("nfunction [31:0]ROTL3;ntinput
[31:0]x;ntROTL3 = 
> (((x) << 3) | ((x) >>
(32-3)));nendfunction");
>
>
>         printf("nnalways (posedge 
> clock)nbeginntif(clr==1)ntbeginnnA=0;
B=0");
>         for(x=0;x<=c;x++) {
>                 for(An=0;An<(y/2);An++) {
>                        
printf(";L%d_%d=0",x,An);       // initialize Ln 
> variables
>                 }
>         }
>         for(x=0;x<=2*r+1;x++){
>                
printf(";S%da=0;S%db=0;S%dc=0",x,x,x);
>                 if(!(x%5)) printf("n");
>         }
>         for(x=0;x<=r;x++){                          
                   
> // initialize A/B vars
>                 printf("; A%d=0;
B%d=0",x,x);
>         }
>         printf(";nnend elsenbeginn");
>         printf("nn// Key Setup +
Encryption");
>         printf("nL2_0 = 32'h85;");
>         printf("nL1_0 = 32'hfee1d4c0;");
>         printf("nL0_0 = 32'h53030cc9;");
>         printf("nA = 32'h3f3ca653;");
>         printf("nB = 32'h2ff17af3;");
>
>         P = 0xb7e15163;
>         Q = 0x9e3779b9;
>         S[0] = P;
>         for(x=1;x<2*r+2;x++) S[x] = ( S[x-1] + Q )
& 0xFFFFFFFF;
>
>
>         An=0;
>         Bn=0;
>
>
>         for(x=0;x<y;x++){
>                 if(x<(2*r+2)) {
>                         if(n != 'a') oldn=n;
>                         n = 'a';
>                 } else {
>                         if(x<(4*r+4)) {
>                                 if(n != 'b') oldn=n;
>                                 n = 'b';
>                         } else {
>                                 if(x<(6*r+6)) {
>                                         if(n != 'c')
oldn=n;
>                                         n = 'c';
>                                 }
>                         }
>                 }
>                 printf("nn// loopn=%d, third=%c,
oldn=%c",x+1,n,oldn);
>
>                 if(x==0){
>                         ln[j]++;
>                         printf("nS%d%c =
ROTL(32'h%X, 
> 3);",i,n,S[x]);                                 
// case 0
>                         printf("nL%d_%d =
ROTL(L%d_%d + S%d%c, 
> S%d%c);",j,ln[j],j,ln[j]-1,i,n,i,n);            //
case 0
>                 } else {
>                         if(x<=(2*r+1)){
>                                 printf("nS%d%c =
ROTL(32'h%X + S%d%c + 
> L%d_%d, 3);",i,n,S[x],oldi,n,oldj,ln[oldj]); //
first third
>                         } else {
>                                 if(oldn!=oldoldn) {
>                                         oldoldn=oldn;
>                                         printf("
*");
>                                         tempn = oldn;
>                                 } else {
>                                         tempn = n;
>                                 }
>                                 printf("nS%d%c =
ROTL(S%d%c + S%d%c + 
> L%d_%d, 3);",i,n,i,oldn,oldi,tempn,oldj,ln[oldj]);
      // last third
>                         }
>                         ln[j]++; // first+last third
>                         printf("nL%d_%d =
ROTL(L%d_%d + S%d%c + L%d_%d, 
>
S%d%c+L%d_%d);",j,ln[j],j,ln[j]-1,i,n,oldj,ln[oldj],i,n
,oldj,ln[oldj]);
>                 }
>                
//printf("nprintf("\n%d.tf=%%xtg=%%x",f
,g);",x+1);
>
>                 if(i==0 && (x)>=(4*r+4))    
   { // if i==0
>                         printf("nA0 = A +
S0%c;",n);
>                 } else {
>                         if(i==1 &&
(x)>=(4*r+4)) { // if i==1
>                                 printf("nB0 = B +
S1%c;",n);
>                         } else {
>                                 if(i%2 &&
(x)>=(4*r+4)) { // if i==odd
>                                         Bn++;
>                                        
printf("nB%d = ROTL(B%d^A%d, 
> A%d) + S%d%c;",Bn,Bn-1,An,An,i,n);
>                                 }
>                                 if((i+1)%2 &&
(x)>=(4*r+4)) { // if i==even
>                                         An++;
>                                        
printf("nA%d = ROTL(A%d^B%d, 
> B%d) + S%d%c;",An,An-1,Bn,Bn,i,n);
>                                 }
>                         }
>                 }
>                 oldi = i;
>                 oldj = j;
>                 i = (i + 1) % (2*(r+1));
>                 j = (j + 1) % c;
>         }
>
>         printf("nnendnendnendmodule");
>
> }
>
>
> _______________________________________________
> Hardware mailing list
> Hardwarelists.distributed.net
> http://lists.distributed.net/mailman/listinfo/hardware

>
>   

_______________________________________________
Hardware mailing list
Hardwarelists.distributed.net
http://lists.distributed.net/mailman/listinfo/hardware


[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )