[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