[Hardware] RC5 verilog code generator

Martin Klingensmith martin at nnytech.net
Tue Mar 13 14:44:37 EDT 2007


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("\n\toutput [31:0]A,B;");
        printf("\n\tinput [31:0]key0,key1,key2;");
        printf("\n\tinput clock,clr;");

        printf("\n// RC5 - %d/%d/%d (%d bit word size / %d rounds / %d 
byte key)\n\n",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(";\n\nfunction [31:0]ROTL;\ninput [31:0]x;\ninput 
[31:0]n;\nbegin");
        printf("\n\tROTL = (((x) << (n[4:0])) | ((x) >> 
(32-(n[4:0]))));\n\tend\nendfunction");
        printf("\nfunction [31:0]ROTL3;\n\tinput [31:0]x;\n\tROTL3 = 
(((x) << 3) | ((x) >> (32-3)));\nendfunction");


        printf("\n\nalways @(posedge 
clock)\nbegin\n\tif(clr==1)\n\tbegin\n\nA=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(";\n\nend else\nbegin\n");
        printf("\n\n// 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("\n\n// 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=%%x\tg=%%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("\n\nend\nend\nendmodule");

}




More information about the Hardware mailing list