Code of Top - Qfunc Module:: Part 1 - Making The Function LN (N) /T
Code of Top - Qfunc Module:: Part 1 - Making The Function LN (N) /T
wire [31:0]FN;
wire FN_ready,FN_valid;
fixed_to_float N_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(N_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(N_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(N), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FN_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FN_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FN) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]FT;
wire FT_ready,FT_valid;
fixed_to_float T_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(T_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(T_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(T), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FT_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FT_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FT) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]FX;
wire FX_ready,FX_valid;
fixed_to_float X_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(X_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(X_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(X), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FX_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FX_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FX) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]ln_N;
wire ln_N_ready,ln_N_valid;
logarithm lnN (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(FN_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(FN_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(FN), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(ln_N_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(ln_N_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(ln_N) // output wire [31 : 0]
m_axis_result_tdata
);
divide lnN_div_T (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(ln_N_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(ln_N_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(ln_N), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(FT_valid), // input wire s_axis_b_tvalid
.s_axis_b_tready(FT_ready), // output wire s_axis_b_tready
.s_axis_b_tdata(FT), // input wire [31 : 0] s_axis_b_tdata
.m_axis_result_tvalid(Q_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(Q_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(Q) // output wire [31 : 0] m_axis_result_tdata
);
endmodule
• Code of Q_tb testbench :
module Q_tb(
);
reg aclk,aresetn,N_valid,X_valid,T_valid,Q_ready;
reg [31:0] N,X,T;
wire [31:0] Q;
wire N_ready,X_ready,T_ready,Q_valid;
top_QFunc
tb1(.aclk(aclk),.aresetn(aresetn),.N(N),.X(X),.T(T),.Q(Q),.N_valid(N_valid),
.X_valid(X_valid),.T_valid(T_valid),.Q_valid(Q_valid),.N_ready(N_ready),.
X_ready(X_ready),.T_ready(T_ready),.Q_ready(Q_ready));
initial
begin
aclk=0;
aresetn=0;
N=0;
N_valid=0;
X=0;
X_valid=0;
T=0;
T_valid=0;
Q_ready=0;
end
initial
begin
#100 aresetn=1;
#10 N=100;
#5 N_valid=1;
while(N_ready==0)
#5 N_valid=1;
#10 N_valid=0;
#50 N = 200;
#5 N_valid=1;
while(N_ready==0)
#5 N_valid=1;
#10 N_valid=0;
end
initial
begin
#110 T=2;
#5 T_valid=1;
while(T_ready==0)
#5 T_valid=1;
#10 T_valid=0;
#50 T=4;
#5 T_valid=1;
while(T_ready==0)
#5 T_valid=1;
#10 T_valid=0;
end
initial
begin
#110 X=2;
#5 X_valid=1;
while(X_ready==0)
#5 X_valid=1;
#10 X_valid=0;
#5 Q_ready=1'b1;
wait(Q_valid==1'b1)
#5 Q_ready=1'b1;
#5 Q_ready=1'b0;
#50 X=4;
#5 X_valid=1;
while(X_ready==0)
#5 X_valid=1;
#10 X_valid=0;
#5 Q_ready=1'b1;
wait(Q_valid==1'b1)
#5 Q_ready=1'b1;
#5 Q_ready=1'b0;
end
endmodule
• Simulation of Part 1
wire [31:0]FN;
wire FN_ready,FN_valid;
fixed_to_float N_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(N_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(N_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(N), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FN_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FN_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FN) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]FT;
wire FT_ready,FT_valid;
fixed_to_float T_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(T_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(T_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(T), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FT_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FT_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FT) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]FX;
wire FX_ready,FX_valid;
fixed_to_float X_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(X_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(X_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(X), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FX_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FX_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FX) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]ln_N;
wire ln_N_ready,ln_N_valid;
logarithm lnN (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(FN_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(FN_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(FN), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(ln_N_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(ln_N_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(ln_N) // output wire [31 : 0]
m_axis_result_tdata
);
wire [31:0]ln_N_div_T;
wire ln_N_div_T_ready,ln_N_div_T_valid;
divide lnN_div_T (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(ln_N_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(ln_N_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(ln_N), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(FT_valid), // input wire s_axis_b_tvalid
.s_axis_b_tready(FT_ready), // output wire s_axis_b_tready
.s_axis_b_tdata(FT), // input wire [31 : 0] s_axis_b_tdata
.m_axis_result_tvalid(ln_N_div_T_valid), // output wire
m_axis_result_tvalid
.m_axis_result_tready(ln_N_div_T_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(ln_N_div_T) // output wire [31 : 0]
m_axis_result_tdata
);
square_root your_instance_name (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(ln_N_div_T_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(ln_N_div_T_ready), // output wire
s_axis_a_tready
.s_axis_a_tdata(ln_N_div_T), // input wire [31 : 0]
s_axis_a_tdata
.m_axis_result_tvalid(Q_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(Q_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(Q) // output wire [31 : 0] m_axis_result_tdata
);
endmodule
• Code of Q_tb testbench :
module Q_tb(
);
reg aclk,aresetn,N_valid,X_valid,T_valid,Q_ready;
wire [31:0] Q;
wire N_ready,X_ready,T_ready,Q_valid;
top_QFunc
tb1(.aclk(aclk),.aresetn(aresetn),.N(N),.X(X),.T(T),.Q(Q),.N_valid(N_valid),.X_
valid(X_valid),.T_valid(T_valid),.Q_valid(Q_valid),.N_ready(N_ready),.X_rea
dy(X_ready),.T_ready(T_ready),.Q_ready(Q_ready));
initial
begin
aclk=0;
aresetn=0;
N=0;
N_valid=0;
X=0;
X_valid=0;
T=0;
T_valid=0;
Q_ready=0;
end
initial
begin
#100 aresetn=1;
#10 N=100;
#5 N_valid=1;
while(N_ready==0)
#5 N_valid=1;
#10 N_valid=0;
#50 N = 200;
#5 N_valid=1;
while(N_ready==0)
#5 N_valid=1;
#10 N_valid=0;
end
initial
begin
#110 T=2;
#5 T_valid=1;
while(T_ready==0)
#5 T_valid=1;
#10 T_valid=0;
#50 T=4;
#5 T_valid=1;
while(T_ready==0)
#5 T_valid=1;
#10 T_valid=0;
end
initial
begin
#110 X=2;
#5 X_valid=1;
while(X_ready==0)
#5 X_valid=1;
#10 X_valid=0;
#5 Q_ready=1'b1;
wait(Q_valid==1'b1)
#5 Q_ready=1'b1;
#5 Q_ready=1'b0;
#50 X=4;
#5 X_valid=1;
while(X_ready==0)
#5 X_valid=1;
#10 X_valid=0;
#5 Q_ready=1'b1;
wait(Q_valid==1'b1)
#5 Q_ready=1'b1;
#5 Q_ready=1'b0;
end
Endmodule
wire [31:0]FN;
wire FN_ready,FN_valid;
fixed_to_float N_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(N_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(N_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(N), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FN_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FN_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FN) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]FT;
wire FT_ready,FT_valid;
fixed_to_float T_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(T_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(T_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(T), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FT_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FT_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FT) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]FX;
wire FX_ready,FX_valid;
fixed_to_float X_float (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(X_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(X_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(X), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(FX_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(FX_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(FX) // output wire [31 : 0] m_axis_result_tdata
);
wire [31:0]ln_N;
wire ln_N_ready,ln_N_valid;
logarithm lnN (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(FN_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(FN_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(FN), // input wire [31 : 0] s_axis_a_tdata
.m_axis_result_tvalid(ln_N_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(ln_N_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(ln_N) // output wire [31 : 0]
m_axis_result_tdata
);
wire [31:0]ln_N_div_T;
wire ln_N_div_T_ready,ln_N_div_T_valid;
divide lnN_div_T (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(ln_N_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(ln_N_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(ln_N), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(FT_valid), // input wire s_axis_b_tvalid
.s_axis_b_tready(FT_ready), // output wire s_axis_b_tready
.s_axis_b_tdata(FT), // input wire [31 : 0] s_axis_b_tdata
.m_axis_result_tvalid(ln_N_div_T_valid), // output wire
m_axis_result_tvalid
.m_axis_result_tready(ln_N_div_T_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(ln_N_div_T) // output wire [31 : 0]
m_axis_result_tdata
);
wire [31:0]root;
wire root_ready,root_valid;
square_root sqrt (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(ln_N_div_T_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(ln_N_div_T_ready), // output wire
s_axis_a_tready
.s_axis_a_tdata(ln_N_div_T), // input wire [31 : 0]
s_axis_a_tdata
.m_axis_result_tvalid(root_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(root_ready), // input wire m_axis_result_tready
.m_axis_result_tdata(root) // output wire [31 : 0] m_axis_result_tdata
);
divide X_div_t(
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(FX_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(FX_ready), // output wire s_axis_a_tready
.s_axis_a_tdata(FX), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(FT_valid), // input wire s_axis_b_tvalid
// .s_axis_b_tready(FT_ready), // output wire s_axis_b_tready
.s_axis_b_tdata(FT), // input wire [31 : 0] s_axis_b_tdata
.m_axis_result_tvalid(X_div_T_valid), // output wire
m_axis_result_tvalid
.m_axis_result_tready(X_div_T_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(X_div_T) // output wire [31 : 0]
m_axis_result_tdata
);
floating_point_0 add (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.s_axis_a_tvalid(X_div_T_valid), // input wire s_axis_a_tvalid
.s_axis_a_tready(X_div_T_ready), // output wire
s_axis_a_tready
.s_axis_a_tdata(X_div_T), // input wire [31 : 0]
s_axis_a_tdata
.s_axis_b_tvalid(root_valid), // input wire s_axis_b_tvalid
.s_axis_b_tready(root_ready), // output wire s_axis_b_tready
.s_axis_b_tdata(root), // input wire [31 : 0] s_axis_b_tdata
.s_axis_operation_tvalid(1'b1), // input wire s_axis_operation_tvalid
// .s_axis_operation_tready(s_axis_operation_tready), // output wire
s_axis_operation_tready
.s_axis_operation_tdata(8'b00000000), // input wire [7 : 0]
s_axis_operation_tdata
.m_axis_result_tvalid(Q_valid), // output wire m_axis_result_tvalid
.m_axis_result_tready(Q_ready), // input wire
m_axis_result_tready
.m_axis_result_tdata(Q) // output wire [31 : 0]
m_axis_result_tdata
);
endmodule
• Code of Q_tb testbench :
module Q_tb(
);
reg aclk,aresetn,N_valid,X_valid,T_valid,Q_ready;
reg [31:0] N,X,T;
wire [31:0] Q;
wire N_ready,X_ready,T_ready,Q_valid;
top_QFunc
tb1(.aclk(aclk),.aresetn(aresetn),.N(N),.X(X),.T(T),.Q(Q),.N_valid(N_valid),
.X_valid(X_valid),.T_valid(T_valid),.Q_valid(Q_valid),.N_ready(N_ready),.
X_ready(X_ready),.T_ready(T_ready),.Q_ready(Q_ready));
initial
begin
aclk=0;
aresetn=0;
N=0;
N_valid=0;
X=0;
X_valid=0;
T=0;
T_valid=0;
Q_ready=0;
end
initial
begin
#100 aresetn=1;
#10 N=100;
#5 N_valid=1;
while(N_ready==0)
#5 N_valid=1;
#10 N_valid=0;
#50 N = 200;
#5 N_valid=1;
while(N_ready==0)
#5 N_valid=1;
#10 N_valid=0;
end
initial
begin
#110 T=2;
#5 T_valid=1;
while(T_ready==0)
#5 T_valid=1;
#10 T_valid=0;
#50 T=4;
#5 T_valid=1;
while(T_ready==0)
#5 T_valid=1;
#10 T_valid=0;
end
initial
begin
#110 X=2;
#5 X_valid=1;
while(X_ready==0)
#5 X_valid=1;
#10 X_valid=0;
#5 Q_ready=1'b1;
wait(Q_valid==1'b1)
#5 Q_ready=1'b1;
#5 Q_ready=1'b0;
#50 X=4;
#5 X_valid=1;
while(X_ready==0)
#5 X_valid=1;
#10 X_valid=0;
#5 Q_ready=1'b1;
wait(Q_valid==1'b1)
#5 Q_ready=1'b1;
#5 Q_ready=1'b0;
end
endmodule
• Simulation run :