diff options
Diffstat (limited to 'tests/xsthammer/cy_cells.v')
-rw-r--r-- | tests/xsthammer/cy_cells.v | 569 |
1 files changed, 0 insertions, 569 deletions
diff --git a/tests/xsthammer/cy_cells.v b/tests/xsthammer/cy_cells.v deleted file mode 100644 index 66a124b5c..000000000 --- a/tests/xsthammer/cy_cells.v +++ /dev/null @@ -1,569 +0,0 @@ - -// Based on the simulation models from /opt/altera/13.0/quartus/eda/sim_lib/cycloneiii_atoms.v - -module cycloneiii_lcell_comb (dataa, datab, datac, datad, cin, combout, cout); - -input dataa, datab, datac, datad, cin; -output combout, cout; - -parameter lut_mask = 16'hFFFF; -parameter sum_lutc_input = "datac"; -parameter dont_touch = "off"; -parameter lpm_type = "cycloneiii_lcell_comb"; - -reg cout_tmp, combout_tmp; -reg [1:0] isum_lutc_input; - -// 4-input LUT function -function lut4; - input [15:0] mask; - input dataa, datab, datac, datad; - begin - lut4 = datad ? ( datac ? ( datab ? ( dataa ? mask[15] : mask[14]) - : ( dataa ? mask[13] : mask[12])) - : ( datab ? ( dataa ? mask[11] : mask[10]) - : ( dataa ? mask[ 9] : mask[ 8]))) - : ( datac ? ( datab ? ( dataa ? mask[ 7] : mask[ 6]) - : ( dataa ? mask[ 5] : mask[ 4])) - : ( datab ? ( dataa ? mask[ 3] : mask[ 2]) - : ( dataa ? mask[ 1] : mask[ 0]))); - end -endfunction - -initial - if (sum_lutc_input == "datac") - isum_lutc_input = 0; - else if (sum_lutc_input == "cin") - isum_lutc_input = 1; - else - isum_lutc_input = 2; - -always @* begin - if (isum_lutc_input == 0) // datac - combout_tmp = lut4(lut_mask, dataa, datab, datac, datad); - else if (isum_lutc_input == 1) // cin - combout_tmp = lut4(lut_mask, dataa, datab, cin, datad); - cout_tmp = lut4(lut_mask, dataa, datab, cin, 'b0); -end - -assign combout = combout_tmp; -assign cout = cout_tmp; - -endmodule - -// ---------------------------------------------------------------------- - -module cycloneiii_io_ibuf (i, ibar, o); - -parameter differential_mode = "false"; -parameter bus_hold = "false"; -parameter simulate_z_as = "Z"; -parameter lpm_type = "cycloneiii_io_ibuf"; - -input i, ibar; -output o; - -assign o = i; - -endmodule - -// ---------------------------------------------------------------------- - -module cycloneiii_io_obuf (i, oe, seriesterminationcontrol, devoe, o, obar); - -parameter open_drain_output = "false"; -parameter bus_hold = "false"; -parameter lpm_type = "cycloneiii_io_obuf"; - -input i, oe, devoe; -input [15:0] seriesterminationcontrol; -output o, obar; - -assign o = i; -assign obar = ~i; - -endmodule - -// ---------------------------------------------------------------------- - -module cycloneiii_mac_data_reg (clk, - data, - ena, - aclr, - dataout - ); - - parameter data_width = 18; - - // INPUT PORTS - input clk; - input [17 : 0] data; - input ena; - input aclr; - - // OUTPUT PORTS - output [17:0] dataout; - - // INTERNAL VARIABLES AND NETS - reg clk_last_value; - reg [17:0] dataout_tmp; - wire [17:0] dataout_wire; - - // INTERNAL VARIABLES - wire [17:0] data_ipd; - wire enable; - wire no_clr; - reg d_viol; - reg ena_viol; - wire clk_ipd; - wire ena_ipd; - wire aclr_ipd; - - - // BUFFER INPUTS - buf (clk_ipd, clk); - buf (ena_ipd, ena); - buf (aclr_ipd, aclr); - - buf (data_ipd[0], data[0]); - buf (data_ipd[1], data[1]); - buf (data_ipd[2], data[2]); - buf (data_ipd[3], data[3]); - buf (data_ipd[4], data[4]); - buf (data_ipd[5], data[5]); - buf (data_ipd[6], data[6]); - buf (data_ipd[7], data[7]); - buf (data_ipd[8], data[8]); - buf (data_ipd[9], data[9]); - buf (data_ipd[10], data[10]); - buf (data_ipd[11], data[11]); - buf (data_ipd[12], data[12]); - buf (data_ipd[13], data[13]); - buf (data_ipd[14], data[14]); - buf (data_ipd[15], data[15]); - buf (data_ipd[16], data[16]); - buf (data_ipd[17], data[17]); - - assign enable = (!aclr_ipd) && (ena_ipd); - assign no_clr = (!aclr_ipd); - - initial - begin - clk_last_value <= 'b0; - dataout_tmp <= 18'b0; - end - - always @(clk_ipd or aclr_ipd) - begin - if (d_viol == 1'b1 || ena_viol == 1'b1) - begin - dataout_tmp <= 'bX; - end - else if (aclr_ipd == 1'b1) - begin - dataout_tmp <= 'b0; - end - else - begin - if ((clk_ipd === 1'b1) && (clk_last_value == 1'b0)) - if (ena_ipd === 1'b1) - dataout_tmp <= data_ipd; - end - - clk_last_value <= clk_ipd; - - end // always - - assign dataout_wire = dataout_tmp; - - and (dataout[0], dataout_wire[0], 1'b1); - and (dataout[1], dataout_wire[1], 1'b1); - and (dataout[2], dataout_wire[2], 1'b1); - and (dataout[3], dataout_wire[3], 1'b1); - and (dataout[4], dataout_wire[4], 1'b1); - and (dataout[5], dataout_wire[5], 1'b1); - and (dataout[6], dataout_wire[6], 1'b1); - and (dataout[7], dataout_wire[7], 1'b1); - and (dataout[8], dataout_wire[8], 1'b1); - and (dataout[9], dataout_wire[9], 1'b1); - and (dataout[10], dataout_wire[10], 1'b1); - and (dataout[11], dataout_wire[11], 1'b1); - and (dataout[12], dataout_wire[12], 1'b1); - and (dataout[13], dataout_wire[13], 1'b1); - and (dataout[14], dataout_wire[14], 1'b1); - and (dataout[15], dataout_wire[15], 1'b1); - and (dataout[16], dataout_wire[16], 1'b1); - and (dataout[17], dataout_wire[17], 1'b1); - -endmodule //cycloneiii_mac_data_reg - -module cycloneiii_mac_sign_reg ( - clk, - d, - ena, - aclr, - q - ); - - // INPUT PORTS - input clk; - input d; - input ena; - input aclr; - - // OUTPUT PORTS - output q; - - // INTERNAL VARIABLES - reg clk_last_value; - reg q_tmp; - reg ena_viol; - reg d_viol; - - wire enable; - - // DEFAULT VALUES THRO' PULLUPs - // tri1 aclr, ena; - - wire d_ipd; - wire clk_ipd; - wire ena_ipd; - wire aclr_ipd; - - buf (d_ipd, d); - buf (clk_ipd, clk); - buf (ena_ipd, ena); - buf (aclr_ipd, aclr); - - assign enable = (!aclr_ipd) && (ena_ipd); - - initial - begin - clk_last_value <= 'b0; - q_tmp <= 'b0; - end - - always @ (clk_ipd or aclr_ipd) - begin - if (d_viol == 1'b1 || ena_viol == 1'b1) - begin - q_tmp <= 'bX; - end - else - begin - if (aclr_ipd == 1'b1) - q_tmp <= 0; - else if ((clk_ipd == 1'b1) && (clk_last_value == 1'b0)) - if (ena_ipd == 1'b1) - q_tmp <= d_ipd; - end - - clk_last_value <= clk_ipd; - end - - and (q, q_tmp, 'b1); - -endmodule // cycloneiii_mac_sign_reg - -module cycloneiii_mac_mult_internal - ( - dataa, - datab, - signa, - signb, - dataout - ); - - parameter dataa_width = 18; - parameter datab_width = 18; - parameter dataout_width = dataa_width + datab_width; - - // INPUT - input [dataa_width-1:0] dataa; - input [datab_width-1:0] datab; - input signa; - input signb; - - // OUTPUT - output [dataout_width-1:0] dataout; - - // Internal variables - wire [17:0] dataa_ipd; - wire [17:0] datab_ipd; - wire signa_ipd; - wire signb_ipd; - - wire [dataout_width-1:0] dataout_tmp; - - wire ia_is_positive; - wire ib_is_positive; - wire [17:0] iabsa; // absolute value (i.e. positive) form of dataa input - wire [17:0] iabsb; // absolute value (i.e. positive) form of datab input - wire [35:0] iabsresult; // absolute value (i.e. positive) form of product (a * b) - - - reg [17:0] i_ones; // padding with 1's for input negation - - // Input buffers - buf (signa_ipd, signa); - buf (signb_ipd, signb); - - // buf dataa_buf [dataa_width-1:0] (dataa_ipd[dataa_width-1:0], dataa); - // buf datab_buf [datab_width-1:0] (datab_ipd[datab_width-1:0], datab); - assign dataa_ipd[dataa_width-1:0] = dataa; - assign datab_ipd[datab_width-1:0] = datab; - - initial - begin - // 1's padding for 18-bit wide inputs - i_ones = ~0; - end - - // get signs of a and b, and get absolute values since Verilog '*' operator - // is an unsigned multiplication - assign ia_is_positive = ~signa_ipd | ~dataa_ipd[dataa_width-1]; - assign ib_is_positive = ~signb_ipd | ~datab_ipd[datab_width-1]; - - assign iabsa = ia_is_positive == 1 ? dataa_ipd[dataa_width-1:0] : -(dataa_ipd | (i_ones << dataa_width)); - assign iabsb = ib_is_positive == 1 ? datab_ipd[datab_width-1:0] : -(datab_ipd | (i_ones << datab_width)); - - // multiply a * b - assign iabsresult = iabsa * iabsb; - assign dataout_tmp = (ia_is_positive ^ ib_is_positive) == 1 ? -iabsresult : iabsresult; - - // buf dataout_buf [dataout_width-1:0] (dataout, dataout_tmp); - assign dataout = dataout_tmp; - -endmodule - -module cycloneiii_mac_mult - ( - dataa, - datab, - signa, - signb, - clk, - aclr, - ena, - dataout, - devclrn, - devpor - ); - - parameter dataa_width = 18; - parameter datab_width = 18; - parameter dataa_clock = "none"; - parameter datab_clock = "none"; - parameter signa_clock = "none"; - parameter signb_clock = "none"; - parameter lpm_hint = "true"; - parameter lpm_type = "cycloneiii_mac_mult"; - -// SIMULATION_ONLY_PARAMETERS_BEGIN - - parameter dataout_width = dataa_width + datab_width; - -// SIMULATION_ONLY_PARAMETERS_END - - input [dataa_width-1:0] dataa; - input [datab_width-1:0] datab; - input signa; - input signb; - input clk; - input aclr; - input ena; - input devclrn; - input devpor; - - output [dataout_width-1:0] dataout; - - // tri1 devclrn; - // tri1 devpor; - - wire [dataout_width-1:0] dataout_tmp; - - wire [17:0] idataa_reg; // optional register for dataa input - wire [17:0] idatab_reg; // optional register for datab input - wire [17:0] dataa_pad; // padded dataa input - wire [17:0] datab_pad; // padded datab input - wire isigna_reg; // optional register for signa input - wire isignb_reg; // optional register for signb input - - wire [17:0] idataa_int; // dataa as seen by the multiplier input - wire [17:0] idatab_int; // datab as seen by the multiplier input - wire isigna_int; // signa as seen by the multiplier input - wire isignb_int; // signb as seen by the multiplier input - - wire ia_is_positive; - wire ib_is_positive; - wire [17:0] iabsa; // absolute value (i.e. positive) form of dataa input - wire [17:0] iabsb; // absolute value (i.e. positive) form of datab input - wire [35:0] iabsresult; // absolute value (i.e. positive) form of product (a * b) - - wire dataa_use_reg; // equivalent to dataa_clock parameter - wire datab_use_reg; // equivalent to datab_clock parameter - wire signa_use_reg; // equivalent to signa_clock parameter - wire signb_use_reg; // equivalent to signb_clock parameter - - reg [17:0] i_ones; // padding with 1's for input negation - - wire reg_aclr; - - assign reg_aclr = (!devpor) || (!devclrn) || (aclr); - - // optional registering parameters - assign dataa_use_reg = (dataa_clock != "none") ? 1'b1 : 1'b0; - assign datab_use_reg = (datab_clock != "none") ? 1'b1 : 1'b0; - assign signa_use_reg = (signa_clock != "none") ? 1'b1 : 1'b0; - assign signb_use_reg = (signb_clock != "none") ? 1'b1 : 1'b0; - assign dataa_pad = ((18-dataa_width) == 0) ? dataa : {{(18-dataa_width){1'b0}},dataa}; - assign datab_pad = ((18-datab_width) == 0) ? datab : {{(18-datab_width){1'b0}},datab}; - - initial - begin - // 1's padding for 18-bit wide inputs - i_ones = ~0; - end - - // Optional input registers for dataa,b and signa,b - cycloneiii_mac_data_reg dataa_reg ( - .clk(clk), - .data(dataa_pad), - .ena(ena), - .aclr(reg_aclr), - .dataout(idataa_reg) - ); - defparam dataa_reg.data_width = dataa_width; - - cycloneiii_mac_data_reg datab_reg ( - .clk(clk), - .data(datab_pad), - .ena(ena), - .aclr(reg_aclr), - .dataout(idatab_reg) - ); - defparam datab_reg.data_width = datab_width; - - cycloneiii_mac_sign_reg signa_reg ( - .clk(clk), - .d(signa), - .ena(ena), - .aclr(reg_aclr), - .q(isigna_reg) - ); - - cycloneiii_mac_sign_reg signb_reg ( - .clk(clk), - .d(signb), - .ena(ena), - .aclr(reg_aclr), - .q(isignb_reg) - ); - - // mux input sources from direct inputs or optional registers - assign idataa_int = dataa_use_reg == 1'b1 ? idataa_reg : dataa; - assign idatab_int = datab_use_reg == 1'b1 ? idatab_reg : datab; - assign isigna_int = signa_use_reg == 1'b1 ? isigna_reg : signa; - assign isignb_int = signb_use_reg == 1'b1 ? isignb_reg : signb; - - cycloneiii_mac_mult_internal mac_multiply ( - .dataa(idataa_int[dataa_width-1:0]), - .datab(idatab_int[datab_width-1:0]), - .signa(isigna_int), - .signb(isignb_int), - .dataout(dataout) - ); - defparam mac_multiply.dataa_width = dataa_width; - defparam mac_multiply.datab_width = datab_width; - defparam mac_multiply.dataout_width = dataout_width; - -endmodule - -module cycloneiii_mac_out - ( - dataa, - clk, - aclr, - ena, - dataout, - devclrn, - devpor - ); - - parameter dataa_width = 1; - parameter output_clock = "none"; - parameter lpm_hint = "true"; - parameter lpm_type = "cycloneiii_mac_out"; - -// SIMULATION_ONLY_PARAMETERS_BEGIN - - parameter dataout_width = dataa_width; - -// SIMULATION_ONLY_PARAMETERS_END - - input [dataa_width-1:0] dataa; - input clk; - input aclr; - input ena; - input devclrn; - input devpor; - output [dataout_width-1:0] dataout; - - // tri1 devclrn; - // tri1 devpor; - - wire [dataa_width-1:0] dataa_ipd; // internal dataa - wire clk_ipd; // internal clk - wire aclr_ipd; // internal aclr - wire ena_ipd; // internal ena - - // internal variable - wire [dataout_width-1:0] dataout_tmp; - - reg [dataa_width-1:0] idataout_reg; // optional register for dataout output - - wire use_reg; // equivalent to dataout_clock parameter - - wire enable; - wire no_aclr; - - // Input buffers - buf (clk_ipd, clk); - buf (aclr_ipd, aclr); - buf (ena_ipd, ena); - - // buf dataa_buf [dataa_width-1:0] (dataa_ipd, dataa); - assign dataa_ipd = dataa; - - // optional registering parameter - assign use_reg = (output_clock != "none") ? 1 : 0; - assign enable = (!aclr) && (ena) && use_reg; - assign no_aclr = (!aclr) && use_reg; - - initial - begin - // initial values for optional register - idataout_reg = 0; - end - - // Optional input registers for dataa,b and signa,b - always @* // (posedge clk_ipd or posedge aclr_ipd or negedge devclrn or negedge devpor) - begin - if (devclrn == 0 || devpor == 0 || aclr_ipd == 1) - begin - idataout_reg <= 0; - end - else if (ena_ipd == 1) - begin - idataout_reg <= dataa_ipd; - end - end - - // mux input sources from direct inputs or optional registers - assign dataout_tmp = use_reg == 1 ? idataout_reg : dataa_ipd; - - // accelerate outputs - // buf dataout_buf [dataout_width-1:0] (dataout, dataout_tmp); - assign dataout = dataout_tmp; - -endmodule |