- Added
LogicNet
,inOut
s, andTriStateBuffer
to enable multi-directional wires, ports, and drivers. Includes support for "wire-only" operations supporting multiple drivers. - Deprecated
CustomSystemVerilog
in favor ofSystemVerilog
, which has similar functionality but supportsinOut
ports, and collapses all ports into a singleports
argument, as well as some other new features like custom definitions and parameter passthroughs. - Breaking:
ExternalSystemVerilogModule
andInlineSystemVerilog
now extendSystemVerilog
instead ofCustomSystemVerilog
, meaning theinstantiationVerilog
API arguments have been modified. - Breaking: Increased minimum Dart SDK version to 3.0.0.
- Breaking:
Interface.connectIO
has an additional optional named argument forinOutTags
. Implementations ofInterface
which overrideconnectIO
will need to be updated. - Fixed a bug where
expressionlessInputs
may not have been honored in non-inline custom SystemVerilog modules. - Fixed a bug where in some cases an
xor
between twoLogicValue
s could cause an exception due to a false width mismatch. - Added better checking, error handling, and message when module hierarchy cannot be properly resolved (e.g. self-containing modules, modules within multiple hierarchies).
- Breaking: Updated APIs for
Synthesizer.synthesize
and down the stack to use aFunction
to calculate the instance type of a module instead of aMap
look-up table. - Added
srcConnections
API toLogic
to make it easier to trace drivers of subtypes ofLogic
which contain multiple drivers. - Breaking:
Const
constructor updated so that specifiedwidth
takes precedence over the inherent width of a providedLogicValue
val
. - Added flags to support an
asyncReset
option in places where sequential reset automation was already present. - Breaking:
Sequential
has new added strictness checking when triggers and non-triggers change simultaneously (in the sameSimulator
tick) when it may be unpredictable how the hardware would synthesize, drivingX
s on outputs instead of just picking an order. Descriptions that imply asynchronous resets are predictable and therefore unaffected. - Breaking: injected actions in the
Simulator
can now occur in either themainTick
orclkStable
phases. This API will generally continue to work as expected and as it always has, but in some scenarios could slightly change the behavior of existing testbenches. - Breaking:
Simulator.run
now yields execution of the Dart event loop prior to beginning the simulation. This makes actions taken before starting the simulation more predictable, but may slightly change behavior in existing testbenches that relied on a potential delay. - Improved error and exception messages.
- Fixed a bug where asynchronous events could sometimes show up late in generated waveforms from
WaveDumper
. - Added support for negative edge triggers to
Sequential.multi
for cases where synthesis may interpret an invertedposedge
as different from anegedge
. - Fixed a bug where
resetValues
would not take effect inPipeline
s. - Fixed a bug where a multi-triggered
Sequential
may not generate X's if one trigger is valid and another trigger is invalid.
- Added beta version of the ROHD DevTools Extension to aid in ROHD hardware debug by displaying module hierarchy and signal information visually and interactively (#435).
- Added absolute value (
abs()
) to bothLogic
andLogicValue
(#442). - Added
assignSubset
for performing an assignment on a subset of aLogicArray
(#456). - Made conditional assignments more optimistic with partially invalid values (#459).
- Upgraded the simulator to support cancelling actions and registering actions at the current time (#468).
- Fixed a bug where SystemVerilog generation could mishandle naming collisions between
Logic
s andLogicArray
s (#473). - Added new checks to help catch SystemVerilog generation issues in cases where built-in functionality is overridden.
- Added APIs for accessing indices of a
List<Logic>
using anotherLogic
:Logic.selectFrom
andList<Logic>.selectIndex
(#438). - Added/fixed support for compiling ROHD to JavaScript via bug fixes, compile-time arithmetic precision consideration, and testing (#445).
- Added
isZero
toLogicValue
. - Improved
Pipeline
abstraction via bug fixes, better error checking, improved documentation, and new APIs (#447). - Improved performance of construction of
Combinational.ssa
(#443). - Updated
Simulator.endSimulation
API to return aFuture
which completes once the simulation has ended (#455). - Fixed bugs where certain non-synthesizable function calls on
LogicStructure
s (e.g. for verification) could add additional hardware (which did not affect functionality) and also cause unexpected behavior onpreviousValue
(#457). - Fixed bugs where certain APIs on
Logic
(e.g.changed
,previousValue
) could have incorrect behavior after aSimulator.reset
(#458). - Fixed a bug where
LogicValue.clog2
was inaccurate in rare scenarios. - Fixed a bug that caused a crash when comparing certain
LogicValue
s. - Fixed a bug where conversions between
BigInt
s andLogicValue
s could result in incorrect arithmetic operations. - Fixed a bug where
FiniteStateMachine
-generated mermaid diagrams were missing "default next state" cases (#454). - Allowed generated SystemVerilog to contain assignments to
z
(floating) if explicitly connected to a constantz
(#441).
- Fixed bugs and improved controllability around naming of internal signals and collapsing of inlineable functionality, leading to significantly more readable generated SystemVerilog (#439).
- Fixed a bug where identical module definitions with different reserved definition names would merge incorrectly in generated outputs(#345).
- Improved organization of port and internal signal declarations in generated outputs.
- Fixed bugs where generated SystemVerilog could flag lint issues due to unsafe truncation of signals in cases like
+
and<<
(#423).
- Added
LogicArray
for N-dimensional packed and unpacked (and mixed) arrays. AddedLogicStructure
for grouping sets of related signals together in a convenient way (#375). - Added a
ConditionalGroup
which can group a collection of otherConditional
s into oneConditional
object. - Breaking: some APIs which previously returned
ConditionalAssign
now return aConditional
, such as the<
operator forLogic
. - Updated
LogicValue.of
which now accepts adynamic
input and tries its best to build what you're looking for. AddedLogicValue.ofIterable
to replace the oldLogicValue.of
. - Added
previousValue
toLogic
to make testbench and modelling easier for things like clock edge sampling. - Breaking: Modified the way
Combinational
sensitivities are implemented to improve performance and prevent some types of simulation/synthesis mismatch bugs. AddedCombinational.ssa
as a method to safely build procedural logic.Combinational
will now throw fatal exceptions in cases of "write after read" violations. (#344) - Deprecated
getReceivers
,getDrivers
, andgetConditionals
in always blocks likeCombinational
andSequential
in favor of simpler and more efficient APIsreceivers
,drivers
, andconditionals
. - Breaking: shorthand notation APIs for
incr
,decr
,mulAssign
, anddivAssign
have been modified. - Replaced
IfBlock
withIf.block
(deprecatedIfBlock
). - Replaced
StateMachine
withFiniteStateMachine
(deprecatedStateMachine
). - Added support for multi-trigger (e.g. async reset) to abstractions like
FiniteStateMachine
andPipeline
. Deprecatedclk
onFiniteStateMachine
andPipeline
. - Added ability to generate an FSM diagram in mermaid from a
FiniteStateMachine
. - Added
PairInterface
to make it easier to build and use simpleInterface
s. - Breaking:
connectIO
inInterface
now acceptsIterable
s instead of onlySet
s. - Improved numerous
Exception
s throughout to provide more specific information about errors and make them easier to catch and handle. - Upgraded some operations to avoid generating unnecessary hardware and SystemVerilog when configured to leave a signal unchanged (e.g.
getRange
,swizzle
,slice
, etc.). - Added extension to generate randomized
LogicValue
s from aRandom
. - Added replication operations to
LogicValue
andLogic
. - Added
equalsWithDontCare
toLogicValue
for comparisons where invalid bits are "don't-care". - Improved timestamps in generated outputs to make timezones apparent.
- Added the
flop
function to constructFlipFlop
s in an easier way. - Added the
cases
function to construct simpleCase
statements in an easier way. - Added APIs for configuring reset and reset values in
Sequential
and flip flops. - Added APIs for adding an enable to flip flops.
- Implemented a variety of performance enhancements for both build and simulation.
- Added
tryInput
andtryOutput
toModule
andtryPort
toInterface
to more easily handle conditionally present ports by leveraging Dart'snull
safety by returningnull
if the port does not exist (instead of an exception). - Added
gt
andgte
toLogic
to make APIs more consistent. - Added
clog2
toLogicValue
. - Added
neq
andpow
to bothLogic
andLogicValue
. - Made
LogicValue
implementComparable
, enabling things like sorting. - Enabled
WaveDumper
to recursively create necessary directories for specified output paths. - Fixed a bug where ports could be created with an empty string as the name (#281).
- Fixed a bug where generated SystemVerilog for arithmetic shift-right operations would sometimes be incorrect (#295).
- Fixed a bug where
SynthBuilder
would not flag an error when run on aModule
that hadn't yet been built (#246). - Disallowed signals from being connected directly to themselves in a combinational loop.
- Fixed a bug where non-synthesizable deposits on undriven signals could affect the generated output SystemVerilog by inserting a non-floating constant (#254).
- Reinstated an accidentally removed exception for when signal width mismatch occurs (#311).
- Fixed a bug where indexing a constant value could generate invalid SystemVerilog.
- Fixed a bug where constants and values that could be interpreted as negative 64-bit values would sometimes generate a
-
sign in output SystemVerilog. - Fixed bugs so
If
s that are illegally constructed throw anException
(#382). - Fixed a bug where
FiniteStateMachine
could create an inferred latch (#390). - Fixed an issue where
Case
statements with multiple matches would throw anException
instead of drivingx
on the output, which could cause spurious crashes during glitch simulation (#107). - Fixed a number of bugs related to logical, shift, math, and comparison operations related to width and sign interpretation.
- Fixed a bug where
Case
andCaseZ
would not use the properly edge-sampled value inSequential
blocks (#348). - Fixed bugs where logic that is driven by floating signals would sometimes drive
z
instead ofx
on outputs (#235).
- Added a GitHub Codespace to the repository as a quick way to experiment with ROHD without any environment setup.
- Added
Conditional
operations similar to++x
(incr
),--x
(decr
),x *=
(mulAssign
), andx /=
(divAssign
) toLogic
(#141). - Fixed a bug where generated SystemVerilog could perform index accesses on single-bit signals (#204).
- Expanded capability to construct single-
Conditional
more succinctly viaElse.s
(#225). - Fixed a bug where sensitivities for
Combinational
s were excessively pessimistic (#233). - Improved exceptions raised by
Logic.put
to include context on which signal was affected to help with debug (#243). - Optimized
WaveDumper
to only periodically write data to the VCD file to improve performance (#242). - Made
endIndex
ingetRange
an optional positional argument with a default value ofwidth
, enabling a more convenient method for collecting all bits from some index until the end (#228). - Added an exception in cases where names of interface ports are invalid/unsanitary (#234).
- Upgraded the
Simulator
so that it wouldawait
asynchronous registered actions (#252). - Deprecated
Logic.hasValidValue
andLogic.isFloating
in favor of similar operations onLogic.value
(#198). - Added
Logic.isIn
, which generates logic computing whether the signal is equal to any values in a (optionally mixed) list of constants or other signals (#7).
- Fixed a bug where
Module
s could have invalid names in generated SystemVerilog (#138). - Fixed a bug where
Logic
s could have invalid names in generated SystemVerilog. - Added a feature allowing access of an index of a
Logic
via anotherLogic
(#153). - Fixed a bug where multiple sequential driver issues might not be caught during ROHD simulation (#114).
- Improved
Exception
s in ROHD with better error messages and more granular exception types to make handling easier. - Improved generated SystemVerilog for sign extension and added capability for replication (#157).
- Fixed a bug where signal names and module instance names could collide in generated SystemVerilog (#205).
- Fixed a bug where in some cases modules might not be properly detected as sub-modules, leading to erroneous omission in generated outputs.
- Added capability to perform modulo and shift operations on
Logic
via a constant values (#208). - Completed a fix for a bug where shifting a
Logic
by a constant would throw an exception (#170). - Modified the mechanism by which signal propagation occurs between
Logic
s so that connectedLogic
s share an underlying value-holding entity (#199). One significant implication is that modifying a value of aLogic
(e.g. viaput
orinject
) will now affect the value of both downstream and upstream connectedLogic
s instead of only downstream. This change also can significantly improve simulation performance in connection-heavy designs. Additionally, this change helps mitigate an issue where very long combinational chains of logic can hit the stack size limit (#194). - Fixed a bug where large unsigned values on
LogicValue
s would convert to incorrectint
values (#212). - Added an extension on
BigInt
to perform unsigned conversion to anint
. - Added a capability to construct some
Conditional
types (e.g.If
) which have only a singleConditional
more succinctly (#12). - Optimized some operations in
LogicValue
for performance (#215). - Added a shortcut to create a 0-width
LogicValue
calledLogicValue.empty
(#202). - Fixed a bug where equal
LogicValue
s could have unequal hash codes (#206). The fix also improved internal representation consistency forLogicValue
s, which could provide a significant performance improvement when wide values are used often.
- Fixed a bug where generated SystemVerilog could apply bit slicing to an expression (#163).
- Fixed a bug where constant collapsing in SystemVerilog could erroneously remove constant assignments (#159).
- Fixed a bug where
Combinational
could have an incomplete sensitivity list causing incorrect simulation behavior (#158). - Significantly improved simulation performance of
Combinational
(#106). - Upgraded and made lints more strict within ROHD, leading to some quality and documentation improvements.
- Added a feature allowing negative indexing to access relative to the end of a
Logic
orLogicValue
(#99). - Breaking: Increased minimum Dart SDK version to 2.18.0.
- Fixed a bug when parsing unsigned large binary integers (#183).
- Exposed
SynthesisResult
s from theSynthBuilder
, making it easier to generate SystemVerilog modules into independent files (#172). - Breaking: Renamed
topModuleName
todefinitionName
inExternalSystemVerilogModule
(#169). - Added the
mux
function as a shortcut for building aMux
and returning the output of it (#13). - Deprecation: Improved naming of ports on basic gates, old port names remain accessible but deprecated for now (#135).
- Fixed list of reserved SystemVerilog keywords for sanitization (#168).
- Added the
StateMachine
abstraction for finite state machines. - Added support for the modulo
%
operator. - Added ability to register actions to be executed at the end of the simulation.
- Modified the
WaveDumper
to write to the.vcd
file asynchronously to improve simulation performance while waveform dumping is enabled (#3)
- Fixed a bug (introduced in v0.3.0) where
WaveDumper
doesn't properly dump multi-bit values to VCD (#129).
- Breaking: Merged
LogicValue
andLogicValues
into one type calledLogicValue
. - Deprecation: Aligned
LogicValue
toLogic
by renaminglength
towidth
. - Breaking:
Logic.put
no longer acceptsList<LogicValue>
, swizzle it together instead. - Deprecated
Logic.valueInt
andLogic.valueBigInt
; instead use equivalent functions onLogic.value
. - Deprecated
bit
on bothLogicValue
andLogic
; instead just checkwidth
. - Added ability in
LogicValue.toString
to decide whether or not to include the width annotation throughincludeWidth
argument. - Fixed a bug related to zero-width construction of
LogicValue
s (#90). - Fixed a bug where generated constants in SystemVerilog had no width, which can cause issues in some cases (e.g. swizzles) (#89)
- Added capability to convert binary strings to ints with underscore separators using
bin
(#56). - Added
getRange
andreversed
onLogic
andslice
onLogicValue
to improve consistency. - Using
slice
in reverse-index order now reverses the order. - Added the ability to extend signals (e.g.
zeroExtend
andsignExtend
) on bothLogic
andLogicValue
(#101). - Improved flexibility of
IfBlock
. - Added
withSet
onLogicValue
andLogic
to make it easier to assign subsets of signals and values (#101). - Fixed a bug where 0-bit signals would sometimes improperly generate 0-bit constants in generated SystemVerilog (#122).
- Added capability to reserve instance names, as well as provide and reserve definition names, for
Module
s and their corresponding generated outputs.
- Updated implementation to avoid
Iterable.forEach
to make debug easier. - Added
ofBool
toLogicValue
andLogicValues
(#34). - Breaking: updated
Interface
API so thatgetPorts
returns aMap
from port names toLogic
signals instead of just a list, which makes it easier to work with when names are uniquified. - Breaking: removed
setPort
fromInterface
. UsesetPorts
instead. - Deprecated
swizzle
andrswizzle
global functions and replaced them with extensions onList
s of certain types includingLogic
,LogicValue
, andLogicValues
(#70). - Breaking: renamed
ExternalModule
toExternalSystemVerilogModule
since it is specifically for SystemVerilog. - Breaking: made
topModuleName
a required named parameter inExternalSystemVerilogModule
to reduce confusion. - Added
simulationHasEnded
bool toSimulator
. - Updated
Simulator
to allow for injected actions to returnFuture
s which will beawait
ed. - Fixed bug where
Simulator
warns about maximum simulation time when not appropriate. - Fixed a bug where
ExternalSystemVerilogModule
could enter infinite recursion. - Some improvements to
SimCompare
to properly check values at the end of a tick and support a wider variety of values inVector
s. - Fixed a bug related to
Sequential
signal sampling where under certain scenarios, signals would pass through instead of being flopped (#79). - Deprecated a number of
from
functions and replaced them withof
to more closely follow Dart conventions (#72).
- Optimized construction of
LogicValues
to improve performance - Renamed
FF
toSequential
(markedFF
as deprecated) (breaking: removedclk
signal) - Added
Sequential.multi
for multi-edge-triggered blocks (#42) - Improved exception and error messages (#64)
- Fix
Interface.connectIO
bug when no tags specified (#38) - Fix uniquified
Interface.getPorts
bug (#59)
- The first formally versioned release of ROHD.