一共两个部分(1)有限域乘法模块cal_vz()的仿真(2)顶层模块question_2()的仿真,两个模块的代码都在下面的超链接里,这里就不贴了
Verilog的代码:有限域GF(2^128)GHASH校验值运算模块——Verilog实现
(1)有限域乘法模块cal_vz()的仿真:
module cal_vz_sim;
// ghash_din ghash_ivin 异或得到A
reg[127:0] ghash_din = 128'h5C7A9427_3D9A2AB4_0FD795BD_84CC57DC;
reg[127:0] ghash_ivin = 128'h5A042715_29F400F0_6AA3D3A7_B73C321C;
// ghash_key 是 B
reg[127:0] ghash_key = 128'hFA0B7844_C7049998_D4191BCF_6EFA5D00;
reg dvalid_in_sim = 1'b0;
reg[127:0] A_sim = 128'd0;
reg[127:0] B_sim = 128'd0;
initial begin
# 50
dvalid_in_sim = 1'b1;
A_sim = ghash_din ^ ghash_ivin;
// A_sim = 128'h80008000_80008000_80008000_80008000; // 用于直观测试
B_sim = ghash_key;
# 20
dvalid_in_sim = 1'b0;
A_sim = 128'd0;
B_sim = 128'd0;
end
reg clk = 1'b0;
always #10
clk <= ~clk;
wire dvalid_out_sim;
wire[127:0] V_sim;
wire[127:0] Z_sim;
cal_vz uut_cal_vz(
.clk_in(clk),
.rstn_in(1'b1),
.dvalid_in(dvalid_in_sim),
.A_in(A_sim),
.B_in(B_sim),
.dvalid_out(dvalid_out_sim),
.V_out(V_sim),
.Z_out(Z_sim)
);
endmodule
仿真结果如图:
由于在之前的python验证文章中提到的,我设计的模块计算过程是和题目反向的,所以这里输入输出的二进制数都做了一个翻转操作,Binary类也在那篇文章的python代码中:
import galois_128 as gf
ghash_din = gf.Binary("3BEA3321BDA9EBF02D5459BCE4295E3A")
ghash_ivin = gf.Binary