OpenCores
URL https://opencores.org/ocsvn/pairing/pairing/trunk

Subversion Repositories pairing

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 6 to Rev 7
    Reverse comparison

Rev 6 → Rev 7

/pairing/trunk/testbench/test_f36m_cubic.v
1,5 → 1,5
`timescale 1ns / 1ns
`include "../verilog/inc.v"
`include "../rtl/inc.v"
 
module test_f36m_cubic;
 
/pairing/trunk/testbench/test_f3m_inv.v
9,6 → 9,7
 
// Outputs
wire [193:0] C;
wire done;
 
// Instantiate the Unit Under Test (UUT)
f3m_inv uut (
15,7 → 16,8
.A(A),
.clk(clk),
.reset(reset),
.C(C)
.C(C),
.done(done)
);
 
always #`CLOCK_PERIOD clk = ~clk;
33,9 → 35,8
A = 32'b10_01_01_10_01_00; // A = "x";
@(negedge clk); reset = 1;
@(negedge clk); reset = 0;
$display("Go!");
#(200*2*`CLOCK_PERIOD);
if (C != 192'h65450169824811252a919a8a02964184221a1562655252a9) begin $display("Error!"); $finish; end
if (C != 192'h65450169824811252a919a8a02964184221a1562655252a9) $display("Error!");
$display("Good!"); $finish;
end
/pairing/trunk/testbench/test_f33m_inv.v
0,0 → 1,45
`timescale 1ns / 1ps
`include "../rtl/inc.v"
 
module test_f33m_inv;
 
// Inputs
reg clk;
reg reset;
reg [`W3:0] a, w;
 
// Outputs
wire done;
wire [`W3:0] c;
 
// Instantiate the Unit Under Test (UUT)
f33m_inv uut (
.clk(clk),
.reset(reset),
.a(a),
.c(c),
.done(done)
);
 
initial begin
// Initialize Inputs
clk = 0;
reset = 0;
a = 0;
 
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
a = {194'h210226252a484596150544098559162512219149194a91008,194'h12622041181115a64a84159a001a15a0a0609a642962068a5,194'h25429526606a8552a8622169050aa29921641120a05866014};
w = {194'h9a08022aa299850a48900010428a4aa66211109901a00a89,194'h95869a60454411009148081200aaaa121864220208592809,194'h564a6642212a164990212611055046496851a96918954695};
@ (negedge clk); reset = 1;
@ (posedge clk); reset = 0;
@ (posedge done); @(negedge clk);
if (c !== w) $display("E");
$finish;
end
always #5 clk = ~clk;
endmodule
 
/pairing/trunk/testbench/test_duursma_lee_algo.v
1,5 → 1,5
`timescale 1ns / 1ns
`include "../verilog/inc.v"
`include "../rtl/inc.v"
 
module test_duursma_lee_algo;
 
/pairing/trunk/testbench/test_f32m_mult.v
37,7 → 37,7
@ (negedge clk) reset = 1;
@ (negedge clk) reset = 0;
@ (posedge done);
if (c!=={194'h9594010a580186621a840406105460622891085122060a45,194'h59a1595621295a89260802a045194a96050a6202164000a9}) $display("E");
if (c!=={194'h9594010a580186621a840406105460622891085122060a45,194'h59a1595621295a89260802a045194a96050a6202164000a9}) $display("E1");
#100;
a={194'h8864990666a959a88500249a244495aaa26a2a0194082aa1,194'h2a9481526946468065456052045865262520a4a9520a5a665};
45,7 → 45,7
@ (negedge clk) reset = 1;
@ (negedge clk) reset = 0;
@ (posedge done);
if (c!=={194'h215608121442a91950aaa59514a9486258684486825840894,194'h284845aa0664918068988811691a290658228028985249a48}) $display("E");
if (c!=={194'h215608121442a91950aaa59514a9486258684486825840894,194'h284845aa0664918068988811691a290658228028985249a48}) $display("E2");
#100;
$finish;
/pairing/trunk/testbench/test_f33m_mult.v
1,5 → 1,5
`timescale 1ns / 1ns
`include "../verilog/inc.v"
`include "../rtl/inc.v"
 
module test_f33m_mult;
 
/pairing/trunk/testbench/test_f3m_mult3.v
0,0 → 1,67
`timescale 1ns / 1ps
`include "../rtl/inc.v"
 
module test_f3m_mult3;
 
// Inputs
reg clk;
reg reset;
reg [`WIDTH:0] a0,b0,a1,b1,a2,b2,w0,w1,w2;
 
// Outputs
wire [`WIDTH:0] c0,c1,c2;
wire done;
 
// Instantiate the Unit Under Test (UUT)
f3m_mult3 uut (
.clk(clk),
.reset(reset),
.a0(a0),
.b0(b0),
.c0(c0),
.a1(a1),
.b1(b1),
.c1(c1),
.a2(a2),
.b2(b2),
.c2(c2),
.done(done)
);
 
initial begin
// Initialize Inputs
clk = 0;
reset = 0;
a0 = 0;
b0 = 0;
a1 = 0;
b1 = 0;
a2 = 0;
b2 = 0;
 
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
a0 = 194'h2581921511a6952a4244918a069446a520480660152916412;
a1 = 194'haa59080a98122082111a110a400642169102154006590a28;
a2 = 194'h90026a06416441992252a2820a2860269a094a0a06428285;
b0 = 194'h158a5419212805158a941010a495a80966995599a660686a5;
b1 = 194'h115a25602090915a9086a1165169041652888086051510024;
b2 = 194'h191a5669201405a8589951644158119264522a6496809952;
w0 = 194'h145a548a114016289482246816a449911942a088540160102;
w1 = 194'h220652040980466020556941115a5085a5904a60118605858;
w2 = 194'h280a8885992001a950615026585a5592096891a9954506155;
@ (negedge clk); reset = 1;
@ (negedge clk); reset = 0;
@ (posedge done);
#10;
if (c0 !== w0) $display("E");
if (c1 !== w1) $display("E");
if (c2 !== w2) $display("E");
$finish;
end
 
always #5 clk = ~clk;
endmodule
 
/pairing/trunk/rtl/f3m.v
154,6 → 154,60
end
endmodule
 
// c0 == a0*b0; c1 == a1*b1; c2 == a2*b2; all in GF(3^M)
module f3m_mult3(clk, reset,
a0, b0, c0,
a1, b1, c1,
a2, b2, c2,
done);
input clk, reset;
input [`WIDTH:0] a0, b0, a1, b1, a2, b2;
output reg [`WIDTH:0] c0, c1, c2;
output reg done;
reg [3:0] K;
reg mult_reset, delay1, delay2;
wire e1, e2, e3, mult_done, delay3, rst;
wire [`WIDTH:0] in1, in2, o;
assign rst = delay2;
assign {e1,e2,e3} = K[3:1];
 
f3m_mux3
ins9 (a0, e1, a1, e2, a2, e3, in1),
ins10 (b0, e1, b1, e2, b2, e3, in2);
f3m_mult
ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2 in GF(3^m)
func6
ins12 (clk, mult_done, delay3);
 
always @ (posedge clk)
begin
if (e1) c0 <= o;
if (e2) c1 <= o;
if (e3) c2 <= o;
end
always @ (posedge clk)
if (reset) K <= 4'b1000;
else if (delay3) K <= {1'b0,K[3:1]};
always @ (posedge clk)
begin
if (rst) mult_reset <= 1;
else if (mult_done) mult_reset <= 1;
else mult_reset <= 0;
end
 
always @ (posedge clk)
if (reset) done <= 0;
else if (K[0]) done <= 1;
always @ (posedge clk)
begin
delay2 <= delay1; delay1 <= reset;
end
endmodule
 
/* out == in^3 mod p(x) */
/* p(x) == x^97 + x^12 + 2 */
module f3m_cubic(input [193:0] in, output [193:0] out);
431,11 → 485,12
endmodule
 
// inversion in GF(3^m). C = A^(-1)
module f3m_inv(clk, reset, A, C);
module f3m_inv(clk, reset, A, C, done);
input [`WIDTH:0] A;
input clk;
input reset;
output reg [`WIDTH:0] C;
output reg done;
reg [`WIDTH+2:0] S, R, U, V, d, i;
wire [1:0] q;
445,17 → 500,19
V1, V2,
d1, d2,
i1;
wire done;
wire don;
 
assign d1 = {d[`WIDTH+1:0], 1'b1}; // d1 == d+1
assign d2 = {1'b0, d[`WIDTH+2:1]}; // d2 == d-1
assign i1 = {1'b0, i[`WIDTH+2:1]}; // i1 == i-1
assign done = (i[2:1] == 2'b01);
assign don = (i[2:1] == 2'b01);
always @ (posedge clk)
if (done)
always @ (posedge clk)
if (reset)
done <= 0;
else if (don)
begin
C <= U2[`WIDTH:0];
done <= 1; C <= U2[`WIDTH:0];
end
 
f3_mult
475,17 → 532,12
ins8(U, U3); // U3 = (U/x) mod p
always @ (posedge clk)
begin
if (reset)
i <= ~0;
else
begin
i <= i1;
end
end
always @ (posedge clk)
begin
if (reset)
begin
S<=`PX; R<=A; U<=1; V<=0; d<=0;
502,7 → 554,6
begin
S<=S2; V<=V1; U<=U3; d<=d2;
end
end
endmodule
 
// put func1~5 here for breaking circular dependency in "f3m", "fun"
/pairing/trunk/rtl/f32m.v
70,24 → 70,13
input [`W2:0] a, b;
output reg [`W2:0] c;
output reg done;
wire [`WIDTH:0] a0,a1,b0,b1,
v1,v2,v6,
c0,c1,
in1,in2,o;
reg [`WIDTH:0] v3,v4,v5;
reg [3:0] K;
wire load1, load2, load3, set1, set2, set3;
wire [`WIDTH:0] a0,a1,b0,b1,c0,c1,
v1,v2,v3,v4,v5,v6;
reg mult_reset;
wire mult_done;
reg delay1, delay2;
wire delay3;
wire rst;
wire mult_done, p;
assign rst = delay2;
assign {a1,a0} = a;
assign {b1,b0} = b;
assign {load1,load2,load3} = K[3:1];
assign {set1,set2,set3} = K[3:1];
 
f3m_add
ins1 (a0, a1, v1), // v1 == a0 + a1
96,50 → 85,24
f3m_sub
ins7 (v5, v6, c1), // c1 == v5 - v6 = (a0+a1) * (b0+b1) - (a0*b0 + a1*b1)
ins8 (v3, v4, c0); // c0 == a0*b0 - a1*b1
// only one $f3m_mult$ module doing three multiplication
// v3 == a0 * b0
// v4 == a1 * b1
// v5 == v1 * v2 = (a0+a1) * (b0+b1)
f3m_mux3
ins9 (a0, load1, a1, load2, v1, load3, in1),
ins10 (b0, load1, b1, load2, v2, load3, in2);
f3m_mult
ins11 (clk, mult_reset, in1, in2, o, mult_done); // o == in1 * in2 in GF(3^m)
f3m_mult3
ins9 (clk, mult_reset, a0, b0, v3, a1, b1, v4, v1, v2, v5, mult_done);
func6
ins12 (clk, mult_done, delay3);
ins10 (clk, mult_done, p);
always @ (posedge clk)
begin
if (set1) begin v3 <= o; end
if (set2) begin v4 <= o; end
if (set3) begin v5 <= o; end
end
always @ (posedge clk)
begin
if (reset) K <= 4'b1000;
else if (delay3) K <= {1'b0,K[3:1]}; // wait for Mr. Comb. Logic :)
end
always @ (posedge clk)
begin
if (rst) mult_reset <= 1; // wait for Mr. Comb. Logic :)
else if (mult_done) mult_reset <= 1;
else mult_reset <= 0;
end
mult_reset <= reset;
 
always @ (posedge clk)
if (reset)
done <= 0;
else if (K[0])
begin
done <= 1; c <= {c1, c0};
end
always @ (posedge clk)
begin
delay2 <= delay1; delay1 <= reset;
end
if (reset)
done <= 0;
else if (p)
begin
done <= 1; c <= {c1, c0};
end
endmodule
 
// C == A^3 in GF(3^{2m})
/pairing/trunk/rtl/f33m.v
123,5 → 123,78
endmodule
 
// c == a^{-1} in GF(3^{3*M})
 
 
module f33m_inv(clk, reset, a, c, done);
input clk, reset;
input [`W3:0] a;
output reg [`W3:0] c;
output reg done;
wire [`WIDTH:0] a0, a1, a2,
c0, c1, c2,
v0, v1, v2, v3, v4, v5,
v6, v7, v8, v9, v10, v11,
v12, v13, v14, v15, v16,
v17, nv2, nv11, nv14;
wire rst1, rst2, rst3, rst4,
done1, done2, done3, done4,
dummy;
reg [4:0] K;
assign {a2, a1, a0} = a;
assign rst1 = reset;
f3m_mult3
ins1 (clk, rst1,
a0, a0, v0, // v0 == a0^2
a1, a1, v1, // v1 == a1^2
a2, a2, v2, // v2 == a2^2
done1),
ins2 (clk, rst2,
v0, v3, v6, // v6 == (a0-a2)*(a0^2)
v1, v4, v7, // v7 == (a1-a0)*(a1^2)
v2, v5, v8, // v8 == (a0-a1+a2)*(a2^2)
done2),
ins3 (clk, rst1,
a0, a2, v11, // v11 == a0*a2
a0, a1, v12, // v12 == a0*a1
a1, a2, v13, // v13 == a1*a2
dummy),
ins4 (clk, rst4,
v10, v15, c0,
v10, v16, c1,
v10, v17, c2,
done4);
f3m_sub
ins5 (a0, a2, v3), // v3 == a0-a2
ins6 (a1, a0, v4), // v4 == a1-a0
ins7 (a2, v4, v5); // v5 == a2-v4 == a0-a1+a2
f3m_add3
ins8 (v6, v7, v8, v9), // v9 == v6+v7+v8
ins9 (v11, v1, v13, v14), // v14 == v11+v1+v13
ins10 (nv14, v0, v2, v15), // v15 == v0+v2-(v11+v1+v13)
ins11 (v1, nv2, nv11, v17); // v17 == a1^2-a0*a2-a2^2
f3m_neg
ins12 (v2, nv2), // nv2 == -v2
ins13 (v11, nv11), // nv11 == -v11
ins14 (v14, nv14); // nv14 == -v14 == -(v11+v1+v13)
f3m_sub
ins15 (v2, v12, v16); // v16 == a2^2-a0*a1
f3m_inv
ins16 (clk, rst3, v9, v10, done3); // v10 == v9^(-1)
func6
ins17 (clk, done1, rst2),
ins18 (clk, done2, rst3),
ins19 (clk, done3, rst4);
always @ (posedge clk)
if (reset) K <= 5'h10;
else if ((K[4]&rst2)|(K[3]&rst3)|(K[2]&rst4)|(K[1]&done4))
K <= K >> 1;
always @ (posedge clk)
if (reset) done <= 0;
else if (K[0])
begin
done <= 1; c <= {c2,c1,c0};
end
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.