📄 stratix_atoms.v
字号:
parameter zeroacc_clear = "none";
parameter signa_clear = "none";
parameter signb_clear = "none";
parameter output_clear = "none";
parameter addnsub0_pipeline_clock = "none";
parameter addnsub1_pipeline_clock = "none";
parameter zeroacc_pipeline_clock = "none";
parameter signa_pipeline_clock = "none";
parameter signb_pipeline_clock = "none";
parameter addnsub0_pipeline_clear = "none";
parameter addnsub1_pipeline_clear = "none";
parameter zeroacc_pipeline_clear = "none";
parameter signa_pipeline_clear = "none";
parameter signb_pipeline_clear = "none";
parameter overflow_programmable_invert = 1'b0;
parameter data_out_programmable_invert = 72'b0;
parameter lpm_hint = "true";
parameter lpm_type = "stratix_mac_out";
input [35:0] dataa;
input [35:0] datab;
input [35:0] datac;
input [35:0] datad;
input zeroacc;
input addnsub0;
input addnsub1;
input signa;
input signb;
input [3:0] clk;
input [3:0] aclr;
input [3:0] ena;
input devclrn;
input devpor;
output [71:0] dataout;
output accoverflow;
wire [71:0] signa_pipe;
wire [71:0] signb_pipe;
wire [71:0] signa_out;
wire [71:0] signb_out;
wire [71:0] addnsub0_pipe;
wire [71:0] addnsub1_pipe;
wire [71:0] addnsub0_out;
wire [71:0] addnsub1_out;
wire [71:0] zeroacc_pipe;
wire [71:0] zeroacc_out;
wire [71:0] dataout_wire;
wire accoverflow_wire;
wire [71:0] dataout_tmp;
wire [71:0] accoverflow_tmp;
wire devclrn, devpor;
stratix_mac_register signa_mac_reg
(
.data ({{(71){1'b0}},signa}),
.clk (clk[select_the(signa_clock)]),
.aclr (aclr[select_the(signa_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(signa_clock)]),
.power_up(1'b1),
.dataout (signa_pipe),
.async ( ((signa_clock == "none") ||
(signa_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam signa_mac_reg.data_width = 1;
stratix_mac_register signb_mac_reg
(
.data ({{(71){1'b0}},signb}),
.clk (clk[select_the(signb_clock)]),
.aclr (aclr[select_the(signb_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(signb_clock)]),
.power_up(1'b1),
.dataout (signb_pipe),
.async ( ((signb_clock == "none") ||
(signb_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam signb_mac_reg.data_width = 1;
stratix_mac_register zeroacc_mac_reg
(
.data ({{(71){1'b0}},zeroacc}),
.clk (clk[select_the(zeroacc_clock)]),
.aclr (aclr[select_the(zeroacc_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(zeroacc_clock)]),
.power_up(1'b0),
.dataout (zeroacc_pipe),
.async ( ((zeroacc_clock == "none") ||
(zeroacc_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam zeroacc_mac_reg.data_width = 1;
stratix_mac_register addnsub0_mac_reg
(
.data ({{(71){1'b0}},addnsub0}),
.clk (clk[select_the(addnsub0_clock)]),
.aclr (aclr[select_the(addnsub0_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(addnsub0_clock)]),
.power_up(1'b1),
.dataout (addnsub0_pipe),
.async ( ((addnsub0_clock == "none") ||
(addnsub0_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam addnsub0_mac_reg.data_width = 1;
stratix_mac_register addnsub1_mac_reg
(
.data ({{(71){1'b0}},addnsub1}),
.clk (clk[select_the(addnsub1_clock)]),
.aclr (aclr[select_the(addnsub1_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(addnsub1_clock)]),
.power_up(1'b1),
.dataout (addnsub1_pipe),
.async ( ((addnsub1_clock == "none") ||
(addnsub1_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam addnsub1_mac_reg.data_width = 1;
stratix_mac_register signa_mac_pipeline_reg
(
.data (signa_pipe),
.clk (clk[select_the(signa_pipeline_clock)]),
.aclr (aclr[select_the(signa_pipeline_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(signa_pipeline_clock)]),
.power_up(1'b1),
.dataout (signa_out),
.async ( ((signa_pipeline_clock == "none") ||
(signa_pipeline_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam signa_mac_pipeline_reg.data_width = 1;
stratix_mac_register signb_mac_pipeline_reg
(
.data (signb_pipe),
.clk (clk[select_the(signb_pipeline_clock)]),
.aclr (aclr[select_the(signb_pipeline_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(signb_pipeline_clock)]),
.power_up(1'b1),
.dataout (signb_out),
.async ( ((signb_pipeline_clock == "none") ||
(signb_pipeline_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam signb_mac_pipeline_reg.data_width = 1;
stratix_mac_register zeroacc_mac_pipeline_reg
(
.data (zeroacc_pipe),
.clk (clk[select_the(zeroacc_pipeline_clock)]),
.aclr (aclr[select_the(zeroacc_pipeline_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(zeroacc_pipeline_clock)]),
.power_up(1'b0),
.dataout (zeroacc_out),
.async ( ((zeroacc_pipeline_clock == "none") ||
(zeroacc_pipeline_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam zeroacc_mac_pipeline_reg.data_width = 1;
stratix_mac_register addnsub0_mac_pipeline_reg
(
.data (addnsub0_pipe),
.clk (clk[select_the(addnsub0_pipeline_clock)]),
.aclr (aclr[select_the(addnsub0_pipeline_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(addnsub0_pipeline_clock)]),
.power_up(1'b1),
.dataout (addnsub0_out),
.async ( ((addnsub0_pipeline_clock == "none") ||
(addnsub0_pipeline_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam addnsub0_mac_pipeline_reg.data_width = 1;
stratix_mac_register addnsub1_mac_pipeline_reg
(
.data (addnsub1_pipe),
.clk (clk[select_the(addnsub1_pipeline_clock)]),
.aclr (aclr[select_the(addnsub1_pipeline_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(addnsub1_pipeline_clock)]),
.power_up(1'b1),
.dataout (addnsub1_out),
.async ( ((addnsub1_pipeline_clock == "none") ||
(addnsub1_pipeline_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam addnsub1_mac_pipeline_reg.data_width = 1;
stratix_mac_out_internal mac_adder
(
.dataa (dataa),
.datab (datab),
.datac (datac),
.datad (datad),
.signx (signa_out[0]),
.signy (signb_out[0]),
.addnsub0 (addnsub0_out[0]),
.addnsub1 (addnsub1_out[0]),
.zeroacc (zeroacc_out[0]),
.dataout_global (dataout_tmp[71:0]),
.dataout (dataout_wire[71:0]),
.accoverflow (accoverflow_wire)
);
defparam mac_adder.dataa_width = dataa_width;
defparam mac_adder.datab_width = datab_width;
defparam mac_adder.datac_width = datac_width;
defparam mac_adder.datad_width = datad_width;
defparam mac_adder.dataout_width = dataout_width;
defparam mac_adder.operation_mode = operation_mode;
stratix_mac_register dataout_out_reg
(
.data (dataout_wire),
.clk (clk[select_the(output_clock)]),
.aclr (aclr[select_the(output_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(output_clock)]),
.power_up(1'b0),
.dataout (dataout_tmp),
.async ( ((output_clock == "none") ||
(output_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam dataout_out_reg.data_width = dataout_width;
stratix_mac_register accoverflow_out_reg
(
.data ({{(71){1'b0}},accoverflow_wire}),
.clk (clk[select_the(output_clock)]),
.aclr (aclr[select_the(output_clear)] || ~devclrn || ~devpor),
.ena (ena[select_the(output_clock)]),
.power_up(1'b0),
.dataout (accoverflow_tmp),
.async ( ((output_clock == "none") ||
(output_clear == "none")) ? 1'b1 : 1'b0 )
);
defparam accoverflow_out_reg.data_width = 1;
assign dataout = dataout_tmp ^ data_out_programmable_invert;
assign accoverflow = accoverflow_tmp[0] ^ overflow_programmable_invert;
//////////////////////////////////////////////////////////////////////////////
//
// SELECT_THE
//
//////////////////////////////////////////////////////////////////////////////
function integer select_the;
input [8*4:1] string_name;
begin
if (string_name == "0")
select_the = 0;
else if (string_name == "1")
select_the = 1;
else if (string_name == "2")
select_the = 2;
else if (string_name == "3")
select_the = 3;
else if (string_name == "none")
select_the = 0;
else
$display ("Error: select line must be a string");
end
endfunction
endmodule
///////////////////////////////////////////////////////////////////////////////
//
// STRATIX_MAC_OUT_INTERNAL
//
///////////////////////////////////////////////////////////////////////////////
`timescale 1 ps/1 ps
module stratix_mac_out_internal (dataa, datab, datac, datad, signx, signy,
addnsub0, addnsub1, zeroacc, dataout_global,
dataout, accoverflow);
`define ADD 1'b1
`define SUB 1'b0
parameter operation_mode = "output_only";
parameter dataa_width = 36;
parameter datab_width = 36;
parameter datac_width = 36;
parameter datad_width = 36;
parameter dataout_width = 72;
input [35:0] dataa;
input [35:0] datab;
input [35:0] datac;
input [35:0] datad;
input signx;
input signy;
input addnsub0;
input addnsub1;
input zeroacc;
input [71:0] dataout_global;
output [71:0] dataout;
output accoverflow;
reg [71:0] dataout_tmp;
reg accoverflow_tmp;
reg [71:0] next_dataout;
reg [71:0] dataa_u;
reg [71:0] datab_u;
reg [71:0] datab_s;
reg [71:0] datac_u;
reg [71:0] datac_s;
reg [71:0] datad_u;
reg [71:0] datad_s;
wire [71:0] dataout_tbuf;
wire accoverflow_tbuf;
specify
(dataa *> dataout) = (0,0);
(datab *> dataout) = (0,0);
(datac *> dataout) = (0,0);
(datad *> dataout) = (0,0);
(signx *> dataout) = (0,0);
(signy *> dataout) = (0,0);
(addnsub0 *> dataout) = (0,0);
(addnsub1 *> dataout) = (0,0);
(zeroacc *> dataout) = (0,0);
(dataa *> accoverflow) = (0,0);
(signx *> accoverflow) = (0,0);
(signy *> accoverflow) = (0,0);
(addnsub0 *> accoverflow) = (0,0);
(addnsub1 *> accoverflow) = (0,0);
(zeroacc *> accoverflow) = (0,0);
endspecify
buf dataout_buf0(dataout[0], dataout_tbuf[0]);
buf dataout_buf1(dataout[1], dataout_tbuf[1]);
buf dataout_buf2(dataout[2], dataout_tbuf[2]);
buf dataout_buf3(dataout[3], dataout_tbuf[3]);
buf dataout_buf4(dataout[4], dataout_tbuf[4]);
buf dataout_buf5(dataout[5], dataout_tbuf[5]);
buf dataout_buf6(dataout[6], dataout_tbuf[6]);
buf dataout_buf7(dataout[7], dataout_tbuf[7]);
buf dataout_buf8(dataout[8], dataout_tbuf[8]);
buf dataout_buf9(dataout[9], dataout_tbuf[9]);
buf dataout_buf10(dataout[10], dataout_tbuf[10]);
buf dataout_buf11(dataout[11], dataout_tbuf[11]);
buf dataout_buf12(dataout[12], dataout_tbuf[12]);
buf dataout_buf13(dataout[13], dataout_tbuf[13]);
buf dataout_buf14(dataout[14], dataout_tbuf[14]);
buf dataout_buf15(dataout[15], dataout_tbuf[15]);
buf dataout_buf16(dataout[16], dataout_tbuf[16]);
buf dataout_buf17(dataout[17], dataout_tbuf[17]);
buf dataout_buf18(dataout[18], dataout_tbuf[18]);
buf dataout_buf19(dataout[19], dataout_tbuf[19]);
buf dataout_buf20(dataout[20], dataout_tbuf[20]);
buf dataout_buf21(dataout[21], dataout_tbuf[21]);
buf dataout_buf22(dataout[22], dataout_tbuf[22]);
buf dataout_buf23(dataout[23], dataout_tbuf[23]);
buf dataout_buf24(dataout[24], dataout_tbuf[24]);
buf dataout_buf25(dataout[25], dataout_tbuf[25]);
buf dataout_buf26(dataout[26], dataout_tbuf[26]);
buf dataout_buf27(dataout[27], dataout_tbuf[27]);
buf dataout_buf28(dataout[28], dataout_tbuf[28]);
buf dataout_buf29(dataout[29], dataout_tbuf[29]);
buf dataout_buf30(dataout[30], dataout_tbuf[30]);
buf dataout_buf31(dataout[31], dataout_tbuf[31]);
buf dataout_buf32(dataout[32], dataout_tbuf[32]);
buf dataout_buf33(dataout[33], dataout_tbuf[33]);
buf dataout_buf34(dataout[34], dataout_tbuf[34]);
buf dataout_buf35(dataout[35], dataout_tbuf[35]);
buf dataout_buf36(dataout[36], dataout_tbuf[36]);
buf dataout_buf37(dataout[37], dataout_tbuf[37]);
buf dataout_buf38(dataout[38], dataout_tbuf[38]);
buf dataout_buf39(dataout[39], dataout_tbuf[39]);
buf dataout_buf40(dataout[40], dataout_tbuf[40]);
buf dataout_buf41(dataout[41], dataout_tbuf[41]);
buf dataout_buf42(dataout[42], dataout_tbuf[42]);
buf dataout_buf43(dataout[43], dataout_tbuf[43]);
buf dataout_buf44(dataout[44], dataout_tbuf[44]);
buf dataout_buf45(dataout[45], dataout_tbuf[45]);
buf dataout_buf46(dataout[46], dataout_tbuf[46]);
buf dataout_buf47(dataout[47], dataout_tbuf[47]);
buf dataout_buf48(dataout[48], dataout_tbuf[48]);
buf dataout_buf49(dataout[49], dataout_tbuf[49]);
buf dataout_buf50(dataout[50], dataout_tbuf[50]);
buf dataout_buf51(dataout[51], dataout_tbuf[51]);
buf dataout_buf52(dataout[52], dataout_tbuf[52]);
buf dataout_buf53(dataout[53], dataout_tbuf[53]);
buf dataout_buf54(dataout[54], dataout_tbuf[54]);
buf dataout_buf55(dataout[55], dataout_tbuf[55]);
buf dataout_buf56(dataout[56], dataout_tbuf[56]);
buf dataout_buf57(dataout[57], dataout_tbuf[57]);
buf dataout_buf58(dataout[58], dataout_tbuf[58]);
buf dataout_buf59(dataout[59], dataout_tbuf[59]);
buf dataout_buf60(dataout[60], dataout_tbuf[60]);
buf dataout_buf61(dataout[61], dataout_tbuf[61]);
buf dataout_buf62(dataout[62], dataout_tbuf[62]);
buf dataout_buf63(dataout[63], dataout_tbuf[63]);
buf dataout_buf64(dataout[64], dataout_tbuf[64]);
buf dataout_buf65(dataout[65], dataout_tbuf[65]);
buf dataout_buf66(dataout[66], dataout_tbuf[66]);
buf dataout_buf67(dataout[67], dataout_tbuf[67]);
buf dataout_buf68(dataout[68], dataout_tbuf[68]);
buf dataout_buf69(dataout[69], dataout_tbuf[69]);
buf dataout_buf70(dataout[70], dataout_tbuf[70]);
buf dataout_buf71(dataout[71], dataout_tbuf[71]);
buf accoverflow_buf(accoverflow, accoverflow_tbuf);
assign dataout_tbuf[71:0] = dataout_tmp[71:0];
assign accoverflow_tbuf = accoverflow_tmp;
always @(dataa or datab or datac or datad or dataout_global
or signx or signy or addnsub0 or addnsub1
or zeroacc or opera
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -