📄 ff_mul.v
字号:
// Finite fields multiplication
// Primitive olynomial: p(x) = x^8 + x^4 + x^3 + x^2 + 1
// Polynomial basis: {1, a^1, a^2, a^3, a^4, a^5, a^6, a^7}
// Weak dual basis: {1+a^2, a^1, 1, a^7, a^6, a^5, a^4, a^3+a^7}
`define M 8
module FF_Mul(A, B, P);
//parameter CONST = 8'h3b;
input [`M-1:0] A, B; // B needs converting to dual basis
output [`M-1:0] P;
reg [`M-1:0] P;
reg [2*`M-2:0] dual_base;
reg [`M-1:0] mul_temp;
always @(A or B)begin: Block1
integer i;
// C-D
dual_base[0] = B[0] ^ B[2];
dual_base[1] = B[1];
dual_base[2] = B[0];
dual_base[3] = B[7];
dual_base[4] = B[6];
dual_base[5] = B[5];
dual_base[6] = B[4];
dual_base[7] = B[3] ^ B[7];
// Extension
for(i=0; i<`M-1; i=i+1) begin
dual_base[`M+i] = dual_base[0+i]^dual_base[2+i]^dual_base[3+i]^dual_base[4+i];
end
// Multiplication
for(i=0; i<`M; i=i+1) begin
mul_temp[i] = (((dual_base[i+0]&A[0]) ^(dual_base[i+1]&A[1]))
^((dual_base[i+2]&A[2]) ^(dual_base[i+3]&A[3])))
^(((dual_base[i+4]&A[4])^(dual_base[i+5]&A[5]))
^((dual_base[i+6]&A[6]) ^(dual_base[i+7]&A[7])));
end
// D-C
P[0] = mul_temp[2];
P[1] = mul_temp[1];
P[2] = mul_temp[0] ^ mul_temp[2];
P[3] = mul_temp[3] ^ mul_temp[7];
P[4] = mul_temp[6];
P[5] = mul_temp[5];
P[6] = mul_temp[4];
P[7] = mul_temp[3];
end
endmodule
`define M 8
module FF_Mul_R(clk, A, B, P);
//parameter CONST = 8'h3b;
input clk;
input [`M-1:0] A, B; // B needs converting to dual basis
output [`M-1:0] P;
reg [`M-1:0] P;
reg [2*`M-2:0] dual_base;
reg [`M-1:0] mul_temp;
always @(posedge clk)begin: Block1
integer i;
// C-D
dual_base[0] = B[0] ^ B[2];
dual_base[1] = B[1];
dual_base[2] = B[0];
dual_base[3] = B[7];
dual_base[4] = B[6];
dual_base[5] = B[5];
dual_base[6] = B[4];
dual_base[7] = B[3] ^ B[7];
// Extension
for(i=0; i<`M-1; i=i+1) begin
dual_base[`M+i] = dual_base[0+i]^dual_base[2+i]^dual_base[3+i]^dual_base[4+i];
end
// Multiplication
for(i=0; i<`M; i=i+1) begin
mul_temp[i] = (((dual_base[i+0]&A[0]) ^(dual_base[i+1]&A[1]))
^((dual_base[i+2]&A[2]) ^(dual_base[i+3]&A[3])))
^(((dual_base[i+4]&A[4])^(dual_base[i+5]&A[5]))
^((dual_base[i+6]&A[6]) ^(dual_base[i+7]&A[7])));
end
// D-C
P[0] = mul_temp[2];
P[1] = mul_temp[1];
P[2] = mul_temp[0] ^ mul_temp[2];
P[3] = mul_temp[3] ^ mul_temp[7];
P[4] = mul_temp[6];
P[5] = mul_temp[5];
P[6] = mul_temp[4];
P[7] = mul_temp[3];
end
endmodule
//--------------------------------------------------------------------
// Finite fields multiplication
// Primitive olynomial: p(x) = x^8 + x^4 + x^3 + x^2 + 1
// Polynomial basis: {1, a^1, a^2, a^3, a^4, a^5, a^6, a^7}
// Weak dual basis: {1+a^2, a^1, 1, a^7, a^6, a^5, a^4, a^3+a^7}
//---------------------------------------------------------------------
`define M 8
module ff_const_mul(din, dout);
parameter CONST = 15'h0CE7;
input [`M-1:0] din;
output [`M-1:0] dout;
wire [2*`M-2:0] dual_base;
assign dual_base = CONST;
reg [`M-1:0] dout, mul_temp;
always @(din or dual_base)begin: Block1
integer i;
// Multiplication
for(i=0; i<`M; i=i+1) begin
mul_temp[i] = (((dual_base[i+0]&din[0]) ^(dual_base[i+1]&din[1]))
^((dual_base[i+2]&din[2]) ^(dual_base[i+3]&din[3])))
^(((dual_base[i+4]&din[4])^(dual_base[i+5]&din[5]))
^((dual_base[i+6]&din[6]) ^(dual_base[i+7]&din[7])));
end
// D-C
dout[0] = mul_temp[2];
dout[1] = mul_temp[1];
dout[2] = mul_temp[0] ^ mul_temp[2];
dout[3] = mul_temp[3] ^ mul_temp[7];
dout[4] = mul_temp[6];
dout[5] = mul_temp[5];
dout[6] = mul_temp[4];
dout[7] = mul_temp[3];
end
endmodule
/*
//-----------------------------------------------------------------
// GF(2^3) Multiplication: C(D) = A(D) * B(D) mod(D^3 + D + 1)
// => C0 = A0*B0 + A1*B2 + A2*B1
// C1 = A0*B1 + A1*B0 + A1*B2 + A2*B1 + A2*B2
// C2 = A0*B2 + A1*B1 + A2*B0 + A2*B2
//-----------------------------------------------------------------
module FF_Mul(A, B, P); // Non-registerd output of finite field multiplication
input [2:0] A, B;
output [2:0] P;
reg [2:0] P;
always @(A or B)begin
P[0] = (A[0]&B[0])^(A[1]&B[2])^(A[2]&B[1]);
P[1] = (A[0]&B[1])^(A[1]&B[0])^(A[1]&B[2])^(A[2]&B[1])^(A[2]&B[2]);
P[2] = (A[0]&B[2])^(A[1]&B[1])^(A[2]&B[0])^(A[2]&B[2]);
end
endmodule
module FF_Mul_R(clk, A, B, P); // Registerd output of finite field multiplication
input clk;
input [2:0] A, B;
output [2:0] P;
reg [2:0] P;
always @(posedge clk)begin
P[0] = (A[0]&B[0])^(A[1]&B[2])^(A[2]&B[1]);
P[1] = (A[0]&B[1])^(A[1]&B[0])^(A[1]&B[2])^(A[2]&B[1])^(A[2]&B[2]);
P[2] = (A[0]&B[2])^(A[1]&B[1])^(A[2]&B[0])^(A[2]&B[2]);
end
endmodule
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -