| `default_nettype none | |
| // Top level io for this module should stay the same to fit into the scan_wrapper. | |
| // The pin connections within the user_module are up to you, | |
| // although (if one is present) it is recommended to place a clock on io_in[0]. | |
| // This allows use of the internal clock divider if you wish. | |
| module user_module_341449297858921043( | |
| input [7:0] io_in, | |
| output [7:0] io_out | |
| ); | |
| wire [10:0] result; | |
| assign io_out = result[7:0]; | |
| anfsqrt_sqrt_341449297858921043 sqrt_core( | |
| .clk(io_in[0]), | |
| .query({io_in[7:1], 4'b0}), | |
| .result(result) | |
| ); | |
| endmodule | |
| // Any submodules should be included in this file, | |
| // so they are copied into the main TinyTapeout repo. | |
| // Appending your ID to any submodules you create | |
| // ensures there are no clashes in full-chip simulation. | |
| // SQRT Iteration Unit | |
| // Copyright (C) 2022 Davit Margarian | |
| module anfsqrt_sqrtiu_341449297858921043 ( | |
| input [10:0] prev_att, | |
| input [10:0] prev_eps, | |
| input [10:0] prev_res, | |
| output [10:0] this_att, | |
| output [10:0] this_eps, | |
| output [10:0] this_res | |
| ); | |
| assign this_att = {1'b0, prev_att[10:1]}; | |
| wire [10:0] this_delta_term1_half; | |
| wire [10:0] this_delta; | |
| reg [3:0] this_att_msb; | |
| wire [4:0] this_att_sq_exp; | |
| wire [10:0] this_att_sq; | |
| assign this_att_sq_exp = {this_att_msb, 1'b0}; | |
| assign this_att_sq = 11'b1 << this_att_sq_exp; | |
| assign this_delta_term1_half = prev_res << this_att_msb; | |
| assign this_delta = {this_delta_term1_half[9:0], 1'b0} + this_att_sq; | |
| wire cond_met; | |
| assign cond_met = this_delta <= prev_eps; | |
| assign this_eps = cond_met ? prev_eps - this_delta : prev_eps; | |
| assign this_res = cond_met ? prev_res | this_att : prev_res; | |
| integer msb_idx; | |
| always @* begin | |
| this_att_msb = 0; | |
| for (msb_idx=0; msb_idx < 11; msb_idx++) begin | |
| if(this_att == (1 << msb_idx)) | |
| this_att_msb = msb_idx[3:0]; | |
| end | |
| end | |
| endmodule | |
| // SQRT Control Logic | |
| // Copyright (C) 2022 Davit Margarian | |
| module anfsqrt_sqrt_341449297858921043( | |
| input clk, | |
| input [10:0] query, | |
| output reg [10:0] result | |
| ); | |
| reg [10:0] att; | |
| reg [10:0] eps; | |
| reg [10:0] res; | |
| wire [10:0] att_mid; | |
| wire [10:0] res_mid; | |
| wire [10:0] eps_mid; | |
| wire [10:0] att_next; | |
| wire [10:0] res_next; | |
| wire [10:0] eps_next; | |
| anfsqrt_sqrtiu_341449297858921043 iteratorA( | |
| .prev_att(att), | |
| .prev_eps(eps), | |
| .prev_res(res), | |
| .this_att(att_mid), | |
| .this_eps(eps_mid), | |
| .this_res(res_mid) | |
| ); | |
| anfsqrt_sqrtiu_341449297858921043 iteratorB( | |
| .prev_att(att_mid), | |
| .prev_eps(eps_mid), | |
| .prev_res(res_mid), | |
| .this_att(att_next), | |
| .this_eps(eps_next), | |
| .this_res(res_next) | |
| ); | |
| reg [9:0] iteration; | |
| always @(posedge clk) begin | |
| if (iteration != 3) begin | |
| att <= att_next; | |
| eps <= eps_next; | |
| res <= res_next; | |
| iteration <= iteration + 1; | |
| end else begin | |
| result <= res; | |
| eps <= query; | |
| att <= 1 << 6; | |
| res <= 0; | |
| iteration <= 0; | |
| end | |
| end | |
| endmodule |