mirror of https://github.com/YosysHQ/yosys.git
Removed tests/xsthammer
This test is now available as 'vloghammer' in a seperate repository: https://github.com/cliffordwolf/VlogHammer
This commit is contained in:
parent
cf885c4a28
commit
52d21a63ca
|
@ -1,15 +0,0 @@
|
|||
generate
|
||||
generate.lst
|
||||
rtl
|
||||
xst
|
||||
xst_temp
|
||||
vivado
|
||||
vivado_temp
|
||||
quartus
|
||||
quartus_temp
|
||||
report
|
||||
report_temp
|
||||
check
|
||||
check_temp
|
||||
check_vivado
|
||||
check_quartus
|
|
@ -1,61 +0,0 @@
|
|||
|
||||
include generate.lst
|
||||
|
||||
test: $(TARGETS)
|
||||
|
||||
vivado: $(addprefix check_vivado/,$(notdir $(TARGETS)))
|
||||
|
||||
quartus: $(addprefix check_quartus/,$(notdir $(TARGETS)))
|
||||
|
||||
report:
|
||||
ls check check_quartus/ check_vivado | grep '\.err$$' | sort -u | cut -f1 -d. | gawk '{ print "report/" $$0 ".html"; }' | xargs -r $(MAKE)
|
||||
|
||||
report/%.html:
|
||||
bash report.sh $(notdir $(basename $@))
|
||||
|
||||
check/%.log: rtl/%.v xst/%.v
|
||||
bash run-check.sh $(notdir $(basename $<))
|
||||
|
||||
check_vivado/%.log: rtl/%.v vivado/%.v
|
||||
bash run-check.sh -vivado $(notdir $(basename $<))
|
||||
|
||||
check_quartus/%.log: rtl/%.v quartus/%.v
|
||||
bash run-check.sh -quartus $(notdir $(basename $<))
|
||||
|
||||
xst/%.v: rtl/%.v
|
||||
bash run-xst.sh $(notdir $(basename $<))
|
||||
|
||||
vivado/%.v: rtl/%.v
|
||||
bash run-vivado.sh $(notdir $(basename $<))
|
||||
|
||||
quartus/%.v: rtl/%.v
|
||||
bash run-quartus.sh $(notdir $(basename $<))
|
||||
|
||||
generate.lst: generate.cc
|
||||
clang -Wall -o generate generate.cc -lstdc++
|
||||
./generate
|
||||
{ echo -n "TARGETS := "; ls rtl/ | sed 's,\.v$$,.log,; s,^,check/,;' | tr '\n' ' '; } > generate.lst
|
||||
|
||||
check_xl_cells:
|
||||
../../yosys xl_cells_tb.ys
|
||||
|
||||
clean:
|
||||
rm -rf generate generate.lst check_temp xst_temp
|
||||
|
||||
mrproper: clean
|
||||
rm -rf rtl xst check
|
||||
|
||||
backup:
|
||||
mkdir -p ~/.yosys/xhammer
|
||||
tar cvzf ~/.yosys/xhammer/xst_files.tar.gz xst
|
||||
tar cvzf ~/.yosys/xhammer/vivado_files.tar.gz vivado
|
||||
tar cvzf ~/.yosys/xhammer/quartus_files.tar.gz quartus
|
||||
|
||||
restore:
|
||||
tar xvzf ~/.yosys/xhammer/xst_files.tar.gz
|
||||
tar xvzf ~/.yosys/xhammer/vivado_files.tar.gz
|
||||
tar xvzf ~/.yosys/xhammer/quartus_files.tar.gz
|
||||
|
||||
.PHONY: test vivado quartus report check_xl_cells clean mrproper backup restore
|
||||
.PRECIOUS: check/%.log xst/%.v vivado/%.v quartus/%.v rtl/%.v generate.lst
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
|
||||
================================
|
||||
This is work under construction!
|
||||
================================
|
||||
|
||||
|
||||
This is going to be a collection of auto-generated test cases. The goal is
|
||||
to synthesize them with Yosys and Xilinx XST and perform formal equivialence
|
||||
checks using the Yosys SAT-based equivialence checker. This will hopefully
|
||||
reveal some bugs in both applications.. ;-)
|
||||
|
||||
Simply run 'make' to generate all test cases and run all the tests.
|
||||
(Use 'make -j N' to use N parallel cores.)
|
||||
|
|
@ -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
|
|
@ -1,449 +0,0 @@
|
|||
|
||||
#define GENERATE_BINARY_OPS
|
||||
#define GENERATE_UNARY_OPS
|
||||
#define GENERATE_TERNARY_OPS
|
||||
#define GENERATE_CONCAT_OPS
|
||||
#undef GENERATE_REPEAT_OPS // disabled because of XST bug
|
||||
#define GENERATE_EXPRESSIONS
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
|
||||
const char *arg_types[][3] = {
|
||||
{ "{dir} [3:0] {name}", "{name}", "4" }, // 00
|
||||
{ "{dir} [4:0] {name}", "{name}", "5" }, // 01
|
||||
{ "{dir} [5:0] {name}", "{name}", "6" }, // 02
|
||||
{ "{dir} signed [3:0] {name}", "{name}", "4" }, // 03
|
||||
{ "{dir} signed [4:0] {name}", "{name}", "5" }, // 04
|
||||
{ "{dir} signed [5:0] {name}", "{name}", "6" } // 05
|
||||
};
|
||||
|
||||
const char *small_arg_types[][3] = {
|
||||
{ "{dir} [0:0] {name}", "{name}", "1" }, // 00
|
||||
{ "{dir} [1:0] {name}", "{name}", "2" }, // 01
|
||||
{ "{dir} [2:0] {name}", "{name}", "3" }, // 02
|
||||
{ "{dir} signed [0:0] {name}", "{name}", "1" }, // 03
|
||||
{ "{dir} signed [1:0] {name}", "{name}", "2" }, // 04
|
||||
{ "{dir} signed [2:0] {name}", "{name}", "3" }, // 05
|
||||
};
|
||||
|
||||
// See Table 5-1 (page 42) in IEEE Std 1364-2005
|
||||
// for a list of all Verilog oprators.
|
||||
|
||||
const char *binary_ops[] = {
|
||||
"+", // 00
|
||||
"-", // 01
|
||||
"*", // 02
|
||||
// "/",
|
||||
// "%",
|
||||
// "**",
|
||||
">", // 03
|
||||
">=", // 04
|
||||
"<", // 05
|
||||
"<=", // 06
|
||||
"&&", // 07
|
||||
"||", // 08
|
||||
"==", // 09
|
||||
"!=", // 10
|
||||
"===", // 11
|
||||
"!==", // 12
|
||||
"&", // 13
|
||||
"|", // 14
|
||||
"^", // 15
|
||||
"^~", // 16
|
||||
"<<", // 17
|
||||
">>", // 18
|
||||
"<<<", // 19
|
||||
">>>", // 20
|
||||
};
|
||||
|
||||
const char *unary_ops[] = {
|
||||
"+", // 00
|
||||
"-", // 01
|
||||
"!", // 02
|
||||
"~", // 03
|
||||
"&", // 04
|
||||
"~&", // 05
|
||||
"|", // 06
|
||||
"~|", // 07
|
||||
"^", // 08
|
||||
"~^", // 09
|
||||
};
|
||||
|
||||
void strsubst(std::string &str, const std::string &match, const std::string &replace)
|
||||
{
|
||||
size_t pos;
|
||||
while ((pos = str.find(match)) != std::string::npos)
|
||||
str.replace(pos, match.size(), replace);
|
||||
}
|
||||
|
||||
uint32_t xorshift32(uint32_t seed = 0) {
|
||||
static uint32_t x = 314159265;
|
||||
if (seed)
|
||||
x = seed;
|
||||
x ^= x << 13;
|
||||
x ^= x >> 17;
|
||||
x ^= x << 5;
|
||||
return x;
|
||||
}
|
||||
|
||||
void print_expression(FILE *f, int budget, uint32_t mask = 0)
|
||||
{
|
||||
size_t num_binary_ops = sizeof(binary_ops)/sizeof(*binary_ops);
|
||||
size_t num_unary_ops = sizeof(unary_ops)/sizeof(*unary_ops);
|
||||
size_t num_arg_types = sizeof(arg_types)/sizeof(*arg_types);
|
||||
int i, j, k, mode;
|
||||
|
||||
if (budget == 0) {
|
||||
fprintf(f, "%c%d", 'a' + char(xorshift32() % 2), int(xorshift32() % num_arg_types));
|
||||
return;
|
||||
}
|
||||
|
||||
int num_modes = 4;
|
||||
while ((mask & ~((~0) << num_modes)) == 0)
|
||||
mask = xorshift32();
|
||||
do {
|
||||
mode = xorshift32() % num_modes;
|
||||
} while (((1 << mode) & mask) == 0);
|
||||
// fprintf(f, "/* %d */", mode);
|
||||
|
||||
budget--;
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
fprintf(f, "(");
|
||||
print_expression(f, budget, mask);
|
||||
fprintf(f, ")");
|
||||
break;
|
||||
case 1:
|
||||
fprintf(f, "(");
|
||||
print_expression(f, budget/2, mask);
|
||||
#if 1
|
||||
// FIXME: relational operators disabled because there is an xst bug..
|
||||
do k = xorshift32() % num_binary_ops; while ((k >= 9 && k <= 12) || (k >= 3 && k <= 6));
|
||||
fprintf(f, "%s", binary_ops[k]);
|
||||
#else
|
||||
fprintf(f, "%s", binary_ops[xorshift32() % num_binary_ops]);
|
||||
#endif
|
||||
print_expression(f, budget/2, mask);
|
||||
fprintf(f, ")");
|
||||
break;
|
||||
case 2:
|
||||
fprintf(f, "(%s", unary_ops[xorshift32() % num_unary_ops]);
|
||||
print_expression(f, budget, mask);
|
||||
fprintf(f, ")");
|
||||
break;
|
||||
case 3:
|
||||
i = 1 + xorshift32() % 3;
|
||||
fprintf(f, "{");
|
||||
for (j = 0; j < i; j++) {
|
||||
if (j)
|
||||
fprintf(f, ",");
|
||||
print_expression(f, budget / i, mask);
|
||||
}
|
||||
fprintf(f, "}");
|
||||
break;
|
||||
#if 0
|
||||
// FIXME: disabled because there is an xst bug..
|
||||
case 4:
|
||||
i = xorshift32() % 4;
|
||||
fprintf(f, "{%d{", i);
|
||||
print_expression(f, budget, mask);
|
||||
fprintf(f, "}}");
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
mkdir("rtl", 0777);
|
||||
|
||||
#ifdef GENERATE_BINARY_OPS
|
||||
for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++)
|
||||
for (int bi = 0; bi < sizeof(arg_types)/sizeof(arg_types[0]); bi++)
|
||||
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
|
||||
for (int oi = 0; oi < sizeof(binary_ops)/sizeof(binary_ops[0]); oi++)
|
||||
{
|
||||
std::string a_decl = arg_types[ai][0];
|
||||
strsubst(a_decl, "{dir}", "input");
|
||||
strsubst(a_decl, "{name}", "a");
|
||||
|
||||
std::string b_decl = arg_types[bi][0];
|
||||
strsubst(b_decl, "{dir}", "input");
|
||||
strsubst(b_decl, "{name}", "b");
|
||||
|
||||
std::string y_decl = arg_types[yi][0];
|
||||
strsubst(y_decl, "{dir}", "output");
|
||||
strsubst(y_decl, "{name}", "y");
|
||||
|
||||
std::string a_ref = arg_types[ai][1];
|
||||
strsubst(a_ref, "{dir}", "input");
|
||||
strsubst(a_ref, "{name}", "a");
|
||||
|
||||
std::string b_ref = arg_types[bi][1];
|
||||
strsubst(b_ref, "{dir}", "input");
|
||||
strsubst(b_ref, "{name}", "b");
|
||||
|
||||
std::string y_ref = arg_types[yi][1];
|
||||
strsubst(y_ref, "{dir}", "output");
|
||||
strsubst(y_ref, "{name}", "y");
|
||||
|
||||
char buffer[1024];
|
||||
snprintf(buffer, 1024, "rtl/binary_ops_%02d%02d%02d%02d.v", ai, bi, yi, oi);
|
||||
|
||||
FILE *f = fopen(buffer, "w");
|
||||
fprintf(f, "module binary_ops_%02d%02d%02d%02d(a, b, y);\n", ai, bi, yi, oi);
|
||||
fprintf(f, "%s;\n", a_decl.c_str());
|
||||
fprintf(f, "%s;\n", b_decl.c_str());
|
||||
fprintf(f, "%s;\n", y_decl.c_str());
|
||||
fprintf(f, "assign %s = %s %s %s;\n", y_ref.c_str(),
|
||||
a_ref.c_str(), binary_ops[oi], b_ref.c_str());
|
||||
fprintf(f, "endmodule\n");
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GENERATE_UNARY_OPS
|
||||
for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++)
|
||||
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
|
||||
for (int oi = 0; oi < sizeof(unary_ops)/sizeof(unary_ops[0]); oi++)
|
||||
{
|
||||
std::string a_decl = arg_types[ai][0];
|
||||
strsubst(a_decl, "{dir}", "input");
|
||||
strsubst(a_decl, "{name}", "a");
|
||||
|
||||
std::string y_decl = arg_types[yi][0];
|
||||
strsubst(y_decl, "{dir}", "output");
|
||||
strsubst(y_decl, "{name}", "y");
|
||||
|
||||
std::string a_ref = arg_types[ai][1];
|
||||
strsubst(a_ref, "{dir}", "input");
|
||||
strsubst(a_ref, "{name}", "a");
|
||||
|
||||
std::string y_ref = arg_types[yi][1];
|
||||
strsubst(y_ref, "{dir}", "output");
|
||||
strsubst(y_ref, "{name}", "y");
|
||||
|
||||
char buffer[1024];
|
||||
snprintf(buffer, 1024, "rtl/unary_ops_%02d%02d%02d.v", ai, yi, oi);
|
||||
|
||||
FILE *f = fopen(buffer, "w");
|
||||
fprintf(f, "module unary_ops_%02d%02d%02d(a, b, y);\n", ai, yi, oi);
|
||||
fprintf(f, "%s;\n", a_decl.c_str());
|
||||
fprintf(f, "input b;\n");
|
||||
fprintf(f, "%s;\n", y_decl.c_str());
|
||||
fprintf(f, "assign %s = %s %s;\n", y_ref.c_str(),
|
||||
unary_ops[oi], a_ref.c_str());
|
||||
fprintf(f, "endmodule\n");
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GENERATE_TERNARY_OPS
|
||||
for (int ai = 0; ai < sizeof(small_arg_types)/sizeof(small_arg_types[0]); ai++)
|
||||
for (int bi = 0; bi < sizeof(arg_types)/sizeof(arg_types[0]); bi++)
|
||||
for (int ci = 0; ci < sizeof(arg_types)/sizeof(arg_types[0]); ci++)
|
||||
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
|
||||
{
|
||||
if (!strcmp(small_arg_types[ai][2], "3"))
|
||||
continue;
|
||||
if (!strcmp(arg_types[bi][2], "6"))
|
||||
continue;
|
||||
if (!strcmp(arg_types[ci][2], "6"))
|
||||
continue;
|
||||
|
||||
std::string a_decl = small_arg_types[ai][0];
|
||||
strsubst(a_decl, "{dir}", "input");
|
||||
strsubst(a_decl, "{name}", "a");
|
||||
|
||||
std::string b1_decl = arg_types[bi][0];
|
||||
strsubst(b1_decl, "{dir}", "wire");
|
||||
strsubst(b1_decl, "{name}", "b1");
|
||||
|
||||
std::string b2_decl = arg_types[ci][0];
|
||||
strsubst(b2_decl, "{dir}", "wire");
|
||||
strsubst(b2_decl, "{name}", "b2");
|
||||
|
||||
std::string y_decl = arg_types[yi][0];
|
||||
strsubst(y_decl, "{dir}", "output");
|
||||
strsubst(y_decl, "{name}", "y");
|
||||
|
||||
std::string a_ref = small_arg_types[ai][1];
|
||||
strsubst(a_ref, "{dir}", "input");
|
||||
strsubst(a_ref, "{name}", "a");
|
||||
|
||||
std::string b1_ref = arg_types[bi][1];
|
||||
strsubst(b1_ref, "{dir}", "wire");
|
||||
strsubst(b1_ref, "{name}", "b1");
|
||||
|
||||
std::string b2_ref = arg_types[ci][1];
|
||||
strsubst(b2_ref, "{dir}", "wire");
|
||||
strsubst(b2_ref, "{name}", "b2");
|
||||
|
||||
std::string y_ref = arg_types[yi][1];
|
||||
strsubst(y_ref, "{dir}", "output");
|
||||
strsubst(y_ref, "{name}", "y");
|
||||
|
||||
char buffer[1024];
|
||||
snprintf(buffer, 1024, "rtl/ternary_ops_%02d%02d%02d%02d.v", ai, bi, ci, yi);
|
||||
|
||||
FILE *f = fopen(buffer, "w");
|
||||
fprintf(f, "module ternary_ops_%02d%02d%02d%02d(a, b, y);\n", ai, bi, ci, yi);
|
||||
fprintf(f, "%s;\n", a_decl.c_str());
|
||||
fprintf(f, "input [%s+%s-1:0] b;\n", arg_types[bi][2], arg_types[ci][2]);
|
||||
fprintf(f, "%s = b[%s+%s-1:%s];\n", b1_decl.c_str(), arg_types[bi][2], arg_types[ci][2], arg_types[ci][2]);
|
||||
fprintf(f, "%s = b[%s-1:0];\n", b2_decl.c_str(), arg_types[ci][2]);
|
||||
fprintf(f, "%s;\n", y_decl.c_str());
|
||||
fprintf(f, "assign %s = %s ? %s : %s;\n", y_ref.c_str(),
|
||||
a_ref.c_str(), b1_ref.c_str(), b2_ref.c_str());
|
||||
fprintf(f, "endmodule\n");
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GENERATE_CONCAT_OPS
|
||||
for (int ai = 0; ai < sizeof(small_arg_types)/sizeof(small_arg_types[0]); ai++)
|
||||
for (int bi = 0; bi < sizeof(small_arg_types)/sizeof(small_arg_types[0]); bi++)
|
||||
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
|
||||
{
|
||||
std::string a_decl = small_arg_types[ai][0];
|
||||
strsubst(a_decl, "{dir}", "input");
|
||||
strsubst(a_decl, "{name}", "a");
|
||||
|
||||
std::string b_decl = small_arg_types[bi][0];
|
||||
strsubst(b_decl, "{dir}", "input");
|
||||
strsubst(b_decl, "{name}", "b");
|
||||
|
||||
std::string y_decl = arg_types[yi][0];
|
||||
strsubst(y_decl, "{dir}", "output");
|
||||
strsubst(y_decl, "{name}", "y");
|
||||
|
||||
std::string a_ref = small_arg_types[ai][1];
|
||||
strsubst(a_ref, "{dir}", "input");
|
||||
strsubst(a_ref, "{name}", "a");
|
||||
|
||||
std::string b_ref = small_arg_types[bi][1];
|
||||
strsubst(b_ref, "{dir}", "input");
|
||||
strsubst(b_ref, "{name}", "b");
|
||||
|
||||
std::string y_ref = arg_types[yi][1];
|
||||
strsubst(y_ref, "{dir}", "output");
|
||||
strsubst(y_ref, "{name}", "y");
|
||||
|
||||
char buffer[1024];
|
||||
snprintf(buffer, 1024, "rtl/concat_ops_%02d%02d%02d.v", ai, bi, yi);
|
||||
|
||||
FILE *f = fopen(buffer, "w");
|
||||
fprintf(f, "module concat_ops_%02d%02d%02d(a, b, y);\n", ai, bi, yi);
|
||||
fprintf(f, "%s;\n", a_decl.c_str());
|
||||
fprintf(f, "%s;\n", b_decl.c_str());
|
||||
fprintf(f, "%s;\n", y_decl.c_str());
|
||||
fprintf(f, "assign %s = {%s, %s};\n", y_ref.c_str(), a_ref.c_str(), b_ref.c_str());
|
||||
fprintf(f, "endmodule\n");
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GENERATE_REPEAT_OPS
|
||||
for (int a = 0; a < 4; a++)
|
||||
for (int bi = 0; bi < sizeof(small_arg_types)/sizeof(small_arg_types[0]); bi++)
|
||||
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
|
||||
{
|
||||
std::string b_decl = small_arg_types[bi][0];
|
||||
strsubst(b_decl, "{dir}", "input");
|
||||
strsubst(b_decl, "{name}", "b");
|
||||
|
||||
std::string y_decl = arg_types[yi][0];
|
||||
strsubst(y_decl, "{dir}", "output");
|
||||
strsubst(y_decl, "{name}", "y");
|
||||
|
||||
std::string b_ref = small_arg_types[bi][1];
|
||||
strsubst(b_ref, "{dir}", "input");
|
||||
strsubst(b_ref, "{name}", "b");
|
||||
|
||||
std::string y_ref = arg_types[yi][1];
|
||||
strsubst(y_ref, "{dir}", "output");
|
||||
strsubst(y_ref, "{name}", "y");
|
||||
|
||||
char buffer[1024];
|
||||
snprintf(buffer, 1024, "rtl/repeat_ops_%02d%02d%02d.v", a, bi, yi);
|
||||
|
||||
FILE *f = fopen(buffer, "w");
|
||||
fprintf(f, "module repeat_ops_%02d%02d%02d(a, b, y);\n", a, bi, yi);
|
||||
fprintf(f, "input a;\n");
|
||||
fprintf(f, "%s;\n", b_decl.c_str());
|
||||
fprintf(f, "%s;\n", y_decl.c_str());
|
||||
fprintf(f, "assign %s = {%d{%s}};\n", y_ref.c_str(), a, b_ref.c_str());
|
||||
fprintf(f, "endmodule\n");
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GENERATE_EXPRESSIONS
|
||||
for (int i = 0; i < 1000; i++)
|
||||
{
|
||||
xorshift32(1234 + i);
|
||||
xorshift32();
|
||||
xorshift32();
|
||||
xorshift32();
|
||||
|
||||
char buffer[1024];
|
||||
snprintf(buffer, 1024, "rtl/expression_%05d.v", i);
|
||||
|
||||
FILE *f = fopen(buffer, "w");
|
||||
fprintf(f, "module expression_%05d(a, b, y);\n", i);
|
||||
|
||||
for (char var = 'a'; var <= 'y'; var++)
|
||||
{
|
||||
fprintf(f, "%s [", var != 'y' ? "input" : "output");
|
||||
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++)
|
||||
fprintf(f, "%s%s", j ? "+" : "", arg_types[j][2]);
|
||||
fprintf(f, "-1:0] %c;\n", var);
|
||||
|
||||
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++)
|
||||
{
|
||||
std::string decl = arg_types[j][0];
|
||||
strsubst(decl, "{dir}", "wire");
|
||||
snprintf(buffer, 1024, "%c%d", var, j);
|
||||
strsubst(decl, "{name}", buffer);
|
||||
|
||||
if (var != 'y') {
|
||||
fprintf(f, "%s = %c[", decl.c_str(), var);
|
||||
for (int k = 0; k <= j; k++)
|
||||
fprintf(f, "%s%s", k ? "+" : "", arg_types[k][2]);
|
||||
fprintf(f, "-1:");
|
||||
for (int k = 0; k < j; k++)
|
||||
fprintf(f, "%s%s", k ? "+" : "", arg_types[k][2]);
|
||||
fprintf(f, "%s];\n", j ? "" : "0");
|
||||
} else
|
||||
fprintf(f, "%s;\n", decl.c_str());
|
||||
}
|
||||
|
||||
if (var == 'b')
|
||||
var = 'x';
|
||||
}
|
||||
|
||||
fprintf(f, "assign y = {");
|
||||
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++)
|
||||
fprintf(f, "%sy%d", j ? "," : "", j);
|
||||
fprintf(f, "};\n");
|
||||
|
||||
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++) {
|
||||
fprintf(f, "assign y%d = ", j);
|
||||
print_expression(f, 1 + xorshift32() % 20);
|
||||
fprintf(f, ";\n");
|
||||
}
|
||||
|
||||
fprintf(f, "endmodule\n");
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <job_id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
job="$1"
|
||||
set --
|
||||
|
||||
set -ex
|
||||
rm -rf report_temp/$job
|
||||
mkdir -p report report_temp/$job
|
||||
cd report_temp/$job
|
||||
|
||||
cp ../../vivado/$job.v syn_vivado.v
|
||||
cp ../../quartus/$job.v syn_quartus.v
|
||||
cp ../../xst/$job.v syn_xst.v
|
||||
cp ../../rtl/$job.v rtl.v
|
||||
|
||||
yosys -p 'hierarchy; proc; opt; techmap; abc; opt' -b 'verilog -noattr' -o syn_yosys.v ../../rtl/$job.v
|
||||
cat ../../xl_cells.v ../../cy_cells.v > cells.v
|
||||
|
||||
{
|
||||
echo "module ${job}_test(a, b, y1, y2);"
|
||||
sed -r '/^(input|output) / !d; /output/ { s/ y;/ y1;/; p; }; s/ y1;/ y2;/;' rtl.v
|
||||
echo "${job}_1 uut1 (.a(a), .b(b), .y(y1));"
|
||||
echo "${job}_2 uut2 (.a(a), .b(b), .y(y2));"
|
||||
echo "endmodule"
|
||||
} > test.v
|
||||
|
||||
echo -n > fail_patterns.txt
|
||||
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
for q in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
if test -f result.${q}.${p}.txt; then
|
||||
cp result.${q}.${p}.txt result.${p}.${q}.txt
|
||||
continue
|
||||
fi
|
||||
|
||||
{
|
||||
echo "read_verilog -DGLBL $p.v"
|
||||
echo "rename $job ${job}_1"
|
||||
|
||||
echo "read_verilog -DGLBL $q.v"
|
||||
echo "rename $job ${job}_2"
|
||||
|
||||
echo "read_verilog cells.v test.v"
|
||||
echo "hierarchy -top ${job}_test"
|
||||
echo "proc; opt; flatten ${job}_test"
|
||||
echo "hierarchy -check -top ${job}_test"
|
||||
|
||||
echo "! touch test.$p.$q.input_ok"
|
||||
echo "sat -timeout 10 -verify-no-timeout -show a,b,y1,y2 -prove y1 y2 ${job}_test"
|
||||
} > test.$p.$q.ys
|
||||
|
||||
if yosys -l test.$p.$q.log test.$p.$q.ys; then
|
||||
if grep TIMEOUT test.$p.$q.log; then
|
||||
echo TIMEOUT > result.${p}.${q}.txt
|
||||
else
|
||||
echo PASS > result.${p}.${q}.txt
|
||||
fi
|
||||
else
|
||||
echo $( grep '^ *\\[ab] ' test.$p.$q.log | gawk '{ print $4; }' | tr -d '\n' ) >> fail_patterns.txt
|
||||
echo FAIL > result.${p}.${q}.txt
|
||||
fi
|
||||
|
||||
# this fails if an error was encountered before the 'sat' command
|
||||
rm test.$p.$q.input_ok
|
||||
done; done
|
||||
|
||||
{
|
||||
echo "module testbench;"
|
||||
|
||||
sed -r '/^input / !d; s/^input/reg/;' rtl.v
|
||||
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
sed -r "/^output / !d; s/^output/wire/; s/ y;/ ${p}_y;/;" rtl.v
|
||||
echo "${job}_${p} uut_${p} (.a(a), .b(b), .y(${p}_y));"
|
||||
done
|
||||
|
||||
echo "initial begin"
|
||||
extra_patterns=""
|
||||
bits=$( echo $( grep '^input' rtl.v | cut -f2 -d'[' | cut -f1 -d: | tr '\n' '+' )2 | bc; )
|
||||
for x in 1 2 3 4 5 6 7 8 9 0; do
|
||||
extra_patterns="$extra_patterns $( echo $job$x | sha1sum | gawk "{ print \"160'h\" \$1; }" )"
|
||||
done
|
||||
for pattern in $bits\'b0 ~$bits\'b0 $( sed "s/^/$bits'b/;" < fail_patterns.txt ) $extra_patterns; do
|
||||
echo " { a, b } <= $pattern; #1;"
|
||||
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
echo " \$display(\"++RPT++ %b $p\", ${p}_y);"
|
||||
done
|
||||
echo " \$display(\"++RPT++ ----\");"
|
||||
done
|
||||
echo "end"
|
||||
|
||||
echo "endmodule"
|
||||
|
||||
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
sed "s/^module ${job}/module ${job}_${p}/; /^\`timescale/ d;" < $p.v
|
||||
done
|
||||
|
||||
cat cells.v
|
||||
} > testbench.v
|
||||
|
||||
/opt/altera/13.0/modelsim_ase/bin/vlib work
|
||||
/opt/altera/13.0/modelsim_ase/bin/vlog testbench.v
|
||||
/opt/altera/13.0/modelsim_ase/bin/vsim -c -do "run; exit" work.testbench | tee sim_modelsim.log
|
||||
|
||||
. /opt/Xilinx/14.5/ISE_DS/settings64.sh
|
||||
vlogcomp testbench.v
|
||||
fuse -o testbench testbench
|
||||
{ echo "run all"; echo "exit"; } > run-all.tcl
|
||||
./testbench -tclbatch run-all.tcl | tee sim_isim.log
|
||||
|
||||
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
for q in isim modelsim; do
|
||||
echo $( grep '++RPT++' sim_$q.log | sed 's,.*++RPT++ ,,' | grep " $p\$" | gawk '{ print $1; }' | md5sum | gawk '{ print $1; }' ) > result.${p}.${q}.txt
|
||||
done; done
|
||||
|
||||
echo "#00ff00" > color_PASS.txt
|
||||
echo "#ff0000" > color_FAIL.txt
|
||||
|
||||
if cmp result.rtl.isim.txt result.rtl.modelsim.txt; then
|
||||
echo "#00ff00" > color_$( cat result.rtl.isim.txt ).txt
|
||||
else
|
||||
echo "#00ff00" > color_NO_SIM_COMMON.txt
|
||||
fi
|
||||
|
||||
{
|
||||
echo "<h3>Hammer Report: $job</h3>"
|
||||
echo "<table border>"
|
||||
echo "<tr><th width=\"100\"></th>"
|
||||
for q in syn_vivado syn_quartus syn_xst syn_yosys rtl isim modelsim; do
|
||||
echo "<th width=\"100\">$q</th>"
|
||||
done
|
||||
echo "</tr>"
|
||||
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
|
||||
echo "<tr><th>$p</th>"
|
||||
for q in syn_vivado syn_quartus syn_xst syn_yosys rtl isim modelsim; do
|
||||
read result < result.${p}.${q}.txt
|
||||
if ! test -f color_$result.txt; then
|
||||
case $( ls color_*.txt | wc -l ) in
|
||||
3) echo "#ffff00" > color_$result.txt ;;
|
||||
4) echo "#ff00ff" > color_$result.txt ;;
|
||||
5) echo "#00ffff" > color_$result.txt ;;
|
||||
*) echo "#888888" > color_$result.txt ;;
|
||||
esac
|
||||
fi
|
||||
echo "<td align=\"center\" bgcolor=\"$( cat color_$result.txt )\">$( echo $result | cut -c1-8 )</td>"
|
||||
done
|
||||
echo "</tr>"
|
||||
done
|
||||
echo "<tr><td colspan=\"8\"><pre>$( perl -pe 's/([<>&])/"&#".ord($1).";"/eg;' rtl.v |
|
||||
perl -pe 's!([^\w#]|^)(\w+)\b!$x = $1; $y = $2; sprintf("%s<span style=\"color: %s;\">%s</span>", $x, $y =~ /module|input|wire|output|assign|signed|endmodule/ ? "#008800;" : "#000088;", $y)!eg' )</pre></td></tr>"
|
||||
#perl -pe 's,\b(module|input|wire|output|assign|signed|endmodule)\b,<span style="color: #008800;">$1</span>,g' )</pre></td></tr>"
|
||||
echo "</table>"
|
||||
} > ../../report/$job.html
|
||||
|
||||
sync
|
||||
echo READY.
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
use_vivado=false
|
||||
use_quartus=false
|
||||
checkdir="check"
|
||||
|
||||
if [ "$1" = "-vivado" ]; then
|
||||
use_vivado=true
|
||||
checkdir="check_vivado"
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ "$1" = "-quartus" ]; then
|
||||
use_quartus=true
|
||||
checkdir="check_quartus"
|
||||
shift
|
||||
fi
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <job_id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
job="$1"
|
||||
set --
|
||||
|
||||
set -e
|
||||
mkdir -p $checkdir check_temp/$job
|
||||
cd check_temp/$job
|
||||
|
||||
{
|
||||
echo "module ${job}_top(a, b, y_rtl, y_syn);"
|
||||
sed -r '/^(input|output) / !d; /output/ { s/ y;/ y_rtl;/; p; }; s/ y_rtl;/ y_syn;/;' ../../rtl/$job.v
|
||||
echo "${job}_rtl rtl_variant (.a(a), .b(b), .y(y_rtl));"
|
||||
echo "${job}_syn syn_variant (.a(a), .b(b), .y(y_syn));"
|
||||
echo "endmodule"
|
||||
} > ${job}_top.v
|
||||
|
||||
for mode in nomap techmap; do
|
||||
{
|
||||
if $use_quartus; then
|
||||
echo "read_verilog ../../quartus/$job.v"
|
||||
elif $use_vivado; then
|
||||
echo "read_verilog ../../vivado/$job.v"
|
||||
else
|
||||
echo "read_verilog -DGLBL ../../xst/$job.v"
|
||||
fi
|
||||
echo "rename $job ${job}_syn"
|
||||
|
||||
echo "read_verilog ../../rtl/$job.v"
|
||||
echo "rename $job ${job}_rtl"
|
||||
if [ $mode = techmap ]; then
|
||||
echo "techmap ${job}_rtl"
|
||||
fi
|
||||
|
||||
echo "read_verilog ${job}_top.v"
|
||||
if $use_quartus; then
|
||||
echo "read_verilog ../../cy_cells.v"
|
||||
else
|
||||
echo "read_verilog ../../xl_cells.v"
|
||||
fi
|
||||
|
||||
echo "hierarchy -top ${job}_top"
|
||||
echo "proc"
|
||||
|
||||
echo "flatten ${job}_syn"
|
||||
echo "flatten ${job}_rtl"
|
||||
echo "flatten ${job}_top"
|
||||
echo "opt_clean"
|
||||
|
||||
echo "rename ${job}_syn ${job}_syn_${mode}"
|
||||
echo "rename ${job}_rtl ${job}_rtl_${mode}"
|
||||
echo "rename ${job}_top ${job}_top_${mode}"
|
||||
echo "dump -outfile ${job}_top_${mode}.il ${job}_syn_${mode} ${job}_rtl_${mode} ${job}_top_${mode}"
|
||||
} > ${job}_top_${mode}.ys
|
||||
../../../../yosys -q ${job}_top_${mode}.ys
|
||||
done
|
||||
|
||||
{
|
||||
echo "read_ilang ${job}_top_nomap.il"
|
||||
echo "read_ilang ${job}_top_techmap.il"
|
||||
echo "sat -timeout 60 -verify-no-timeout -show a,b,y_rtl,y_syn -prove y_rtl y_syn ${job}_top_nomap"
|
||||
echo "sat -timeout 60 -verify-no-timeout -show a,b,y_rtl,y_syn -prove y_rtl y_syn ${job}_top_techmap"
|
||||
if [[ $job != expression_* ]] && ! $use_quartus && ! $use_vivado; then
|
||||
echo "eval -brute_force_equiv_checker ${job}_rtl_nomap ${job}_syn_nomap"
|
||||
echo "eval -brute_force_equiv_checker ${job}_rtl_techmap ${job}_syn_techmap"
|
||||
fi
|
||||
} > ${job}_cmp.ys
|
||||
|
||||
if ../../../../yosys -l ${job}.log ${job}_cmp.ys; then
|
||||
mv ${job}.log ../../$checkdir/${job}.log
|
||||
rm -f ../../$checkdir/${job}.err
|
||||
touch ../../$checkdir/${job}.log
|
||||
else
|
||||
mv ${job}.log ../../$checkdir/${job}.err
|
||||
rm -f ../../$checkdir/${job}.log
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <job_id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
job="$1"
|
||||
set --
|
||||
|
||||
set -e
|
||||
mkdir -p quartus quartus_temp/$job
|
||||
cd quartus_temp/$job
|
||||
|
||||
rm -rf *
|
||||
cp ../../rtl/$job.v .
|
||||
/opt/altera/13.0/quartus/bin/quartus_map $job --source=$job.v --family="Cyclone III"
|
||||
/opt/altera/13.0/quartus/bin/quartus_fit $job
|
||||
/opt/altera/13.0/quartus/bin/quartus_eda $job --formal_verification --tool=conformal
|
||||
cp -v fv/conformal/$job.vo ../../quartus/$job.v
|
||||
|
||||
sync
|
||||
exit 0
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <job_id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
job="$1"
|
||||
set --
|
||||
|
||||
set -e
|
||||
mkdir -p vivado vivado_temp/$job
|
||||
cd vivado_temp/$job
|
||||
|
||||
sed 's/^module/(* use_dsp48="no" *) module/;' < ../../rtl/$job.v > rtl.v
|
||||
cat > $job.tcl <<- EOT
|
||||
read_verilog rtl.v
|
||||
synth_design -part xc7k70t -top $job
|
||||
write_verilog -force ../../vivado/$job.v
|
||||
EOT
|
||||
|
||||
/opt/Xilinx/Vivado/2013.2/bin/vivado -mode batch -source $job.tcl
|
||||
|
||||
sync
|
||||
exit 0
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <job_id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
job="$1"
|
||||
set --
|
||||
|
||||
set -e
|
||||
mkdir -p xst xst_temp/$job
|
||||
cd xst_temp/$job
|
||||
|
||||
cat > $job.xst <<- EOT
|
||||
run
|
||||
-ifn $job.prj -ofn $job -p artix7 -top $job
|
||||
-iobuf NO -ram_extract NO -rom_extract NO -use_dsp48 NO
|
||||
-fsm_extract YES -fsm_encoding Auto
|
||||
EOT
|
||||
|
||||
cat > $job.prj <<- EOT
|
||||
verilog work "../../rtl/$job.v"
|
||||
EOT
|
||||
|
||||
. /opt/Xilinx/14.5/ISE_DS/settings64.sh
|
||||
|
||||
xst -ifn $job.xst
|
||||
netgen -w -ofmt verilog $job.ngc $job
|
||||
cp $job.v ../../xst/$job.v
|
||||
|
||||
sync
|
||||
exit 0
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
|
||||
module IBUF(O, I);
|
||||
output O;
|
||||
input I;
|
||||
assign O = I;
|
||||
endmodule
|
||||
|
||||
module OBUF(O, I);
|
||||
output O;
|
||||
input I;
|
||||
assign O = I;
|
||||
endmodule
|
||||
|
||||
module GND(G);
|
||||
output G;
|
||||
assign G = 0;
|
||||
endmodule
|
||||
|
||||
module INV(O, I);
|
||||
input I;
|
||||
output O;
|
||||
assign O = !I;
|
||||
endmodule
|
||||
|
||||
module LUT1(O, I0);
|
||||
parameter INIT = 0;
|
||||
input I0;
|
||||
wire [1:0] lutdata = INIT;
|
||||
wire [0:0] idx = { I0 };
|
||||
output O;
|
||||
assign O = lutdata[idx];
|
||||
endmodule
|
||||
|
||||
module LUT2(O, I0, I1);
|
||||
parameter INIT = 0;
|
||||
input I0, I1;
|
||||
wire [3:0] lutdata = INIT;
|
||||
wire [1:0] idx = { I1, I0 };
|
||||
output O;
|
||||
assign O = lutdata[idx];
|
||||
endmodule
|
||||
|
||||
module LUT3(O, I0, I1, I2);
|
||||
parameter INIT = 0;
|
||||
input I0, I1, I2;
|
||||
wire [7:0] lutdata = INIT;
|
||||
wire [2:0] idx = { I2, I1, I0 };
|
||||
output O;
|
||||
assign O = lutdata[idx];
|
||||
endmodule
|
||||
|
||||
module LUT4(O, I0, I1, I2, I3);
|
||||
parameter INIT = 0;
|
||||
input I0, I1, I2, I3;
|
||||
wire [15:0] lutdata = INIT;
|
||||
wire [3:0] idx = { I3, I2, I1, I0 };
|
||||
output O;
|
||||
assign O = lutdata[idx];
|
||||
endmodule
|
||||
|
||||
module LUT5(O, I0, I1, I2, I3, I4);
|
||||
parameter INIT = 0;
|
||||
input I0, I1, I2, I3, I4;
|
||||
wire [31:0] lutdata = INIT;
|
||||
wire [4:0] idx = { I4, I3, I2, I1, I0 };
|
||||
output O;
|
||||
assign O = lutdata[idx];
|
||||
endmodule
|
||||
|
||||
module LUT6(O, I0, I1, I2, I3, I4, I5);
|
||||
parameter INIT = 0;
|
||||
input I0, I1, I2, I3, I4, I5;
|
||||
wire [63:0] lutdata = INIT;
|
||||
wire [5:0] idx = { I5, I4, I3, I2, I1, I0 };
|
||||
output O;
|
||||
assign O = lutdata[idx];
|
||||
endmodule
|
||||
|
||||
module MUXCY(O, CI, DI, S);
|
||||
input CI, DI, S;
|
||||
output O;
|
||||
assign O = S ? CI : DI;
|
||||
endmodule
|
||||
|
||||
module MUXF7(O, I0, I1, S);
|
||||
input I0, I1, S;
|
||||
output O;
|
||||
assign O = S ? I1 : I0;
|
||||
endmodule
|
||||
|
||||
module MUXF8(O, I0, I1, S);
|
||||
input I0, I1, S;
|
||||
output O;
|
||||
assign O = S ? I1 : I0;
|
||||
endmodule
|
||||
|
||||
module VCC(P);
|
||||
output P;
|
||||
assign P = 1;
|
||||
endmodule
|
||||
|
||||
module XORCY(O, CI, LI);
|
||||
input CI, LI;
|
||||
output O;
|
||||
assign O = CI ^ LI;
|
||||
endmodule
|
||||
|
||||
module CARRY4(CO, O, CI, CYINIT, DI, S);
|
||||
output [3:0] CO, O;
|
||||
input CI, CYINIT;
|
||||
input [3:0] DI, S;
|
||||
wire ci_or_cyinit;
|
||||
assign O = S ^ {CO[2:0], ci_or_cyinit};
|
||||
assign CO[0] = S[0] ? ci_or_cyinit : DI[0];
|
||||
assign CO[1] = S[1] ? CO[0] : DI[1];
|
||||
assign CO[2] = S[2] ? CO[1] : DI[2];
|
||||
assign CO[3] = S[3] ? CO[2] : DI[3];
|
||||
assign ci_or_cyinit = CI | CYINIT;
|
||||
endmodule
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
|
||||
module TB_GND(ok);
|
||||
wire MY_G, XL_G;
|
||||
MY_GND MY(.G(MY_G));
|
||||
XL_GND XL(.G(XL_G));
|
||||
output ok = MY_G == XL_G;
|
||||
endmodule
|
||||
|
||||
module TB_INV(ok, I);
|
||||
input I;
|
||||
wire MY_O, XL_O;
|
||||
MY_INV MY(.O(MY_O), .I(I));
|
||||
XL_INV XL(.O(XL_O), .I(I));
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_LUT1(ok, I0);
|
||||
input I0;
|
||||
wire [1:0] MY_O, XL_O;
|
||||
genvar i;
|
||||
generate for (i=0; i<2; i=i+1) begin:V
|
||||
MY_LUT1 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0));
|
||||
XL_LUT1 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0));
|
||||
end endgenerate
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_LUT2(ok, I0, I1);
|
||||
input I0, I1;
|
||||
wire [3:0] MY_O, XL_O;
|
||||
genvar i;
|
||||
generate for (i=0; i<4; i=i+1) begin:V
|
||||
MY_LUT2 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1));
|
||||
XL_LUT2 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1));
|
||||
end endgenerate
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_LUT3(ok, I0, I1, I2);
|
||||
input I0, I1, I2;
|
||||
wire [7:0] MY_O, XL_O;
|
||||
genvar i;
|
||||
generate for (i=0; i<8; i=i+1) begin:V
|
||||
MY_LUT3 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2));
|
||||
XL_LUT3 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2));
|
||||
end endgenerate
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_LUT4(ok, I0, I1, I2, I3);
|
||||
input I0, I1, I2, I3;
|
||||
wire [15:0] MY_O, XL_O;
|
||||
genvar i;
|
||||
generate for (i=0; i<16; i=i+1) begin:V
|
||||
MY_LUT4 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3));
|
||||
XL_LUT4 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3));
|
||||
end endgenerate
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_LUT5(ok, I0, I1, I2, I3, I4);
|
||||
input I0, I1, I2, I3, I4;
|
||||
wire [31:0] MY_O, XL_O;
|
||||
genvar i;
|
||||
generate for (i=0; i<32; i=i+1) begin:V
|
||||
MY_LUT5 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4));
|
||||
XL_LUT5 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4));
|
||||
end endgenerate
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_LUT6(ok, I0, I1, I2, I3, I4, I5);
|
||||
input I0, I1, I2, I3, I4, I5;
|
||||
wire [63:0] MY_O, XL_O;
|
||||
genvar i;
|
||||
generate for (i=0; i<64; i=i+1) begin:V
|
||||
MY_LUT6 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4), .I5(I5));
|
||||
XL_LUT6 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4), .I5(I5));
|
||||
end endgenerate
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_MUXCY(ok, CI, DI, S);
|
||||
input CI, DI, S;
|
||||
wire MY_O, XL_O;
|
||||
MY_MUXCY MY(.O(MY_O), .CI(CI), .DI(DI), .S(S));
|
||||
XL_MUXCY XL(.O(XL_O), .CI(CI), .DI(DI), .S(S));
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_MUXF7(ok, I0, I1, S);
|
||||
input I0, I1, S;
|
||||
wire MY_O, XL_O;
|
||||
MY_MUXF7 MY(.O(MY_O), .I0(I0), .I1(I1), .S(S));
|
||||
XL_MUXF7 XL(.O(XL_O), .I0(I0), .I1(I1), .S(S));
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
||||
module TB_VCC(ok);
|
||||
wire MY_P, XL_P;
|
||||
MY_VCC MY(.P(MY_P));
|
||||
XL_VCC XL(.P(XL_P));
|
||||
output ok = MY_P == XL_P;
|
||||
endmodule
|
||||
|
||||
module TB_XORCY(ok, CI, LI);
|
||||
input CI, LI;
|
||||
wire MY_O, XL_O;
|
||||
MY_XORCY MY(.O(MY_O), .CI(CI), .LI(LI));
|
||||
XL_XORCY XL(.O(XL_O), .CI(CI), .LI(LI));
|
||||
output ok = MY_O == XL_O;
|
||||
endmodule
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
|
||||
# Verify xilinx cell models
|
||||
|
||||
read_verilog xl_cells.v
|
||||
read_verilog xl_cells_tb.v
|
||||
|
||||
rename GND MY_GND
|
||||
rename INV MY_INV
|
||||
rename LUT1 MY_LUT1
|
||||
rename LUT2 MY_LUT2
|
||||
rename LUT3 MY_LUT3
|
||||
rename LUT4 MY_LUT4
|
||||
rename LUT5 MY_LUT5
|
||||
rename LUT6 MY_LUT6
|
||||
rename MUXCY MY_MUXCY
|
||||
rename MUXF7 MY_MUXF7
|
||||
rename VCC MY_VCC
|
||||
rename XORCY MY_XORCY
|
||||
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/GND.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/INV.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT1.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT2.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT3.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT4.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT5.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT6.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/MUXCY.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/MUXF7.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/VCC.v
|
||||
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/XORCY.v
|
||||
|
||||
rename GND XL_GND
|
||||
rename INV XL_INV
|
||||
rename LUT1 XL_LUT1
|
||||
rename LUT2 XL_LUT2
|
||||
rename LUT3 XL_LUT3
|
||||
rename LUT4 XL_LUT4
|
||||
rename LUT5 XL_LUT5
|
||||
rename LUT6 XL_LUT6
|
||||
rename MUXCY XL_MUXCY
|
||||
rename MUXF7 XL_MUXF7
|
||||
rename VCC XL_VCC
|
||||
rename XORCY XL_XORCY
|
||||
|
||||
hierarchy
|
||||
proc
|
||||
flatten TB_*
|
||||
opt_clean
|
||||
|
||||
sat -verify -prove ok 1'b1 TB_GND
|
||||
sat -verify -prove ok 1'b1 TB_INV
|
||||
sat -verify -prove ok 1'b1 TB_LUT1
|
||||
sat -verify -prove ok 1'b1 TB_LUT2
|
||||
sat -verify -prove ok 1'b1 TB_LUT3
|
||||
sat -verify -prove ok 1'b1 TB_LUT4
|
||||
sat -verify -prove ok 1'b1 TB_LUT5
|
||||
sat -verify -prove ok 1'b1 TB_LUT6
|
||||
sat -verify -prove ok 1'b1 TB_MUXCY
|
||||
sat -verify -prove ok 1'b1 TB_MUXF7
|
||||
sat -verify -prove ok 1'b1 TB_VCC
|
||||
sat -verify -prove ok 1'b1 TB_XORCY
|
||||
|
Loading…
Reference in New Issue