Release notes
Release history and changelog for the tsfpga project.
We follow the semantic versioning scheme MAJOR.MINOR.PATCH:
MAJORis bumped when incompatible API changes are made.MINORis bumped when functionality is added in a backward-compatible manner.PATCHis bumped when backward-compatible bug fixes are made.
Unreleased (YYYY-MM-DD)
Changes since previous release
Breaking changes
Update/simplify
GitSimulationSubsetto use new test pattern feature in VUnit 6.0.0.Move project filtering from
BuildProjectListconstructor toget_build_project_list().
Requires VUnit version 5.0.0.dev6 or later.
13.3.0 (24 june 2025)
Changes since previous release
Added
Add support for NVC simulator in Vivado simulation libraries API.
13.2.3 (13 may 2025)
Changes since previous release
Fixes
Make parallel build runner work with VUnit version 5.0.0.dev6 also.
13.2.2 (2 may 2025)
Changes since previous release
Added
Add the
countargument toBaseModule.add_vunit_config().
Deprecated
Deprecate the
set_random_seedargument toBaseModule.add_vunit_config().
13.2.1 (29 april 2025)
Changes since previous release
Bump hdl-registers version requirement.
13.2.0 (14 march 2025)
Changes since previous release
Added
Add
prepend_file().
13.1.3 (11 march 2025)
Changes since previous release
Added
Add
used_in_synthesisandused_in_implementationarguments toConstraintconstructor. Deprecates theused_inargument.
13.1.2 (14 february 2025)
Changes since previous release
Fixes
Properly add loaded modules to
sys.modulesinload_python_module().
13.1.1 (12 february 2025)
Changes since previous release
Fixes
Performance improvements, typing fixes, and internal refactoring as suggested by
rufflinter.
13.1.0 (20 january 2025)
Changes since previous release
Added
GitSimulationSubsetnow detects files that depend on files that have been deleted.
Fixed
Capture Sphinx output during FPGA build to make STDOUT less messy.
13.0.1 (7 december 2024)
Changes since previous release
Fixes
Fix bug where re-compile of Vivado simulation libraries would fail with GHDL.
Other
Updates in example simulation script.
13.0.0 (14 october 2024)
Changes since previous release
Bug fixes
Adapt netlist build time reporting to work with VUnit > 4.7.0 also (#87).
Breaking changes
Remove
super().__init__(**kwargs)call fromBaseModule.__init__(). Users that depend on base class initialization must now make these calls explicitly. See #112 for background.
12.3.6 (27 august 2024)
Changes since previous release
Fixes
Update example scripts to utilize features in latest hdl-registers.
12.3.5 (9 july 2024)
Changes since previous release
Peg required VUnit version to <= 4.7.0 due to #87.
12.3.4 (9 july 2024)
Changes since previous release
Added
Abort Vivado build if synthesis or implementation CDC timing report contains any critical violation.
Find VHDL simulation subset that depends on generated register artifacts in
GitSimulationSubset.
Accidentally breaking change
Call
super().__init__(**kwargs)inBaseModule.__init__(). See #112.
12.3.3 (14 may 2024)
Changes since previous release
Added
Add
modules_folderargument toget_modules().
12.3.2 (29 april 2024)
Changes since previous release
Added
Add
to_binary_nibble_string(),to_hex_string(),to_hex_byte_string()functions. Renames internal functionto_binary_string()argumentint_valuetovalue.
Fixes
Improve Verilog and SystemVerilog support in Vivado project creation.
Fix
create_directory()behavior when path already exists as a file.Fix potential Vivado build crash when implementation explore is used.
Internal changes
Rework
HdlFiletype indication using enumerationHdlFile.Type.
12.3.1 (8 march 2024)
Changes since previous release
Fixes
Remove nonsense assertion in
path_relative_to().
12.3.0 (5 february 2024)
Changes since previous release
Added
Add support for generating VHDL simulation register field check package (
VhdlSimulationCheckPackageGenerator) fromhdl-registersbefore simulation and build. Requireshdl-registersversion 5.1.0 or greater.
12.2.1 (29 january 2024)
Changes since previous release
Update example simulation and FPGA build scripts.
12.2.0 (25 january 2024)
Changes since previous release
Added
Generate further register VHDL artifacts
record package (
VhdlRecordPackageGenerator),AXI-Lite register file wrapper (
VhdlAxiLiteWrapperGenerator),simulation read/write package (
VhdlSimulationReadWritePackageGenerator),simulation wait until package (
VhdlSimulationWaitUntilPackageGenerator)
from
hdl-registersbefore simulation and build. Requireshdl-registersversion 5.0.0 or greater.
12.1.2 (14 november 2023)
Changes since previous release
Fixes
Peg required
hdl-registersversion ahead of a major API change in that project.
12.1.0 (6 november 2023)
Changes since previous release
Added
Add support for parallel implementation explore runs.
Include bit file in generated Xilinx shell archive (.xsa) file.
Fixes
Fix Vivado simlib compilation on Windows.
Abort if creation of IP core simulation project fails.
12.0.4 (18 august 2023)
Changes since previous release
Bug fixes
Fix so that string generics work in Vivado 2023.1 as well.
12.0.3 (25 april 2023)
Changes since previous release
Fixes
Compile Vivado simlib library-by-library with GHDL instead of file-by-file. Reduces compile time from 7 minutes to 5 seconds.
Make the error message for bad generic value type a little more helpful.
Add assertions that some
VivadoProjectarguments are the correct type.
12.0.2 (6 march 2023)
Changes since previous release
Changes
Update documentation.
12.0.1 (2 march 2023)
Changes since previous release
Changes
Update project slogan on PyPI to fit within 98 characters.
12.0.0 (2 march 2023)
Changes since previous release
Added
Add
set_random_seedargument toBaseModule.add_vunit_config().Add table with netlist build resource utilization to Sphinx documentation in
ModuleDocumentation.Add
--from-implsupport toVivadoProject.build()and examplebuild_fpga.py.Add
create_ghdl_ls_configuration()function to generate a configuration file (hdl-prj.json) for the ghdl-ls language server.Add support for string and bit vector generics in
VivadoProjectusing the typesStringGenericValueandBitVectorGenericValue.Add check that fails Vivado build unless all bus skew constraints are met after implementation.
Fail Vivado build if any messages with severity
ERRORhave been reported after synthesis or implementation.
Breaking changes
Remove bundling of hdl-modules with PyPI release. This also removes the constants/functions
tsfpga.HDL_MODULES_LOCATION,tsfpga.HDL_MODULES_TAG,tsfpga.HDL_MODULES_SHAandtsfpga.module.get_hdl_modules().Remove support for formal flow. It’s still a bit too experimental for us to support.
Add mandatory
heading_character_2argument toModuleDocumentation.get_submodule_rst().
Bug fixes
Fix bug where multiple build projects filters that match the same project would crash the build.
Fix bug where Vivado build could crash when there was an ILA in the design in a very specific scenario.
11.0.0 (25 october 2021)
Changes since previous release
Breaking changes
Split out the
tsfpga/registers/folder into the standalonehdl-registersproject (https://hdl-registers.com, https://github.com/hdl-registers/hdl-registers). This moves all python modules from thetsfpga.registerspackage to a new package calledhdl_registers. The PyPI package tsfpga has a dependency on hdl-registers, so if you install tsfpga via pip the change is transparent. If you use tsfpga from a repo checkout, you will also need to check out the hdl-registers repo.
10.0.0 (20 october 2021)
Changes since previous release
Breaking changes
Split out the
modules/folder into the standalonehdl-modulesproject (https://hdl-modules.com, https://github.com/hdl-modules/hdl-modules). The modules are still bundled with each PyPI release oftsfpga.
9.0.0 (19 october 2021)
Changes since previous release
Added
Add
common.handshake_master,common.handshake_slave,common.axi_stream_masterandcommon.axi_stream_slaveVHDL BMFs.Add
common.keep_removerandcommon.strobe_on_lastVHDL entities.Add “peek read” mode to
fifo.fifo.Add
ModuleDocumentationclass for generating Sphinx RST documentation of a module.
Bug fixes
Fix bug where
common.width_conversionwould setoutput_laston the wrong beat when downsizing.Fix bug in
register_file.register_operations_pkg.read_modify_reg_bit.
Changes
Update so that
register_file.axi_lite_register_fileassertsreg_was_read[i]the exact same cycle as the AXI-LiteRtransaction occurs (used to be cycle after).
Breaking changes
Add
common.width_conversiongenericenable_lastwith default valuefalse(used to be implied valuetrue).Move example scripts from
examplestotsfpga/examples. This renames the corresponding python package fromexamplestotsfpga.examples.
8.0.1 (15 july 2021)
Changes since previous release
Fixed
Fix issues with dependency on
GitPythonin setup.py
8.0.0 (6 july 2021)
Changes since previous release
Added
Add
resync.resync_slv_level_coherentVHDL entity.Add
VivadoIpCoreProjectclass which is the defaultvivado_project_classforVivadoIpCores.__init__(). If you use a custom class it is a good idea to inherit from this new class instead ofVivadoProject.Add
IpCoreFileclass to represent IP core files, which adds the possibility of parameterizing IP core creation.
Fixed
Fix bug where Vivado build-time generics dictionary was not copied, which could result in incorrect generic values for parallel builds.
Breaking changes
Rename all VHDL files/entities/types/constants with prefix
axil_to have prefixaxi_lite_. This is done in order to be more descriptive, and to be consistent withaxi_streamcomponents. A search/replaceaxil_->axi_lite_on all VHDL in your FPGA project should be able to adapt for this.Always call
BaseModule.registers_hook()fromBaseModule.registers(), even when TOML file does not exists. This means thatself._registersmight beNonewhen enteringBaseModule.registers_hook().Add mandatory generic
enable_input_registertoresync.resync_levelandresync.resync_slv_levelVHDL entities. Seeresync_level.vhdfile header for details.Rework testbench helper procedures in
register_file.register_operations_pkgcompletely.Rename
bits/bitsargument tobit_index/bit_indexes.Rename
expectedargument tovalue.Add mandatory
value/valuesargument tocheck_reg_equal_bit/check_reg_equal_bits.Add optional
other_bits_valueargument tocheck_reg_equal_bit/check_reg_equal_bitsto control what value the non-designated bits are expected to be (default is zero).Add mandatory
value/valuesargument towait_until_reg_equals_bit/wait_until_reg_equals_bits.Add optional
other_bits_valueargument towait_until_reg_equals_bit/wait_until_reg_equals_bitsto control what value the non-designated bits are expected to be (default is don’t care).Add mandatory
value/valuesargument towrite_reg_bit/write_reg_bits.Add optional
other_bits_valueargument towrite_reg_bit/write_reg_bitsto control what value is assigned to non-designated bits (default is zero).Add
read_modify_write_reg_bit/read_modify_write_reg_bitswhich performs a read-modify-write where the designated bits are updated.
7.0.0 (17 may 2021)
Changes since previous release
Added
Add support for bit vector fields in register code generator.
Add possibility of setting a description for register arrays.
Add
hdl_registers.register_list.RegisterList.create_python_class,hdl_registers.register_list.RegisterList.get_register_array()andhdl_registers.register_list.RegisterList.get_register_index()methods.Add optional
vivado_project_classargument toVivadoIpCoresconstructor.Add
axi.axi_stream_pkgVHDL package andaxi.axi_stream_fifoVHDL entity.Add
common.periodic_pulserVHDL entity.Add support for byte strobe and unaligned burst length in
common.width_conversion.Add support for checking maximum logic level in netlist builds via the
MaximumLogicLevelclass and thebuild_result_checkersargument toVivadoNetlistProject.__init__().
Breaking changes
Re-work the format for register definition TOML files.
Rename
registerpropertybitstobit.Move
default_valueproperty fromregisterto be a property on each register field (bits, bit vectors).
Rename generated register C header bit definitions to have
_SHIFTand_MASKsuffix. This is to be consistent with the naming for bit vector fields.Remove
#pragma pack(push, 1)and#pragma pack(pop)from register C header.The methods
hdl_registers.register_list.RegisterList.get_register(),hdl_registers.register_list.RegisterList.get_constant(),hdl_registers.register_array.RegisterArray.get_register(),hdl_registers.register.Register.get_field(), will now raise exception if nothing matches, instead of returningNone.Move the classes
LessThan,EqualTo,TotalLuts,LogicLuts,LutRams,Srls,Ffs,Ramb36,Ramb18andDspBlocksfromtsfpga.vivado.size_checkertotsfpga.vivado.build_result_checker.Rename
VivadoNetlistProject.__init__()argumentresult_size_checkerstobuild_result_checkers.
Changes
Switch to using python package
tomlkitinstead oftomlfor parsing register TOML files.
Fixed
Fix bug in synchronous FIFO when
drop_packetis asserted in same cycle aswrite_last.
6.0.0 (24 march 2021)
Changes since previous release
Added
Add
fifo.fifo_wrapperVHDL entity.Add
drop_packetsupport to synchronous and asynchronous FIFOs.Add check for pulse width timing violations after implementation in Vivado build system.
Check clock interaction after implementation as well in Vivado build system.
Add
common.clock_counterVHDL entity.Add
bfm.axi_read_slave,bfm.axi_write_slave,bfm.axil_read_slaveandbfm.axil_write_slaveVHDL entities.
Breaking changes
Rename
fifo.afifotofifo.asynchronous_fifo.Rename
vivado.project.VivadoNetlistProjectconstructor argumentanalyze_clock_interactiontoanalyze_synthesis_timing.Remove
tsfpga.vivado.size_checker.Dsp48Blocksin favor of.vivado.size_checker.DspBlocks.Add a pipelining step to improve timing of
axi.axi_read_throttleandaxi.axi_write_throttle. This introduces three new generics that must be set.Change
bfm.axi_slaveandbfm.axil_slaveinterfaces to require twoaxi_slave_tgenerics:axi_read_slaveandaxi_write_slave.Break
axi.axi_simple_crossbarintoaxi.axi_simple_read_crossbarandaxi.axi_simple_write_crossbar.Break
axi.axil_simple_crossbarintoaxi.axil_simple_read_crossbarandaxi.axil_simple_write_crossbar.
Changes
Update timing of
fifo.fifoportread_readyto get lower fanout and shorter critical path. The change implies an increased latency from a read transaction untilwrite_readyis raised.
5.0.0 (15 february 2021)
Changes since previous release
Added
Add optional
clk_inport toresync.resync_levelwhich enables a more deterministic latency constraint.Add support for HTML paragraph breaks in register/bit descriptions. Consecutive newlines will be converted to paragraph breaks.
Add support for parallel builds of FPGA projects using the
BuildProjectListclass.Add support for register constants in TOML file.
Add
axi.axi_read_throttleandaxi.axi_write_throttleVHDL entities.Add
BaseModule.pre_build()hook function.Add time saving mechanism to only re-create the register VHDL package when necessary.
Add
common.debounceVHDL entity.Add
reg_was_readport toreg_file.axil_reg_file.Add
VivadoProject.pre_create()hook function.Allow Vivado project source files to contain spaces.
Add
.BaseModule.get_formal_filesmethod used to select what files are included in a formal project.Add
files_includeandfiles_avoidarguments toBaseModule.get_synthesis_files(),BaseModule.get_simulation_files()and.BaseModule.get_formal_files.Add
full_throughputandallow_poor_input_ready_timinggenerics tocommon.handshake_pipeline.
Breaking changes
Rename
resync.resync_on_signaltoresync.resync_level_on_signalandresync.resync_slv_on_signaltoresync.resync_slv_level_on_signal. This is more descriptive and follows the naming of the other resync blocks.The generated register HTML page no longer supports markdown flavor of using underscores to annotate. Instead use **double asterisks for bold** and *single asterisks for emphasis*. This change is done to make it easier to refer to other registers/constants/signals who very often have underscores in their name.
Rename
axi.axi_interconnecttoaxi.axi_simple_crossbarandaxi.axil_interconnecttoaxi.axil_simple_crossbar. This naming is factual (it is a crossbar, not an interconnect) and more descriptive.Rename
RegisterList.create_html_table()tohdl_registers.register_list.RegisterList.create_html_register_table. Addhdl_registers.register_list.RegisterList.create_html_constant_table.Deprecate
BaseModule.setup_simulations()in favor ofBaseModule.setup_vunit().Rework
BuildProjectListclass completely. See theclass documentation, the minimal usage example and the build_fpga.py example in the repo.Change
VivadoProjectto catch non-zero exit code exception if Vivado call fails. IfVivadoProject.create()orVivadoProject.open()fail they will returnFalse. IfVivadoProject.build()fails, the returnedbuild_result.BuildResultobject will havesuccessset toFalse.Rename
<module>_reg_was_written_tto<module>_reg_was_accessed_tin generated register VHDL package.Add mandatory generic
widthtoresync.resync_slv_levelandresync.resync_slv_level_on_signal.Rename
BaseModule.add_configtoBaseModule.add_vunit_config().Rename
types_pkg.swap_bytestotypes_pkg.swap_byte_order.Remove
VivadoIpCores.vivado_project_sources_directoryin favor ofVivadoIpCores.project_directory.Change
tsfpga.create_vhdl_ls_config.create_configuration()argumentip_core_vivado_project_sources_directoryto beip_core_vivado_project_directory.
Changes
Add TCL sources before adding modules in
VivadoTcl.The
tsfpga.module.get_modules()method now returns aModuleListobject instead of a raw list.
4.0.1 (25 august 2020)
Changes since previous release
Changed
Add missing files to PyPI release.
4.0.0 (21 august 2020)
Changes since previous release
Added
Add automatic size checkers for netlist builds: Build result checkers.
Add
resync.resync_cyclesVHDL entity.
Breaking changes
Change address types (in
axi.axi_pkg,axi.axil_pkgandcommon.addr_pkg) to beunsignedrather thanstd_logic_vector. Do the same for AXIid,addr,lenandsize.Change register definition file from JSON (
regs_<name>.json) to TOML (regs_<name>.toml).Build result, as returned by
VivadoProject.build(), is now abuild_result.BuildResultobject instead of adict.The hooks
VivadoProject.pre_build()andVivadoProject.post_build()must now returnTrueupon success.Rename
common.types_pkg.natural_vectortonatural_vec_tandcommon.types_pkg.positive_vectortopositive_vec_t.Move Vivado-related Python code from
tsfpgapackage to sub-packagetsfpga.vivado. The Python modules are renamed accordingly:tsfpga.vivado_utills->tsfpga.vivado.commontsfpga.vivado_ip_cores->tsfpga.vivado.ip_corestsfpga.vivado_project->tsfpga.vivado.projecttsfpga.vivado_simlib->tsfpga.vivado.simlibtsfpga.vivado_simlib_commercial->tsfpga.vivado.simlib_commercialtsfpga.vivado_simlib_ghdl->tsfpga.vivado.simlib_ghdltsfpga.vivado_tcl->tsfpga.vivado.tcltsfpga.utilization_parser->tsfpga.vivado.utilization_parser
3.0.0 (25 june 2020)
Changes since previous release
Added
Add
lastflag and packet mode to asynchronous FIFO.Add AXI FIFOs and CDCs.
Add class for
Vivado netlist builds.Add
axi.axil_pipelineVHDL entity.
Fixes
Fix issues where
VivadoIpCoreswould re-compile when not necessary.
Breaking changes
Lower
axi.axi_pkg.axi_id_szfrom 32 to 24.Remove default values from AXI conversion functions in
axi_pkgandaxil_pkg. Theaddr_width,data_widthandid_widthalways have to be specified.Change
ram_typegeneric of FIFOs and FIFO wrappers to be of typecommon.attribute_pkg.ram_style_tinstead ofstring.
2.0.0 (20 may 2020)
Changes since previous release
Added
Add support for register arrays in register code generation.
Add support for default values in register code generation.
Add
BaseModule.registers_hook()to make it more convenient to manipulate register information from Python.Add
lastflag and packet mode to synchronous FIFO.Add
common.handshake_splitterVHDL entity.
Fixes
Fix synchronous FIFO signal
almost_emptybeing de-asserted too early whenalmost_empty_levelis zero.Area optimize the synchronous and asynchronous FIFOs.
Breaking changes
Change meaning of
almost_emptyFIFO signal to be “‘1’ if there are almost_empty_level or fewer words available to read”. Used to be “fewer than almost_empty_level”.Change register json definition file name from
<name>_regs.jsontoregs_<name>.json.default_registerspassed toBaseModuleshall now be a list ofhdl_registers.register.Register, instead of a dict.Remove generated register constant
<name>_regs_zero. Instead add<name>_regs_initwith default values.FPGA build projects shall now be set up with
BaseModule.get_build_projects()usingmodule_<name>.pyrather than withproject_<name>.py. See documentation.Rename
FpgaProjectListtoBuildProjectListto get a consistent naming.Constructor argument to
BuildProjectListshall now be a list of modules rather than a list of modules folders.Interface of
resync_counternow usesunsignedvectors rather thanintegers.
Internal changes
Refactor register handling to use only one class
hdl_registers.register_list.RegisterList.
1.0.1 (29 february 2020)
Changes since previous release
Added
Include
pylintrcandpycodestylercin release.
1.0.0 (29 february 2020)
Changes since previous release
Added
Add
run_indexargument toVivadoProject.__init__()andVivadoProject.build().Add
VivadoProject.open()method.Add VHDL AXI-Lite interconnect.
Breaking changes
Refactor to use
pathlib.Pathinstead of strings to represent file system paths. All paths supplied to tsfpga must now bepathlib.Pathobjects.Rename
HdlFile.filenametoHdlFile.path.Adjust
axi.axi_to_axilto not allow more than one outstanding transaction.Rename
FPGAProjectListtoFpgaProjectList.axi.axil_muxnow responds withDECERRif no slave matches, instead of timing out.Update interface to vivado simlib API with a factory class. See here.
Internal changes
Analyze Vivado build timing using a TCL hook instead of reopening the implemented design.
0.1.4 (1 february 2020)
Changes since previous release
New release to test deploy
0.1.3 (1 february 2020)
Changes since previous release
New release to test deploy
0.1.2 (30 january 2020)
Changes since previous release
New release to test deploy
0.1.1 (30 january 2020)
Changes since previous release
New release to test deploy
0.1.0 (30 january 2020)
Initial release