- 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 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.