Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 68 additions & 51 deletions components/multiplier/div_logic.sv
Original file line number Diff line number Diff line change
Expand Up @@ -5,55 +5,57 @@ module div_logic(
input [52:0] fb,
input db,
input fdiv,
output logic [56:0] fq
output reg [56:0] fq
);

logic [57:0] fa_in, fb_in;
logic [116:0] mul_out;
wire [56:0] fd_out;
logic [115:0] mul_out;
logic [56:0] fd_out;

logic or_out;
logic [7:0] rom_data;

parameter n = 60;

logic [115:0] t,s1;
logic [115:0] c,s;
// logic [115:0] c,s;
logic [3:0] curr_state, next_state;
logic [3:0] Dcnt;
logic [57:0] x, A, Da, Db;
logic [54:0] E;
logic [115:0] Eb;
logic [8:0] look_up;
logic [7:0] look_up;

logic faadoe, fbbdoe;
logic Eadoe, Aadoe;
logic xadoe, xbdoe;

logic cce, sce;
// logic cce, sce;
logic Dce, Ebce, Ece;
logic xce, Ace;
logic tlu;

rom256X8 rom_inst (.addr(fb[51:44]), .data(rom_data));

multree_div mlt (.a(fa_in), .b(fb_in), .t(t), .s(s1));
// multree_div mlt (.a(fa_in), .b(fb_in), .t(t), .s(s1));

parameter m = 116;
add #(m) ad(
.a(c),
.b(s),
.c_in(1'b0),
.sum(mul_out)
);
multree mlt (.a(fa_in), .b(fb_in), .out(mul_out));

// parameter m = 116;
// add #(m) ad(
// .a(c),
// .b(s),
// .c_in(1'b0),
// .sum(mul_out)
// );

ortree #(n) or_inst (.x(mul_out[59:0]), .or_out(or_out));

select_fd select_f (
.Da(Da),
.Db(Db),
.Eb(Eb[114:0]),
.E(E),
.E({E, 3'b0}),
.db(db),
.fd(fd_out)
);
Expand All @@ -72,15 +74,15 @@ localparam SELECT_FD = 4'd10;
localparam ROUND1 = 4'd11;
localparam ROUND2 = 4'd12;

always @(posedge clk or negedge rst_n) begin
always @(negedge clk or negedge rst_n) begin
if (!rst_n)
curr_state <= UNPACK;
curr_state = UNPACK;
else
curr_state <= next_state;
curr_state = next_state;
end

always_comb begin
xce = 0; tlu = 0; Ace = 0; Dce = 0; Ece = 0; Ebce = 0; cce = 0; sce = 0;
xce = 0; tlu = 0; Ace = 0; Dce = 0; Ece = 0; Ebce = 0; /* cce = 0; sce = 0; */
faadoe = 0; fbbdoe = 0; Eadoe = 0; Aadoe = 0; xadoe = 0; xbdoe = 0;

case (curr_state)
Expand All @@ -101,11 +103,12 @@ always_comb begin

NEWTON2: begin
Ace = 1;
// sce = 1; cce = 1;
next_state = NEWTON3;
end

NEWTON3: begin
cce = 1; sce = 1;
// cce = 1; sce = 1;
Aadoe = 1; xbdoe = 1;
next_state = NEWTON4;
end
Expand All @@ -119,8 +122,8 @@ always_comb begin
end

QUOT1: begin
faadoe = 1; fbbdoe = 1;
cce = 1; sce = 1;
faadoe = 1; xbdoe = 1;
// cce = 1; sce = 1;
next_state = QUOT2;
end

Expand All @@ -131,8 +134,8 @@ always_comb begin
end

QUOT3: begin
fbbdoe = 1;
sce = 1; cce = 1;
fbbdoe = 1; Eadoe = 1;
// sce = 1; cce = 1;
next_state = QUOT4;
end

Expand All @@ -142,6 +145,7 @@ always_comb begin
end

SELECT_FD: begin
$display("Time=%0t | inside SELECT_FD block: fd_out %b", $time, fd_out);
next_state = ROUND1;
end

Expand All @@ -151,55 +155,68 @@ always_comb begin
endcase
end

always @(negedge clk or negedge rst_n) begin
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
Dcnt <= 3'd0;
x <= '0; A <= '0; Da <= '0; Db <= '0; E <= '0; Eb <= '0;
fa_in <= '0; fb_in <= '0; fq <= '0; look_up <= '0;
c <= '0; s <= '0;
Dcnt = 3'd0;
x = '0; A = '0; Da = '0; Db = '0; E = '0; Eb = '0;
fa_in = '0; fb_in = '0; look_up = '0;
// c = '0; s = '0;
end else begin

if (curr_state == LOOKUP) begin
Dcnt <= db ? 3'd3 : 3'd2;
look_up <= rom_data;
Dcnt = db ? 3'd3 : 3'd2;
look_up = rom_data;
end
else if (curr_state == NEWTON1) begin
Dcnt <= Dcnt - 1;
Dcnt = Dcnt - 1;
end

if (sce && cce) begin
c <= t;
s <= s1;
end
// if (sce && cce) begin
// c = t;
// s = s1;
// end

if (faadoe) fa_in <= {fa, 5'b0};
if (fbbdoe) fb_in <= {fb, 5'b0};
if (faadoe) fa_in = {fa, 5'b0};
if (fbbdoe) fb_in = {fb, 5'b0};

if (xadoe) fa_in <= x;
if (xbdoe) fb_in <= x;
if (xadoe) fa_in = x;
if (xbdoe) fb_in = x;

if (Eadoe) fa_in <= E;
if (Aadoe) fa_in <= A;
if (Eadoe) fa_in = {E, 3'b0};
if (Aadoe) fa_in = A;

if (xce) begin
if (tlu)
x <= {2'b01, look_up, 48'b0};
if (tlu) begin
$display("Time=%0t | inside tlu block: look_up %b", $time, look_up);
x = {2'b01, look_up, 48'b0};
end
else
x <= mul_out[116:59];
x = mul_out[115:58];
end

if (Ace) A <= ~mul_out[116:59];
if (Ace) begin
$display("Time=%0t | inside Ace: mul_out %b", $time, mul_out);
A = ~mul_out[115:58];
end

if (Dce) begin
Da <= {fa, 5'b0};
Db <= {fb, 5'b0};
Da = {fa, 5'b0};
Db = {fb, 5'b0};
end

if (Ece) E <= {mul_out[116:91], (mul_out[90:62] & {29{db}}) , 3'b0};
if (Ece) E = {mul_out[115:90], (mul_out[89:61] & {29{db}}) , 3'b0};

if (Ebce) Eb <= mul_out[116:1];
if (Ebce) begin
Eb = mul_out[115:0];
$display("Time=%0t | inside SELECT_FD block: Da %b", $time, Da);
$display("Time=%0t | inside SELECT_FD block: Db %b", $time, Db);
$display("Time=%0t | inside SELECT_FD block: Eb %b", $time, Eb);
$display("Time=%0t | inside SELECT_FD block: E %b", $time, E);
end

if (curr_state == ROUND1) fq = fd_out;

if (curr_state == ROUND2) fq <= fd_out;
if (curr_state == ROUND2) fq = fd_out;
end
end

Expand Down
2 changes: 1 addition & 1 deletion components/multiplier/rom256X8.sv
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module rom256X8(
reg [7:0] rom [255:0];

initial begin
$readmemb("/home/achir/dev/FloatingPointUnit/test_gen/lookup_table.txt", rom);
$readmemb("/home/achir/dev/thesis/FloatingPointUnit/test_gen/lookup_table.txt", rom);
end

assign data = rom[addr];
Expand Down
8 changes: 4 additions & 4 deletions components/multiplier/select_fd.sv
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module select_fd(
input [57:0] Da,
input [57:0] Db,
input [114:0] Eb,
input [54:0] E,
input [57:0] E,
input db,

output [56:0] fd
Expand Down Expand Up @@ -46,10 +46,10 @@ assign neg = sum[117];
assign zero = (beta == 117'b0);

assign r = neg ?
{1'b0, E}
{1'b0, E[57:3]}
: db ?
(E + 1)
: {E[54:30], {29{1'b1}}} + 1;
(E[57:3] + 1)
: {E[57:33], {29{1'b1}}} + 1;

assign fd[56:30] = r[55:29];
assign fd[29] = (db == 1) ? r[28] : ~zero;
Expand Down
3 changes: 3 additions & 0 deletions components/multiplier/test/tb_multree.sv
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ module tb_multree;
b = 58'b00000000000000000000000000000000000000000000000000000000001100;
#10;

a = 58'b00001000000000000000000000000000000000000000000000000000000000;
b = 58'b00000000000111111111000000000000000000000000000000000000000000;

end
endmodule

52 changes: 52 additions & 0 deletions test/tb_master.sv
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,54 @@ always @(uut.mul.sig.div_inst.fd_out) begin
$display("Time=%0t | fd_out changed: %b", $time, uut.mul.sig.div_inst.fd_out);
end

// always @(uut.mul.sig.div_inst.cce) begin
// $display("Time=%0t | cce changed: %b", $time, uut.mul.sig.div_inst.cce);
// end
//
// always @(uut.mul.sig.div_inst.sce) begin
// $display("Time=%0t | sce changed: %b", $time, uut.mul.sig.div_inst.sce);
// end
//
// always @(uut.mul.sig.div_inst.c) begin
// $display("Time=%0t | c changed: %b", $time, uut.mul.sig.div_inst.c);
// end
//
// always @(uut.mul.sig.div_inst.s) begin
// $display("Time=%0t | s changed: %b", $time, uut.mul.sig.div_inst.s);
// end

always @(uut.mul.sig.div_inst.fq) begin
$display("Time=%0t | fq changed: %b", $time, uut.mul.sig.div_inst.fq);
end

always @(uut.mul.sig.div_inst.E) begin
$display("Time=%0t | E changed: %b", $time, uut.mul.sig.div_inst.E);
end

always @(uut.mul.sig.div_inst.Eb) begin
$display("Time=%0t | Eb changed: %b", $time, uut.mul.sig.div_inst.Eb);
end

always @(uut.mul.sig.div_inst.fd_out) begin
$display("Time=%0t | fd_out changed: %b", $time, uut.mul.sig.div_inst.fd_out);
end

always @(uut.mul.sig.div_inst.select_f.neg) begin
$display("Time=%0t | neg changed: %b", $time, uut.mul.sig.div_inst.select_f.neg);
end

always @(uut.mul.sig.div_inst.select_f.beta) begin
$display("Time=%0t | beta changed: %b", $time, uut.mul.sig.div_inst.select_f.beta);
end

always @(uut.mul.sig.div_inst.Da) begin
$display("Time=%0t | Da changed: %b", $time, uut.mul.sig.div_inst.Da);
end

always @(uut.mul.sig.div_inst.Db) begin
$display("Time=%0t | Db changed: %b", $time, uut.mul.sig.div_inst.Db);
end

always @(uut.mul.sig.div_inst.mul_out) begin
$display("Time=%0t | mul_out changed: %b", $time, uut.mul.sig.div_inst.mul_out);
end
Expand All @@ -110,6 +154,14 @@ always @(uut.mul.sig.div_inst.fb) begin
$display("Time=%0t | fb changed: %b", $time, uut.mul.sig.div_inst.fb);
end

always @(uut.mul.sig.div_inst.look_up) begin
$display("Time=%0t | look_up changed: %b", $time, uut.mul.sig.div_inst.look_up);
end

always @(uut.mul.sig.div_inst.tlu) begin
$display("Time=%0t | tlu changed: %b", $time, uut.mul.sig.div_inst.tlu);
end

always @(uut.mul.sig.div_inst.fa_in) begin
$display("Time=%0t | fa_in changed: %b", $time, uut.mul.sig.div_inst.fa_in);
end
Expand Down
6 changes: 3 additions & 3 deletions test_gen/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
use std::io;

use test_gen::{
file_utils::{factorize_denormal, factorize_normal},
// file_utils::{factorize_denormal, factorize_normal},
lookup::lookup_table,
};

fn main() -> io::Result<()> {
println!("Generating test files for floating point operations...");

// Generate test files for normal floating point operations
factorize_normal()?;
// factorize_normal()?;

// Generate test files for denormal floating point operations
factorize_denormal()?;
// factorize_denormal()?;

println!("All test files generated successfully!");

Expand Down