|
List Info
Thread: RC5 verilog code generator
|
|
| RC5 verilog code generator |
  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
Hardware lists.distributed.net
http://lists.distributed.net/mailman/listinfo/hardware
|
|
| Re: RC5 verilog code generator |
  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
> Hardware lists.distributed.net
> http://lists.distributed.net/mailman/listinfo/hardware
>
>
_______________________________________________
Hardware mailing list
Hardware lists.distributed.net
http://lists.distributed.net/mailman/listinfo/hardware
|
|
[1-2]
|
|