Line 68... |
Line 68... |
module f32m_mult(clk, reset, a, b, c, done);
|
module f32m_mult(clk, reset, a, b, c, done);
|
input reset, clk;
|
input reset, clk;
|
input [`W2:0] a, b;
|
input [`W2:0] a, b;
|
output reg [`W2:0] c;
|
output reg [`W2:0] c;
|
output reg done;
|
output reg done;
|
wire [`WIDTH:0] a0,a1,b0,b1,
|
wire [`WIDTH:0] a0,a1,b0,b1,c0,c1,
|
v1,v2,v6,
|
v1,v2,v3,v4,v5,v6;
|
c0,c1,
|
|
in1,in2,o;
|
|
reg [`WIDTH:0] v3,v4,v5;
|
|
reg [3:0] K;
|
|
wire load1, load2, load3, set1, set2, set3;
|
|
reg mult_reset;
|
reg mult_reset;
|
wire mult_done;
|
wire mult_done, p;
|
reg delay1, delay2;
|
|
wire delay3;
|
|
wire rst;
|
|
|
|
assign rst = delay2;
|
|
assign {a1,a0} = a;
|
assign {a1,a0} = a;
|
assign {b1,b0} = b;
|
assign {b1,b0} = b;
|
assign {load1,load2,load3} = K[3:1];
|
|
assign {set1,set2,set3} = K[3:1];
|
|
|
|
f3m_add
|
f3m_add
|
ins1 (a0, a1, v1), // v1 == a0 + a1
|
ins1 (a0, a1, v1), // v1 == a0 + a1
|
ins2 (b0, b1, v2), // v2 == b0 + b1
|
ins2 (b0, b1, v2), // v2 == b0 + b1
|
ins3 (v3, v4, v6); // v6 == v3 + v4 = a0*b0 + a1*b1
|
ins3 (v3, v4, v6); // v6 == v3 + v4 = a0*b0 + a1*b1
|
f3m_sub
|
f3m_sub
|
ins7 (v5, v6, c1), // c1 == v5 - v6 = (a0+a1) * (b0+b1) - (a0*b0 + a1*b1)
|
ins7 (v5, v6, c1), // c1 == v5 - v6 = (a0+a1) * (b0+b1) - (a0*b0 + a1*b1)
|
ins8 (v3, v4, c0); // c0 == a0*b0 - a1*b1
|
ins8 (v3, v4, c0); // c0 == a0*b0 - a1*b1
|
// only one $f3m_mult$ module doing three multiplication
|
|
// v3 == a0 * b0
|
// v3 == a0 * b0
|
// v4 == a1 * b1
|
// v4 == a1 * b1
|
// v5 == v1 * v2 = (a0+a1) * (b0+b1)
|
// v5 == v1 * v2 = (a0+a1) * (b0+b1)
|
f3m_mux3
|
f3m_mult3
|
ins9 (a0, load1, a1, load2, v1, load3, in1),
|
ins9 (clk, mult_reset, a0, b0, v3, a1, b1, v4, v1, v2, v5, mult_done);
|
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)
|
|
func6
|
func6
|
ins12 (clk, mult_done, delay3);
|
ins10 (clk, mult_done, p);
|
|
|
always @ (posedge clk)
|
always @ (posedge clk)
|
begin
|
mult_reset <= reset;
|
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
|
|
|
|
always @ (posedge clk)
|
always @ (posedge clk)
|
if (reset)
|
if (reset)
|
done <= 0;
|
done <= 0;
|
else if (K[0])
|
else if (p)
|
begin
|
begin
|
done <= 1; c <= {c1, c0};
|
done <= 1; c <= {c1, c0};
|
end
|
end
|
|
|
always @ (posedge clk)
|
|
begin
|
|
delay2 <= delay1; delay1 <= reset;
|
|
end
|
|
endmodule
|
endmodule
|
|
|
// C == A^3 in GF(3^{2m})
|
// C == A^3 in GF(3^{2m})
|
module f32m_cubic(clk, a, c);
|
module f32m_cubic(clk, a, c);
|
input clk;
|
input clk;
|