diff options
Diffstat (limited to 'techlibs')
-rw-r--r-- | techlibs/intel_alm/common/dff_sim.v | 4 | ||||
-rw-r--r-- | techlibs/intel_alm/common/megafunction_bb.v | 35 | ||||
-rw-r--r-- | techlibs/intel_alm/common/mem_sim.v | 6 | ||||
-rw-r--r-- | techlibs/intel_alm/common/misc_sim.v | 9 | ||||
-rw-r--r-- | techlibs/intel_alm/common/quartus_rename.v | 16 | ||||
-rw-r--r-- | techlibs/intel_alm/synth_intel_alm.cc | 12 |
6 files changed, 78 insertions, 4 deletions
diff --git a/techlibs/intel_alm/common/dff_sim.v b/techlibs/intel_alm/common/dff_sim.v index d2cff0adb..6bee994be 100644 --- a/techlibs/intel_alm/common/dff_sim.v +++ b/techlibs/intel_alm/common/dff_sim.v @@ -56,7 +56,9 @@ (* abc9_box, lib_whitebox *) module MISTRAL_FF( - input DATAIN, CLK, ACLR, ENA, SCLR, SLOAD, SDATA, + input DATAIN, + (* clkbuf_sink *) input CLK, + input ACLR, ENA, SCLR, SLOAD, SDATA, output reg Q ); diff --git a/techlibs/intel_alm/common/megafunction_bb.v b/techlibs/intel_alm/common/megafunction_bb.v index aabcd4539..414d1c941 100644 --- a/techlibs/intel_alm/common/megafunction_bb.v +++ b/techlibs/intel_alm/common/megafunction_bb.v @@ -662,3 +662,38 @@ input [15:0] parallelterminationcontrol; (* iopad_external_pin *) output obar; endmodule + +(* blackbox *) +module cyclonev_clkena(inclk, ena, enaout, outclk); + +parameter clock_type = "auto"; +parameter ena_register_mode = "always enabled"; +parameter lpm_type = "cyclonev_clkena"; +parameter ena_register_power_up = "high"; +parameter disable_mode = "low"; +parameter test_syn = "high"; + +input inclk; +input ena; +output enaout; +output outclk; + +endmodule + +(* blackbox *) +module cyclone10gx_clkena(inclk, ena, enaout, outclk); + +parameter clock_type = "auto"; +parameter ena_register_mode = "always enabled"; +parameter lpm_type = "cyclone10gx_clkena"; +parameter ena_register_power_up = "high"; +parameter disable_mode = "low"; +parameter test_syn = "high"; + +input inclk; +input ena; +output enaout; +output outclk; + +endmodule + diff --git a/techlibs/intel_alm/common/mem_sim.v b/techlibs/intel_alm/common/mem_sim.v index e09aafaa2..dbdf69839 100644 --- a/techlibs/intel_alm/common/mem_sim.v +++ b/techlibs/intel_alm/common/mem_sim.v @@ -50,7 +50,9 @@ // model can be treated as always returning a defined result. (* abc9_box, lib_whitebox *) -module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1ADDR, output B1DATA); +module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, + (* clkbuf_sink *) input CLK1, + input [4:0] B1ADDR, output B1DATA); reg [31:0] mem = 32'b0; @@ -83,7 +85,7 @@ module MISTRAL_M10K(CLK1, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); parameter CFG_ABITS = 10; parameter CFG_DBITS = 10; -input CLK1; +(* clkbuf_sink *) input CLK1; input [CFG_ABITS-1:0] A1ADDR, B1ADDR; input [CFG_DBITS-1:0] A1DATA; input A1EN, B1EN; diff --git a/techlibs/intel_alm/common/misc_sim.v b/techlibs/intel_alm/common/misc_sim.v index e9494a8ee..b1f970a21 100644 --- a/techlibs/intel_alm/common/misc_sim.v +++ b/techlibs/intel_alm/common/misc_sim.v @@ -10,3 +10,12 @@ module MISTRAL_IO((* iopad_external_pin *) inout PAD, input I, input OE, output assign PAD = OE ? I : 1'bz; assign O = PAD; endmodule + +// Eventually, we should support clock enables and model them here too. +// For now, CLKENA is used as a basic entry point to global routing. +module MISTRAL_CLKBUF ( + input A, + (* clkbuf_driver *) output Q +); + assign Q = A; +endmodule
\ No newline at end of file diff --git a/techlibs/intel_alm/common/quartus_rename.v b/techlibs/intel_alm/common/quartus_rename.v index 964a094dd..57321de77 100644 --- a/techlibs/intel_alm/common/quartus_rename.v +++ b/techlibs/intel_alm/common/quartus_rename.v @@ -4,6 +4,7 @@ `define MLAB cyclonev_mlab_cell `define IBUF cyclonev_io_ibuf `define OBUF cyclonev_io_obuf +`define CLKENA cyclonev_clkena `endif `ifdef cyclone10gx `define LCELL cyclone10gx_lcell_comb @@ -11,6 +12,7 @@ `define MLAB cyclone10gx_mlab_cell `define IBUF cyclone10gx_io_ibuf `define OBUF cyclone10gx_io_obuf +`define CLKENA cyclone10gx_clkena `endif module __MISTRAL_VCC(output Q); @@ -277,3 +279,17 @@ module MISTRAL_IO(output PAD, input I, OE, output O); .oe(OE) ); endmodule + +module MISTRAL_CLKBUF (input A, output Q); +`CLKENA #( + .clock_type("auto"), + .ena_register_mode("always enabled"), + .ena_register_power_up("high"), + .disable_mode("low"), + .test_syn("high") +) _TECHMAP_REPLACE_ ( + .inclk(A), + .ena(1'b1), + .outclk(Q) +); +endmodule diff --git a/techlibs/intel_alm/synth_intel_alm.cc b/techlibs/intel_alm/synth_intel_alm.cc index 7c9e3d117..d0e84aabd 100644 --- a/techlibs/intel_alm/synth_intel_alm.cc +++ b/techlibs/intel_alm/synth_intel_alm.cc @@ -75,13 +75,16 @@ struct SynthIntelALMPass : public ScriptPass { log(" -noiopad\n"); log(" do not instantiate IO buffers\n"); log("\n"); + log(" -noclkbuf\n"); + log(" do not insert global clock buffers\n"); + log("\n"); log("The following commands are executed by this synthesis command:\n"); help_script(); log("\n"); } string top_opt, family_opt, bram_type, vout_file; - bool flatten, quartus, nolutram, nobram, dff, nodsp, noiopad; + bool flatten, quartus, nolutram, nobram, dff, nodsp, noiopad, noclkbuf; void clear_flags() override { @@ -96,6 +99,7 @@ struct SynthIntelALMPass : public ScriptPass { dff = false; nodsp = false; noiopad = false; + noclkbuf = false; } void execute(std::vector<std::string> args, RTLIL::Design *design) override @@ -154,6 +158,10 @@ struct SynthIntelALMPass : public ScriptPass { noiopad = true; continue; } + if (args[argidx] == "-noclkbuf") { + noclkbuf = true; + continue; + } break; } extra_args(args, argidx, design); @@ -268,6 +276,8 @@ struct SynthIntelALMPass : public ScriptPass { run("techmap -map +/intel_alm/common/dff_map.v"); run("opt -full -undriven -mux_undef"); run("clean -purge"); + if (!noclkbuf) + run("clkbufmap -buf MISTRAL_CLKBUF Q:A", "(unless -noclkbuf)"); } if (check_label("map_luts")) { |