diff --git a/components/multiplier/div_logic.sv b/components/multiplier/div_logic.sv index 9fe4d9a..465bdb1 100644 --- a/components/multiplier/div_logic.sv +++ b/components/multiplier/div_logic.sv @@ -5,12 +5,12 @@ 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; @@ -18,34 +18,36 @@ 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)); @@ -53,7 +55,7 @@ select_fd select_f ( .Da(Da), .Db(Db), .Eb(Eb[114:0]), - .E(E), + .E({E, 3'b0}), .db(db), .fd(fd_out) ); @@ -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) @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/components/multiplier/rom256X8.sv b/components/multiplier/rom256X8.sv index f6aca58..2f84c36 100644 --- a/components/multiplier/rom256X8.sv +++ b/components/multiplier/rom256X8.sv @@ -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]; diff --git a/components/multiplier/select_fd.sv b/components/multiplier/select_fd.sv index 61e3d23..3ab98d5 100644 --- a/components/multiplier/select_fd.sv +++ b/components/multiplier/select_fd.sv @@ -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 @@ -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; diff --git a/components/multiplier/test/tb_multree.sv b/components/multiplier/test/tb_multree.sv index a855b15..cb5fe90 100644 --- a/components/multiplier/test/tb_multree.sv +++ b/components/multiplier/test/tb_multree.sv @@ -29,6 +29,9 @@ module tb_multree; b = 58'b00000000000000000000000000000000000000000000000000000000001100; #10; + a = 58'b00001000000000000000000000000000000000000000000000000000000000; + b = 58'b00000000000111111111000000000000000000000000000000000000000000; + end endmodule diff --git a/test/tb_master.sv b/test/tb_master.sv index d0f57e5..609a0f2 100644 --- a/test/tb_master.sv +++ b/test/tb_master.sv @@ -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 @@ -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 diff --git a/test_gen/src/main.rs b/test_gen/src/main.rs index ebae91c..6ade0a7 100644 --- a/test_gen/src/main.rs +++ b/test_gen/src/main.rs @@ -1,7 +1,7 @@ use std::io; use test_gen::{ - file_utils::{factorize_denormal, factorize_normal}, + // file_utils::{factorize_denormal, factorize_normal}, lookup::lookup_table, }; @@ -9,10 +9,10 @@ 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!");