0% found this document useful (0 votes)
55 views22 pages

Code of Top - Qfunc Module:: Part 1 - Making The Function LN (N) /T

This document describes code for calculating the function ln(N)/T and taking its square root. It contains: 1) Code for a top_QFunc module that takes inputs N, T, X, calculates ln(N)/T, and outputs the result Q. 2) Code for a Q_tb testbench module to test the top_QFunc module. 3) The top_QFunc module contains submodules to convert inputs to floating point, calculate ln(N), divide ln(N) by T, and take the square root. 4) The document provides simulation results for part 1 of calculating ln(N)/T and part 2 adds a square root operation.

Uploaded by

Ankit Garg
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
55 views22 pages

Code of Top - Qfunc Module:: Part 1 - Making The Function LN (N) /T

This document describes code for calculating the function ln(N)/T and taking its square root. It contains: 1) Code for a top_QFunc module that takes inputs N, T, X, calculates ln(N)/T, and outputs the result Q. 2) Code for a Q_tb testbench module to test the top_QFunc module. 3) The top_QFunc module contains submodules to convert inputs to floating point, calculate ln(N), divide ln(N) by T, and take the square root. 4) The document provides simulation results for part 1 of calculating ln(N)/T and part 2 adds a square root operation.

Uploaded by

Ankit Garg
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 22

LAB-7

Part 1 – Making the Function ln(N)/T

• Code of top_QFunc module :


module top_QFunc(
input aclk,
input aresetn,
input [31:0] X,
input X_valid,
output X_ready,
input [31:0] N,
input N_valid,
output N_ready,
input [31:0] T,
input T_valid,
output T_ready,
output [31:0] Q,
output Q_valid,
input Q_ready
);

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

always #5 aclk = ~aclk;

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

Part 2 – Square root calculation and verification :


• Code of top_QFunc module :
module top_QFunc(
input aclk,
input aresetn,
input [31:0] X,
input X_valid,
output X_ready,
input [31:0] N,
input N_valid,
output N_ready,
input [31:0] T,
input T_valid,
output T_ready,
output [31:0] Q,
output Q_valid,
input Q_ready
);

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;

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_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

always #5 aclk = ~aclk;

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 of Part 2:


Part 3 – Making Full function Q and verifying it:
• Code of top_QFunc module :
module top_QFunc(
input aclk,
input aresetn,
input [31:0] X,
input X_valid,
output X_ready,
input [31:0] N,
input N_valid,
output N_ready,
input [31:0] T,
input T_valid,
output T_ready,
output [31:0] Q,
output Q_valid,
input Q_ready
);

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
);

wire [31:0] X_div_T;


wire X_div_T_ready,X_div_T_valid;

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

always #5 aclk = ~aclk;

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 :

You might also like