mirror of https://github.com/YosysHQ/yosys.git
Merge branch 'master' of github.com:YosysHQ/yosys
This commit is contained in:
commit
a02d1720a7
|
@ -0,0 +1,8 @@
|
||||||
|
A simple example design, based on the Numato Labs Mimas V2 board
|
||||||
|
================================================================
|
||||||
|
|
||||||
|
This example uses Yosys for synthesis and Xilinx ISE
|
||||||
|
for place&route and bit-stream creation.
|
||||||
|
|
||||||
|
To synthesize:
|
||||||
|
bash run.sh
|
|
@ -0,0 +1,13 @@
|
||||||
|
CONFIG VCCAUX = "3.3" ;
|
||||||
|
|
||||||
|
|
||||||
|
NET "CLK" LOC = D9 | IOSTANDARD = LVCMOS33 | PERIOD = 12MHz ;
|
||||||
|
|
||||||
|
NET "LED[7]" LOC = P15 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[6]" LOC = P16 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[5]" LOC = N15 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[4]" LOC = N16 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[3]" LOC = U17 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[2]" LOC = U18 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[1]" LOC = T17 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[0]" LOC = T18 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
|
@ -0,0 +1,14 @@
|
||||||
|
module example(
|
||||||
|
input wire CLK,
|
||||||
|
output wire [7:0] LED
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [27:0] ctr;
|
||||||
|
initial ctr = 0;
|
||||||
|
|
||||||
|
always @(posedge CLK)
|
||||||
|
ctr <= ctr + 1;
|
||||||
|
|
||||||
|
assign LED = ctr[27:20];
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
yosys run_yosys.ys
|
||||||
|
edif2ngd example.edif
|
||||||
|
ngdbuild example -uc example.ucf -p xc6slx9csg324-3
|
||||||
|
map -w example
|
||||||
|
par -w example.ncd example_par.ncd
|
||||||
|
bitgen -w example_par.ncd -g StartupClk:JTAGClk
|
|
@ -0,0 +1,4 @@
|
||||||
|
read_verilog example.v
|
||||||
|
synth_xilinx -top example -family xc6s
|
||||||
|
iopadmap -bits -outpad OBUF I:O -inpad IBUF O:I
|
||||||
|
write_edif -pvector bra example.edif
|
|
@ -1551,7 +1551,9 @@ RTLIL::Module *AstModule::clone() const
|
||||||
new_mod->nomeminit = nomeminit;
|
new_mod->nomeminit = nomeminit;
|
||||||
new_mod->nomem2reg = nomem2reg;
|
new_mod->nomem2reg = nomem2reg;
|
||||||
new_mod->mem2reg = mem2reg;
|
new_mod->mem2reg = mem2reg;
|
||||||
|
new_mod->noblackbox = noblackbox;
|
||||||
new_mod->lib = lib;
|
new_mod->lib = lib;
|
||||||
|
new_mod->nowb = nowb;
|
||||||
new_mod->noopt = noopt;
|
new_mod->noopt = noopt;
|
||||||
new_mod->icells = icells;
|
new_mod->icells = icells;
|
||||||
new_mod->pwires = pwires;
|
new_mod->pwires = pwires;
|
||||||
|
|
|
@ -420,8 +420,12 @@ namespace RTLIL
|
||||||
// It maintains a reference counter that is used to make sure that the container is not modified while being iterated over.
|
// It maintains a reference counter that is used to make sure that the container is not modified while being iterated over.
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct ObjIterator
|
struct ObjIterator {
|
||||||
{
|
using iterator_category = std::forward_iterator_tag;
|
||||||
|
using value_type = T;
|
||||||
|
using difference_type = ptrdiff_t;
|
||||||
|
using pointer = T*;
|
||||||
|
using reference = T&;
|
||||||
typename dict<RTLIL::IdString, T>::iterator it;
|
typename dict<RTLIL::IdString, T>::iterator it;
|
||||||
dict<RTLIL::IdString, T> *list_p;
|
dict<RTLIL::IdString, T> *list_p;
|
||||||
int *refcount_p;
|
int *refcount_p;
|
||||||
|
@ -474,13 +478,25 @@ namespace RTLIL
|
||||||
return it != other.it;
|
return it != other.it;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void operator++() {
|
|
||||||
|
inline bool operator==(const RTLIL::ObjIterator<T> &other) const {
|
||||||
|
return !(*this != other);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ObjIterator<T>& operator++() {
|
||||||
log_assert(list_p != nullptr);
|
log_assert(list_p != nullptr);
|
||||||
if (++it == list_p->end()) {
|
if (++it == list_p->end()) {
|
||||||
(*refcount_p)--;
|
(*refcount_p)--;
|
||||||
list_p = nullptr;
|
list_p = nullptr;
|
||||||
refcount_p = nullptr;
|
refcount_p = nullptr;
|
||||||
}
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const ObjIterator<T> operator++(int) {
|
||||||
|
ObjIterator<T> result(*this);
|
||||||
|
++(*this);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
|
@ -223,6 +223,33 @@ struct statdata_t
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" Estimated number of LCs: %10d\n", lc_cnt);
|
log(" Estimated number of LCs: %10d\n", lc_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tech == "cmos")
|
||||||
|
{
|
||||||
|
int tran_cnt = 0;
|
||||||
|
bool tran_cnt_exact = true;
|
||||||
|
|
||||||
|
for (auto it : num_cells_by_type) {
|
||||||
|
auto ctype = it.first;
|
||||||
|
auto cnum = it.second;
|
||||||
|
|
||||||
|
if (ctype == "$_NOT_")
|
||||||
|
tran_cnt += 2*cnum;
|
||||||
|
else if (ctype.in("$_NAND_", "$_NOR_"))
|
||||||
|
tran_cnt += 4*cnum;
|
||||||
|
else if (ctype.in("$_AOI3_", "$_OAI3_"))
|
||||||
|
tran_cnt += 6*cnum;
|
||||||
|
else if (ctype.in("$_AOI4_", "$_OAI4_"))
|
||||||
|
tran_cnt += 8*cnum;
|
||||||
|
else if (ctype.in("$_DFF_P_", "$_DFF_N_"))
|
||||||
|
tran_cnt += 16*cnum;
|
||||||
|
else
|
||||||
|
tran_cnt_exact = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
log("\n");
|
||||||
|
log(" Estimated number of transistors: %10d%s\n", tran_cnt, tran_cnt_exact ? "" : "+");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -286,7 +313,7 @@ struct StatPass : public Pass {
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -tech <technology>\n");
|
log(" -tech <technology>\n");
|
||||||
log(" print area estemate for the specified technology. Currently supported\n");
|
log(" print area estemate for the specified technology. Currently supported\n");
|
||||||
log(" values for <technology>: xilinx\n");
|
log(" values for <technology>: xilinx, cmos\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -width\n");
|
log(" -width\n");
|
||||||
log(" annotate internal cell types with their word width.\n");
|
log(" annotate internal cell types with their word width.\n");
|
||||||
|
@ -330,7 +357,7 @@ struct StatPass : public Pass {
|
||||||
}
|
}
|
||||||
extra_args(args, argidx, design);
|
extra_args(args, argidx, design);
|
||||||
|
|
||||||
if (techname != "" && techname != "xilinx")
|
if (techname != "" && techname != "xilinx" && techname != "cmos")
|
||||||
log_cmd_error("Unsupported technology: '%s'\n", techname.c_str());
|
log_cmd_error("Unsupported technology: '%s'\n", techname.c_str());
|
||||||
|
|
||||||
for (auto mod : design->selected_modules())
|
for (auto mod : design->selected_modules())
|
||||||
|
|
|
@ -1363,13 +1363,13 @@ module SB_MAC16 (
|
||||||
wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
|
wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
|
||||||
wire [15:0] Ah, Al, Bh, Bl;
|
wire [15:0] Ah, Al, Bh, Bl;
|
||||||
assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
|
assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
|
||||||
assign Al = {A_SIGNED ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};
|
assign Al = {A_SIGNED && MODE_8x8 ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};
|
||||||
assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
|
assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
|
||||||
assign Bl = {B_SIGNED ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]};
|
assign Bl = {B_SIGNED && MODE_8x8 ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]};
|
||||||
assign p_Ah_Bh = Ah * Bh;
|
assign p_Ah_Bh = Ah * Bh; // F
|
||||||
assign p_Al_Bh = Al * Bh;
|
assign p_Al_Bh = {8'b0, Al[7:0]} * Bh; // J
|
||||||
assign p_Ah_Bl = Ah * Bl;
|
assign p_Ah_Bl = Ah * {8'b0, Bl[7:0]}; // K
|
||||||
assign p_Al_Bl = Al * Bl;
|
assign p_Al_Bl = Al * Bl; // G
|
||||||
|
|
||||||
// Regs F and J
|
// Regs F and J
|
||||||
reg [15:0] rF, rJ;
|
reg [15:0] rF, rJ;
|
||||||
|
@ -1400,7 +1400,9 @@ module SB_MAC16 (
|
||||||
assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;
|
assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;
|
||||||
|
|
||||||
// Adder Stage
|
// Adder Stage
|
||||||
assign iL = iG + (iK << 8) + (iJ << 8) + (iF << 16);
|
wire [23:0] iK_e = {A_SIGNED ? {8{iK[15]}} : 8'b0, iK};
|
||||||
|
wire [23:0] iJ_e = {B_SIGNED ? {8{iJ[15]}} : 8'b0, iJ};
|
||||||
|
assign iL = iG + (iK_e << 8) + (iJ_e << 8) + (iF << 16);
|
||||||
|
|
||||||
// Reg H
|
// Reg H
|
||||||
reg [31:0] rH;
|
reg [31:0] rH;
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -ex
|
set -ex
|
||||||
sed 's/SB_MAC16/SB_MAC16_UUT/; /SB_MAC16_UUT/,/endmodule/ p; d;' < ../cells_sim.v > test_dsp_model_uut.v
|
sed 's/SB_MAC16/SB_MAC16_UUT/; /SB_MAC16_UUT/,/endmodule/ p; d;' < ../cells_sim.v > test_dsp_model_uut.v
|
||||||
cat /opt/lscc/iCEcube2.2017.01/verilog/sb_ice_syn.v > test_dsp_model_ref.v
|
if [ ! -f "test_dsp_model_ref.v" ]; then
|
||||||
|
cat /opt/lscc/iCEcube2.2017.01/verilog/sb_ice_syn.v > test_dsp_model_ref.v
|
||||||
|
fi
|
||||||
for tb in testbench \
|
for tb in testbench \
|
||||||
testbench_comb_8x8_A testbench_comb_8x8_B testbench_comb_16x16 \
|
testbench_comb_8x8_A testbench_comb_8x8_B testbench_comb_16x16 \
|
||||||
testbench_seq_16x16_A testbench_seq_16x16_B
|
testbench_seq_16x16_A testbench_seq_16x16_B \
|
||||||
|
testbench_comb_8x8_A_signedA testbench_comb_8x8_A_signedB testbench_comb_8x8_A_signedAB \
|
||||||
|
testbench_comb_8x8_B_signedA testbench_comb_8x8_B_signedB testbench_comb_8x8_B_signedAB \
|
||||||
|
testbench_comb_16x16_signedA testbench_comb_16x16_signedB testbench_comb_16x16_signedAB
|
||||||
do
|
do
|
||||||
iverilog -s $tb -o test_dsp_model test_dsp_model.v test_dsp_model_uut.v test_dsp_model_ref.v
|
iverilog -s $tb -o test_dsp_model test_dsp_model.v test_dsp_model_uut.v test_dsp_model_ref.v
|
||||||
vvp -N ./test_dsp_model
|
vvp -N ./test_dsp_model
|
||||||
|
|
|
@ -241,6 +241,81 @@ module testbench_comb_8x8_A;
|
||||||
) testbench ();
|
) testbench ();
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_8x8_A_signedA;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (2), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (0), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (0), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (2), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (0), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (0), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (1),
|
||||||
|
.B_SIGNED (0)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_8x8_A_signedB;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (2), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (0), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (0), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (2), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (0), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (0), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (0),
|
||||||
|
.B_SIGNED (1)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_8x8_A_signedAB;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (2), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (0), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (0), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (2), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (0), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (0), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (1),
|
||||||
|
.B_SIGNED (1)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
module testbench_comb_8x8_B;
|
module testbench_comb_8x8_B;
|
||||||
testbench #(
|
testbench #(
|
||||||
.NEG_TRIGGER (0),
|
.NEG_TRIGGER (0),
|
||||||
|
@ -266,6 +341,81 @@ module testbench_comb_8x8_B;
|
||||||
) testbench ();
|
) testbench ();
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_8x8_B_signedA;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (0), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (1), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (1), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (0), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (1), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (1), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (1),
|
||||||
|
.B_SIGNED (0)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_8x8_B_signedB;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (0), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (1), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (1), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (0), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (1), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (1), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (0),
|
||||||
|
.B_SIGNED (1)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_8x8_B_signedAB;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (0), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (1), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (1), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (0), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (1), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (1), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (0), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (1),
|
||||||
|
.B_SIGNED (1)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
module testbench_comb_16x16;
|
module testbench_comb_16x16;
|
||||||
testbench #(
|
testbench #(
|
||||||
.NEG_TRIGGER (0),
|
.NEG_TRIGGER (0),
|
||||||
|
@ -291,6 +441,81 @@ module testbench_comb_16x16;
|
||||||
) testbench ();
|
) testbench ();
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_16x16_signedA;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (0), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (2), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (1), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (2), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (0), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (2), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (1), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (2), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (1),
|
||||||
|
.B_SIGNED (0)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_16x16_signedB;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (0), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (2), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (1), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (2), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (0), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (2), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (1), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (2), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (0),
|
||||||
|
.B_SIGNED (1)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module testbench_comb_16x16_signedAB;
|
||||||
|
testbench #(
|
||||||
|
.NEG_TRIGGER (0),
|
||||||
|
.C_REG (0),
|
||||||
|
.A_REG (0),
|
||||||
|
.B_REG (0),
|
||||||
|
.D_REG (0),
|
||||||
|
.TOP_8x8_MULT_REG (0),
|
||||||
|
.BOT_8x8_MULT_REG (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG1 (0),
|
||||||
|
.PIPELINE_16x16_MULT_REG2 (0),
|
||||||
|
.TOPOUTPUT_SELECT (0), // 0=P, 1=Q, 2=8x8, 3=16x16
|
||||||
|
.TOPADDSUB_LOWERINPUT (2), // 0=A, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.TOPADDSUB_UPPERINPUT (1), // 0=Q, 1=C
|
||||||
|
.TOPADDSUB_CARRYSELECT (2), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.BOTOUTPUT_SELECT (0), // 0=R, 1=S, 2=8x8, 3=16x16
|
||||||
|
.BOTADDSUB_LOWERINPUT (2), // 0=B, 1=8x8, 2=16x16, 3=S-EXT
|
||||||
|
.BOTADDSUB_UPPERINPUT (1), // 0=S, 1=D
|
||||||
|
.BOTADDSUB_CARRYSELECT (2), // 0=0, 1=1, 2=ACI, 3=CI
|
||||||
|
.MODE_8x8 (0),
|
||||||
|
.A_SIGNED (1),
|
||||||
|
.B_SIGNED (1)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
||||||
|
|
||||||
module testbench_seq_16x16_A;
|
module testbench_seq_16x16_A;
|
||||||
testbench #(
|
testbench #(
|
||||||
.NEG_TRIGGER (0),
|
.NEG_TRIGGER (0),
|
||||||
|
|
|
@ -3,8 +3,8 @@ OBJS += techlibs/intel/synth_intel.o
|
||||||
|
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/m9k_bb.v))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/m9k_bb.v))
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/altpll_bb.v))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/altpll_bb.v))
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams.txt))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams_m9k.txt))
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams_map.v))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams_map_m9k.v))
|
||||||
$(eval $(call add_share_file,share/intel/max10,techlibs/intel/max10/cells_sim.v))
|
$(eval $(call add_share_file,share/intel/max10,techlibs/intel/max10/cells_sim.v))
|
||||||
$(eval $(call add_share_file,share/intel/a10gx,techlibs/intel/a10gx/cells_sim.v))
|
$(eval $(call add_share_file,share/intel/a10gx,techlibs/intel/a10gx/cells_sim.v))
|
||||||
$(eval $(call add_share_file,share/intel/cyclonev,techlibs/intel/cyclonev/cells_sim.v))
|
$(eval $(call add_share_file,share/intel/cyclonev,techlibs/intel/cyclonev/cells_sim.v))
|
||||||
|
|
|
@ -61,8 +61,8 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
log(" from label is synonymous to 'begin', and empty to label is\n");
|
log(" from label is synonymous to 'begin', and empty to label is\n");
|
||||||
log(" synonymous to the end of the command list.\n");
|
log(" synonymous to the end of the command list.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -noiopads\n");
|
log(" -iopads\n");
|
||||||
log(" do not use IO pad cells in output netlist\n");
|
log(" use IO pad cells in output netlist\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -nobram\n");
|
log(" -nobram\n");
|
||||||
log(" do not use block RAM cells in output netlist\n");
|
log(" do not use block RAM cells in output netlist\n");
|
||||||
|
@ -79,7 +79,7 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
}
|
}
|
||||||
|
|
||||||
string top_opt, family_opt, vout_file, blif_file;
|
string top_opt, family_opt, vout_file, blif_file;
|
||||||
bool retime, flatten, nobram, noiopads;
|
bool retime, flatten, nobram, iopads;
|
||||||
|
|
||||||
void clear_flags() YS_OVERRIDE
|
void clear_flags() YS_OVERRIDE
|
||||||
{
|
{
|
||||||
|
@ -90,7 +90,7 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
retime = false;
|
retime = false;
|
||||||
flatten = true;
|
flatten = true;
|
||||||
nobram = false;
|
nobram = false;
|
||||||
noiopads = false;
|
iopads = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
|
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
|
||||||
|
@ -125,8 +125,8 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
run_to = args[argidx].substr(pos + 1);
|
run_to = args[argidx].substr(pos + 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (args[argidx] == "-noiopads") {
|
if (args[argidx] == "-iopads") {
|
||||||
noiopads = true;
|
iopads = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (args[argidx] == "-nobram") {
|
if (args[argidx] == "-nobram") {
|
||||||
|
@ -187,8 +187,15 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nobram && check_label("map_bram", "(skip if -nobram)")) {
|
if (!nobram && check_label("map_bram", "(skip if -nobram)")) {
|
||||||
run("memory_bram -rules +/intel/common/brams.txt");
|
if (family_opt == "cycloneiv" ||
|
||||||
run("techmap -map +/intel/common/brams_map.v");
|
family_opt == "cycloneive" ||
|
||||||
|
family_opt == "max10" ||
|
||||||
|
help_mode) {
|
||||||
|
run("memory_bram -rules +/intel/common/brams_m9k.txt", "(if applicable for family)");
|
||||||
|
run("techmap -map +/intel/common/brams_map_m9k.v", "(if applicable for family)");
|
||||||
|
} else {
|
||||||
|
log_warning("BRAM mapping is not currently supported for %s.\n", family_opt.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("map_ffram")) {
|
if (check_label("map_ffram")) {
|
||||||
|
@ -215,10 +222,9 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("map_cells")) {
|
if (check_label("map_cells")) {
|
||||||
if (!noiopads)
|
if (iopads || help_mode)
|
||||||
run("iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I", "(unless -noiopads)");
|
run("iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I", "(if -iopads)");
|
||||||
run(stringf("techmap -map +/intel/%s/cells_map.v", family_opt.c_str()));
|
run(stringf("techmap -map +/intel/%s/cells_map.v", family_opt.c_str()));
|
||||||
|
|
||||||
run("dffinit -highlow -ff dffeas q power_up");
|
run("dffinit -highlow -ff dffeas q power_up");
|
||||||
run("clean -purge");
|
run("clean -purge");
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,9 @@ module _90_dff_nn0_to_np0 (input D, C, R, output Q); \$_DFF_NP0_ _TECHMAP_REPLA
|
||||||
(* techmap_celltype = "$_DFF_PN0_" *)
|
(* techmap_celltype = "$_DFF_PN0_" *)
|
||||||
module _90_dff_pn0_to_pp0 (input D, C, R, output Q); \$_DFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_pn0_to_pp0 (input D, C, R, output Q); \$_DFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$_DFF_NN1_" *)
|
(* techmap_celltype = "$_DFF_NN1_" *)
|
||||||
module _90_dff_nn1_to_np1 (input D, C, R, output Q); \$_DFF_NP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_nn1_to_np1 (input D, C, R, output Q); \$_DFF_NP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$_DFF_PN1_" *)
|
(* techmap_celltype = "$_DFF_PN1_" *)
|
||||||
module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
|
||||||
module \$__SHREG_ (input C, input D, input E, output Q);
|
module \$__SHREG_ (input C, input D, input E, output Q);
|
||||||
parameter DEPTH = 0;
|
parameter DEPTH = 0;
|
||||||
|
|
Loading…
Reference in New Issue