The Rapid Open Hardware Development (ROHD) framework is a framework for describing and verifying hardware in the Dart programming language. ROHD enables you to build and traverse a graph of connectivity between module objects using unrestricted software.

Overview

Tests Docs License Contributor Covenant

Rapid Open Hardware Development (ROHD) Framework

Describing Hardware in Dart with ROHD

ROHD (pronounced like "road") is a framework for describing and verifying hardware in the Dart programming language. ROHD enables you to build and traverse a graph of connectivity between module objects using unrestricted software.

Features of ROHD include:

  • Full power of the modern Dart language for hardware design and verification
  • Makes validation collateral simpler to develop and debug. A future package (like UVM for ROHD) to help build testbenches is planned for release soon.
  • Develop layers of abstraction within a hardware design, making it more flexible and powerful
  • Easy IP integration and interfaces; using an IP is as easy as an import. Reduces tedious, redundant, and error prone aspects of integration
  • Simple and fast build, free of complex build systems and EDA vendor tools
  • Can use the excellent pub.dev package manager and all the packages it has to offer
  • Built-in event-based fast simulator, with waveform dumper to .vcd file format
  • Conversion of modules to equivalent, human-readable, structurally similar SystemVerilog for integration or downstream tool consumption
  • Run-time dynamic module port definitions (numbers, names, widths, etc.) and internal module logic, including recursive module contents
  • Simple, free, open source tool stack without any headaches from library dependencies, file ordering, elaboration/analysis options, +defines, etc.
  • Excellent, simple, fast unit-testing framework
  • Less verbose than alternatives (fewer lines of code)
  • Enables higher quality development
  • Replaces hacky perl/python scripting for automation with powerful native control of design generation
  • Fewer bugs and lines of code means shorter development schedule
  • Support for cosimulation with verilog modules and instantiation of verilog modules in generated SystemVerilog code
  • Use modern IDEs like Visual Studio Code, with excellent static analysis, fast autocomplete, built-in debugger, linting, git integration, extensions, and much more
  • Simulate with various abstraction levels of models from architectural, to functional, to cycle-accurate, to RTL levels in the same language and environment.

ROHD is not a new language, it is not a hardware description language (HDL), and it is not a version of High-Level Synthesis (HLS). ROHD can be classified as a generator framework.

You can think of this project as an attempt to replace SystemVerilog and related build systems as the front-end methodology of choice in the industry.

One of ROHD's goals is to help grow an open-source community around reusable hardware designs and verification components.

Why Dart?

Dart is a modern, relatively new language developed by Google. It is designed with client-side application development in mind (e.g. apps and websites), but also has great performance for general tasks. It adopts some of the most loved syntax and features from languages like C++, Java, C#, JavaScript/TypeScript, and Kotlin. Dart is extremely user-friendly, fun to use, and easy to learn. The excellent, fast static analysis with a modern IDE with autocomplete makes it easy to learn as you work. Dart has a lot of great modern language features, including null safety.

Because it is designed with asynchronous requests in mind (i.e. sending a request to a server and not freezing the application while it waits for a response), Dart has async/await and Futures built in, with concurrent programming using isolates. These constructs enable code to execute in parallel without multithreading. These chacteristics make modelling hardware very easy.

Dart can compile to native machine code, but also includes its own high-performance VM and a JIT compiler. During development, you can use a feature called "hot reload" to change code while the program is actively executing.

Dart has an excellent package manager called "pub" (https://pub.dev). It is possible to host a private Dart Pub server for packages that shouldn't be shared broadly (e.g. Top-Secret IP).

The Challenge of Justifying Trying a New Language

This StackOverflow answer about why it's worth trying Chisel (an alternative to ROHD) contains valuable insight into why it is difficult in general to justify a new language to someone who hasn't used it before:

Language power is notoriously difficult to objectively evaluate. Paul Graham describes this as the "Blub Paradox" in his "Beating the Averages" essay. Graham's thesis is that an engineer proficient in a less powerful language cannot evaluate the utility of a more powerful language.

If you're thinking "SystemVerilog is just fine, I don't need something new", it is worth reading either or both of the StackOverflow answer and the Paul Graham essay.

More Information on Dart

Try out Dart instantly from your browser here: https://dartpad.dev/?null_safety=true

See some Dart language samples here: https://dart.dev/samples

For more information on Dart and tutorials, see https://dart.dev/ and https://dart.dev/overview

Development Recommendations

Getting started

Once you have Dart installed, if you don't already have a project, you can create one using dart create: https://dart.dev/tools/dart-tool

Then add ROHD as a dependency to your pubspec.yaml file. Until ROHD is available on a package manager, you can either clone this repo to your local disk and include the relative or absolute path like this:

dependencies:
  rohd:
    path: /path/to/rohd

OR you can directly depend on the github repository like this:

dependencies:
  rohd:
    url: git://github.com/intel/rohd.git

Now you can import it in your project using:

import 'package:rohd/rohd.dart';

There are complete API docs available at https://intel.github.io/rohd/rohd/rohd-library.html.

If you need some help, you can visit our Discussions page. This is a friendly place where you can ask questions, share ideas, or just discuss openly! You could also head to StackOverflow.com (use the tag rohd) to ask questions or look for answers.

Package Managers for Hardware

In the Dart ecosystem, you can use a package manager to define all package dependencies. A package manager allows you to define constrainted subsets of versions of all your direct dependencies, and then the tool will solve for a coherent set of all (direct and indirect) dependencies required to build your project. There's no need to manually figure out tool versions, build flags and options, environment setup, etc. because it is all guaranteed to work. Integration of other packages (whether a tool or a hardware IP) become as simple as an import statment. Compare that to SystemVerilog IP integration!

Read more about package managers here: https://en.wikipedia.org/wiki/Package_manager
Take a look at Dart's package manager, pub.dev, here: https://pub.dev

ROHD Syntax and Examples

The below subsections offer some examples of implementations and syntax in ROHD.

A full example of a counter module

To get a quick feel for what ROHD looks like, below is an example of what a simple counter module looks like in ROHD.

// Import the ROHD package
import 'package:rohd/rohd.dart';

// Define a class Counter that extends ROHD's abstract Module class
class Counter extends Module {

  // For convenience, map interesting outputs to short variable names for consumers of this module
  Logic get val => output('val');

  // This counter supports any width, determined at run-time
  final int width;
  Counter(Logic en, Logic reset, Logic clk, {this.width=8, String name='counter'}) : super(name: name) {
    // Register inputs and outputs of the module in the constructor.
    // Module logic must consume registered inputs and output to registered outputs.
    en    = addInput('en', en);
    reset = addInput('reset', reset);
    clk   = addInput('clk', clk);

    var val = addOutput('val', width: width);

    // A local signal named 'nextVal'
    var nextVal = Logic(name: 'nextVal', width: width);
    
    // Assignment statement of nextVal to be val+1 (<= is the assignment operator)
    nextVal <= val + 1;

    // `FF` is like SystemVerilog's always_ff, in this case trigger on the positive edge of clk
    FF(clk, [
      // `If` is a conditional if statement, like `if` in SystemVerilog always blocks
      If(reset, then:[
        // the '<' operator is a conditional assignment
        val < 0
      ], orElse: [If(en, then: [
        val < nextVal
      ])])
    ]);
  }
}

A more complex example

See a more advanced example of a logarithmic-depth tree of arbitrary functionality at doc/TreeExample.md.

Logical signals

The fundamental signal building block in ROHD is called Logic.

// a one bit, unnamed signal
var x = Logic();

// an 8-bit bus named 'b'
var bus = Logic(name: 'b', width: 8)

The value of a signal

You can access the current value of a signal using value. You cannot access this as part of synthesizable ROHD code. ROHD supports X and Z values and propogation. If the signal is valid (no X or Z in it), you can also convert it to an int with valueInt (ROHD will throw an exception otherwise). If the signal has more bits than a dart int (64 bits, usually), you need to use valueBigInt to get a BigInt (again, ROHD will throw an exception otherwise).

Bits of a Logic are of type LogicValue, with pre-defined constant enum values x, z, one, and zero. The value of a Logic is represented by a LogicValues, which behaves like a collection of LogicValues. Both LogicValue and LogicValues have a number of built-in logical operations (like &, |, ^, +, -, etc.).

var x = Logic(width:2);

// a LogicValues
x.value

// an int
x.valueInt

// a BigInt
x.valueBigInt

You can create LogicValuess using a variety of constructors including fromInt, fromBigInt, filled (like '0, '1, 'x, etc. in SystemVerilog), and from (which takes any Iterable<LogicValue>).

Listening to and waiting for changes

You can trigger on changes of Logics with some built in events. ROHD uses dart synchronous streams for events.

There are three testbench-consumable streams built-in to ROHD Logics: changed, posedge, and negedge. You can use listen to trigger something every time the edge transitions. Note that this is not synthesizable by ROHD and should not be confused with a synthesizable always(@) type of statement. Event arguments passed to listeners are of type LogicValueChanged, which has information about the previousValue and newValue.

Logic mySignal;
...
mySignal.posedge.listen((args) {
  print("mySignal was ${args.previousValue} before, but there was a positive edge and the new value is ${args.newValue}");
});

You can also use helper getters nextChanged, nextPosedge, and nextNegedge which return Future<LogicValueChanged>. You can think of these as similar to something like @(posedge mySignal); in SystemVerilog testbench code. Again, these are not something that should be included in synthesizable ROHD hardware.

Constants

Constants can often be inferred by ROHD automatically, but can also be explicitly defined using Const, which extends Logic.

// a 16 bit constant with value 5
var x = Const(5, width:16);

There is a convenience function for converting binary to an integer:

// this is equvialent to and shorter than int.parse('010101', radix:2)
bin('010101')

Assignment

To assign one signal to the value of another signal, use the <= operator. This is a hardware synthesizable assignment connecting two wires together.

var a = Logic(), b = Logic();
// assign a to always have the same value as b
a <= b;

Simple logical, mathematical, and comparison operations

Logical operations on signals are very similar to those in SystemVerilog.

a_bar     <=  ~a;      // not
a_and_b   <=  a & b;   // and
a_or_b    <=  a | b;   // or
a_xor_b   <=  a ^ b;   // xor
and_a     <= a.and();  // unary and
or_a      <= a.or();   // unary or
xor_a     <= a.xor();  // unary xor
a_plus_b  <=  a + b;   // addition
a_sub_b   <=  a - b;   // subtraction
a_times_b <=  a * b;   // multiplication
a_div_b   <=  a / b;   // division
a_eq_b    <=  a.eq(b)  // equality              NOTE: == is for Object equality of Logic's
a_lt_b    <=  a.lt(b)  // less than             NOTE: <  is for conditional assignment
a_lte_b   <=  a.lte(b) // less than or equal    NOTE: <= is for assignment
a_gt_b    <=  (a > b)  // greater than          NOTE: careful with order of operations, > needs parentheses in this case
a_gte_b   <=  (a >= b) // greater than or equal NOTE: careful with order of operations, >= needs parentheses in this case

Shift Operations

Dart has implemented the triple shift operator (>>>) in the opposite way as is implemented in SystemVerilog. That is to say in Dart, >>> means logical shift right (fill with 0's), and >> means arithmetic shift right (maintaining sign). ROHD keeps consistency with Dart's implementation to avoid introducing confusion within Dart code you write (whether ROHD or plain Dart).

a << b    // logical shift left
a >> b    // arithmetic shift right
a >>> b   // logical shift right

Bus ranges and swizzling

Multi-bit busses can be accessed by single bits and ranges or composed from multiple other signals.

var a = Logic(width:8),
    b = Logic(width:3),
    c = Const(7, width:5),
    d = Logic(),
    e = Logic(width: 9);


// assign b to the bottom 3 bits of a
b <= a.range(2,0);

// assign d to the top bit of a
d <= a[7];

// construct e by swizzling bits from b, c, and d
// here, the MSB is on the left, LSB is on the right
e <= swizzle([d, c, b]);

// alternatively, do a reverse swizzle (useful for lists where 0-index is actually the 0th element)
// here, the LSB is on the left, the MSB is on the right
e <= rswizzle([b, c, d]);

ROHD does not (currently) support assignment to a subset of a bus. That is, you cannot do something like e[3] <= d. If you need to build a bus from a collection of other signals, use swizzling.

Modules

Modules are similar to modules in SystemVerilog. They have inputs and outputs and logic that connects them. There are a handful of rules that must be followed when implementing a module.

  1. All logic within a Module must consume only inputs (from the input or addInput methods) to the Module either directly or indirectly.
  2. Any logic outside of a Module must consume the signals only via outputs (from the output or addOutput methods) of the Module.
  3. Logic must be defined before the call to super.build(), which always must be called at the end of the build() method if it is overidden.

The reasons for these rules have to do with how ROHD is able to determine which logic and Modules exist within a given Module and how ROHD builds connectivity. If these rules are not followed, generated outputs (including waveforms and SystemVerilog) may be unpredictable.

You should strive to build logic within the constructor of your Module (directly or via method calls within the constructor). This way any code can utilize your Module immediately after creating it. Be careful to consume the registered inputs and drive the registered outputs of your module, and not the "raw" parameters.

It is legal to put logic within an override of the build function, but that forces users of your module to always call build before it will be functionally usable for simple simulation. If you put logic in build(), ensure you put the call to super.build() at the end of the method.

Note that the build() method returns a Future<void>, not just void. This is because the build() method is permitted to consume real wallclock time in some cases, for example for setting up cosimulation with another simulator. If you expect your build to consume wallclock time, make sure the Simulator is aware it needs to wait before proceeding.

It is not necessary to put all logic directly within a class that extends Module. You can put synthesizable logic in other functions and classes, as long as the logic eventually connects to an input or output of a module if you hope to convert it to SystemVerilog. Except where there is a desire for the waveforms and SystemVerilog generated to have module hierarchy, it is not necessary to use submodules within modules instead of plain classes or functions.

The Module base class has an optional String argument 'name' which is an instance name.

Modules have the below basic structure:

// class must extend Module to be a Module
class MyModule extends Module {
    
    // constructor
    MyModule(Logic in1, {String name='mymodule'}) : super(name: name) {
        // add inputs in the constructor, passing in the Logic it is connected to
        // it's a good idea to re-set the input parameters so you don't accidentally use the wrong one
        in1 = addInput('in1', in1);

        // add outputs in the constructor as well
        // you can capture the output variable to a local variable for use
        var out = addOutput('out');

        // now you can define your logic
        // this example is just a passthrough from 'in1' to 'out'
        out <= in1;
    }
}

All gates or functionality apart from assign statements in ROHD are implemented using Modules.

Inputs, outputs, widths, and getters

The default width of an input and output is 1. You can control the width of ports using the width argument of addInput() and addOutput(). You may choose to set them to a static number, based on some other variable, or even dynamically based on the width of input parameters. These functions also return the input/output signal.

It can be convenient to use dart getters for signal names so that accessing inputs and outputs of a module doesn't require calling input() and output() every time. It also makes it easier to consume your module.

Below are some examples of inputs and outputs in a Module.

class MyModule extends Module {

    MyModule(Logic a, Logic b, Logic c, {int xWidth=5}) {
        
        // 'a' should always be width 4, throw an exception if its wrong
        if(a.width != 4) throw Exception('Width of a must be 4!');
        addInput('a', a, width: 4);

        // allow 'b' to always be any width, based on what's passed in
        addInput('b', b, width: b.width);

        // default width is 1, so 'c' is 1 bit
        // addInput returns the value of input('c'), if you want it
        var c_input = addInput('c', c)

        // set the width of 'x' based on the constructor argument
        addOutput('x', width: xWidth);

        // you can dynamically set the output width based on an input width, as well
        // addOutput returns the value of output('y'), if you want it
        var y_output = addOutput('y', width: b.width);
    }

    // A verbose getter of the value of input 'a'
    Logic get a {
      return input('a');
    }
    
    // Dart shorthand makes getters less verbose, but the functionality is the same as above
    Logic get b => input('b');
    Logic get x => output('x');
    Logic get y => output('y');

    // it is not necessary to have all signals accessible through getters, here we omit 'c'

}

Sequentials

ROHD has a basic FlipFlop module that can be used as a flip flop. For more complex sequential logic, use the FF block described in the Conditionals section.

Dart doesn't have a notion of certain signals being "clocks" vs. "not clocks". You can use any signal as a clock input to sequential logic, and have as many clocks of as many frequencies as you want.

Conditionals

ROHD supports a variety of Conditional type statements that always must fall within a type of _Always block, similar to SystemVerilog. There are two types of _Always blocks: FF and Combinational, which map to SystemVerilog's always_ff and always_comb, respectively. Combinational takes a list of Conditional statements. Different kinds of Conditional statement, such as If, may be composed of more Conditional statements. You can create Conditional composition chains as deep as you like.

Conditional statements are executed imperatively and in order, just like the contents of always blocks in SystemVerilog. _Always blocks in ROHD map 1-to-1 with SystemVerilog always statements when converted.

If

Below is an example of an If statement in ROHD:

Combinational([
  If(a, then: [
      y < a,
      z < b,
      x < a & b,
      q < d,
  ], orElse: [ If(b, then: [
      y < b,
      z < a,
      q < 13,
  ], orElse: [
      y < 0,
      z < 1,
  ])])
]);

IfBlock

The IfBlock makes syntax for long chains of if / else if / else chains nicer. For example:

FF(clk, [
  IfBlock([
    // the first one must be Iff (yes, with 2 f's, to differentiate from If above)
    Iff(a & ~b, [
      c < 1,
      d < 0
    ]),
    ElseIf(b & ~a, [
      c < 1,
      d < 0
    ]),
    // have as many ElseIf's here as you want
    Else([
      c < 0,
      d < 1
    ])
  ])
]);

Case and CaseZ

ROHD supports Case and CaseZ statements, including priority and unique flavors, which are implemented in the same way as SystemVerilog. For example:

Combinational([
  Case(swizzle([b,a]), [
      CaseItem(Const(LogicValues.fromString('01')), [
        c < 1,
        d < 0
      ]),
      CaseItem(Const(LogicValues.fromString('10')), [
        c < 1,
        d < 0,
      ]),
    ], defaultItem: [
      c < 0,
      d < 1,
    ],
    conditionalType: ConditionalType.Unique
  ),
  CaseZ(swizzle([b,a]),[
      CaseItem(Const(LogicValues.fromString('z1')), [
        e < 1,
      ])
    ], defaultItem: [
      e < 0,
    ],
    conditionalType: ConditionalType.Priority
  )
]);

Note that ROHD supports the 'z' syntax, not the '?' syntax (these are equivalent in SystemVerilog).

There is no support for an equivalent of casex from SystemVerilog, since it can easily cause unsynthesizeable code to be generated (see: https://www.verilogpro.com/verilog-case-casez-casex/).

Interfaces

Interfaces make it easier to define port connections of a module in a reusable way. An example of the counter re-implemented using interfaces is shown below.

Interface takes a generic parameter for direction type. This enables you to group signals so make adding them as inputs/outputs easier for different modules sharing this interface.

The Port class extends Logic, but has a constructor that takes width as a positional argument to make interface port definitions a little cleaner.

When connecting an Interface to a Module, you should always create a new instance of the Interface so you don't modify the one being passed in through the constructor. Modifying the same Interface as was passed would have negative consequences if multiple Modules were consuming the same Interface, and also breaks the rules for Module input and output connectivity.

The connectIO function under the hood calls addInput and addOutput directly on the Module and connects those Module ports to the correct ports on the Interfaces. Connection is based on signal names. You can use the append String argument in connectIO to uniquify inputs and outputs in case you have multiple instances of the same Interface connected to your module. You can also use the setPort function to directly set individual ports on the Interface instead of via tagged set of ports.

// Define a set of legal directions for this interface, and pass as parameter to Interface
enum CounterDirection {IN, OUT}
class CounterInterface extends Interface<CounterDirection> {
  
  // include the getters in the interface so any user can access them
  Logic get en => port('en');
  Logic get reset => port('reset');
  Logic get val => port('val');

  final int width;
  CounterInterface(this.width) {
    // register ports to a specific direction
    setPorts([
      Port('en'), // Port extends Logic
      Port('reset')
    ], [CounterDirection.IN]);  // inputs to the counter

    setPorts([
      Port('val', width),
    ], [CounterDirection.OUT]); // outputs from the counter
  }

}

class Counter extends Module {
  
  late final CounterInterface intf;
  Counter(CounterInterface intf) {
    // define a new interface, and connect it to the interface passed in
    this.intf = CounterInterface(intf.width)
      ..connectIO(this, intf, 
        // map inputs and outputs to appropriate directions
        inputTags: {CounterDirection.IN}, 
        outputTags: {CounterDirection.OUT}
      );
    
    _buildLogic();
  }

  void _buildLogic() {
    var nextVal = Logic(name: 'nextVal', width: intf.width);
    
    // access signals directly from the interface
    nextVal <= intf.val + 1;

    FF( SimpleClockGenerator(10).clk, [
      If(intf.reset, then:[
        intf.val < 0
      ], orElse: [If(intf.en, then: [
        intf.val < nextVal
      ])])
    ]);
  }
}

Non-synthesizable signal deposition

For testbench code or other non-synthesizable code, you can use put or inject on any Logic to deposit a value on the signal. The two functions have similar behavior, but inject is shorthand for calling put inside of Simulator.injectAction, which allows the deposited change to propogate within the same Simulator tick.

var a = Logic(), b = Logic(width:4);

// you can put an int directly on a signal
a.put(0);
b.inject(0xf);

// you can also put a `LogicValue` onto a signal
a.put(LogicValue.x);

// you can also put a `LogicValues` onto a signal
b.put(LogicValues([
  LogicValue.one,
  LogicValue.zero,
  LogicValue.x,
  LogicValue.z,
  ].reversed // reverse since arrays start with 0
));

Note: changing a value directly with put() will propogate the value, but it will not trigger flip-flop edge detection or cosim interaction.

Custom module behavior with custom in-line SystemVerilog representation

Many of the basic built-in gates in Dart implement custom behavior. An implementation of the NotGate is shown below as an example. There is different syntax for functions which can be inlined versus those which cannot (the ~ can be inlined). In this case, the InlineSystemVerilog mixin is used, but if it were not inlineable, you could use CustomSystemVerilog. Note that it is mandatory to provide an initial value computation when the module is first created for non-sequential modules.

class NotGate extends Module with InlineSystemVerilog {

  /// Name for a port of this module. 
  late final String _a, _out;
  
  /// The input to this [NotGate].
  Logic get a => input(_a);

  /// The output of this [NotGate].
  Logic get out => output(_out);

  NotGate(Logic a, {String name = 'not'}) : super(name: name) {
    _a = Module.unpreferredName(a.name);
    _out = Module.unpreferredName('${a.name}_b');
    addInput(_a, a, width: a.width);
    addOutput(_out, width: a.width);
    _setup();
  }

  /// Performs setup steps for custom functional behavior.
  void _setup() {
    _execute(); // for initial values

    // Custom behavior should subscribe to 'glitch'
    a.glitch.listen((args) {
      _execute();
    });
  }

  /// Executes the functional behavior of this gate.
  void _execute() {
    out.put(~a.value);
  }

  // specify how to convert this behavior to Verilog
  @override
  String inlineVerilog(Map<String,String> inputs) {
    if(inputs.length != 1) throw Exception('Gate has exactly one input.');
    var a = inputs[_a]!;
    return '~$a';
  }
}

ROHD Simulator

The ROHD simulator is a static class accessible as Simulator which implements a simple event-based simulator. All Logics in Dart have glitch events which propogate values to connected Logics downstream. In this way, ROHD propogates values across the entire graph representation of the hardware (without any Simulator involvement required). The simulator has a concept of (unitless) time, and arbitrary Dart functions can be registered to occur at arbitraty times in the simulator. Asking the simulator to run causes it to iterate through all registered timestamps and execute the functions in chronological order. When these functions deposit signals on Logics, it propogates values across the hardware. The simulator has a number of events surrounding execution of a timestamp tick so that things like FlipFlops can know when clocks and signals are glitch-free.

  • To register a function at an arbitraty timestamp, use Simulator.registerAction
  • To set a maximum simulation time, use Simulator.setMaxSimTime
  • To immediately end the simulation at the end of the current timestamp, use Simulator.endSimulation
  • To run just the next timestamp, use Simulator.tick
  • To run simulator ticks until completion, use Simulator.run
  • To reset the simulator, use Simulator.reset
    • Note that this only resets the Simulator and not any Modules or Logic values
  • To add an action to the Simulator in the current timestep, use Simulator.injectAction.

Instantiation of External Modules

ROHD can instantiate external SystemVerilog modules. The ExternalModule constructor requires the top level SystemVerilog module name. When ROHD generates SystemVerilog for a model containing an ExternalModule, it will instantiate instances of the specified topModuleName. This is useful for integration related activities.

There is an upcoming package for SystemVerilog cosimulation with ROHD which adds cosimulation capabilities to an ExternalModule planned for release soon.

Unit Testing

Dart has a great unit testing package available on pub.dev: https://pub.dev/packages/test

The ROHD package has a great set of examples of how to write unit tests for ROHD Modules in the test/ directory.

Note that when unit testing with ROHD, it is important to reset the Simulator with Simulator.reset().

Contributing

ROHD is under active development. If you're interested in contributing, have feedback or a question, or found a bug, please see CONTRIBUTING.md.

Comparison with Alternatives

There are a lot of options for developing hardware. This section briefly discusses popular alternatives to ROHD and some of their strengths and weaknesses.

SystemVerilog

SystemVerilog is the most popular HDL (hardware descriptive language). It is based on Verilog, with additional software-like constructs added on top of it. Some major drawbacks of SystemVerilog are:

  • SystemVerilog is old, verbose, and limited, which makes code more bug-prone
  • Integration of IPs at SOC level with SystemVerilog is very difficult and time-consuming.
  • Validation collateral is hard to develop, debug, share, and reuse when it is written in SystemVerilog.
  • Building requires building packages with proper `include ordering based on dependencies, ordering of files read by compilers in .f files, correctly specifiying order of package and library dependencies, and correct analysis and elaboration options. This is an area that drains many engineers' time debugging.
  • Build and simulation are dependent on expensive EDA vendor tools or incomplete open-source alternatives. Every tool has its own intricacies, dependencies, licensing, switches, etc. and different tools may synthesize or simulate the same code in a functionally inequivalent way.
  • Designing configurable and flexible modules in pure SystemVerilog usually requires parameterization, compile-time defines, and "generate" blocks, which can be challenging to use, difficult to debug, and restrictive on approaches.
    • People often rely on perl scripts to bridge the gap for iteratively generating more complex hardware or stitching together large numbers of modules.
  • Testbenches are, at the end of the day, software. SystemVerilog is arguably a terrible programming language, since it is primarily focused at hardware description, which makes developing testbenches excessively challenging. Basic software quality-of-life features are missing in SystemVerilog.
    • Mitigating the problem by connecting to other languages through DPI calls (e.g. C++ or SystemC) has it's own complexities with extra header files, difficulty modelling parallel execution and edge events, passing callbacks, etc.
    • UVM throws macros and boilerplate at the problem, which doesn't resolve the underlying limitations.

ROHD aims to enable all the best parts of SystemVerilog, while completely eliminating each of the above issues. Build is automatic and part of Dart, packages and files can just be imported as needed, no vendor tools are required, hardware can be constructed using all available software constructs, and Dart is a fully-featured modern software language with modern features.

You can read more about SystemVerilog here: https://en.wikipedia.org/wiki/SystemVerilog

Chisel

Chisel is a domain specific language (DSL) built on top of Scala, which is built on top of the Java virtual machine (JVM). The goals of Chisel are somewhat aligned with the goals of ROHD. Chisel can also convert to SystemVerilog.

  • The syntax of Scala (and thus Chisel) is probably less familiar-feeling to most hardware engineers, and is arguably more verbose and subjectively uglier than ROHD with Dart.
  • Scala and the JVM are arguably less user friendly to debug than Dart code.
  • Chisel is focused mostly on the hardware designer rather than the validator. Many of the design choices for the language are centered around making it easier to parameterize and synthesize logic. ROHD was created with validators in mind.
  • Chisel is built on top of a programming language via extensions, and then compiles/converts into SystemVerilog. This is different from ROHD which is a framework written in a programming language. With Chisel, code you write directly represents hardware, while in ROHD code you write in Dart constructs hardware. The difference is subtle, but it means there's no restrictions on what features of Dart you can use to construct the hardware, while Chisel has some restrictions on software constructs that can generate synthesizable hardware.
  • Chisel generates logic that's closer to a netlist than what a similar implementation in SystemVerilog would look like. This can make it difficult to debug or validate generated code. ROHD generates structurally similar SystemVerilog that looks close to how you might write it.
  • Chisel does not have a built-in simulator like ROHD. To simulate the code, it must be translated to the netlist-like SystemVerilog and simulated in another simulator like Verilator.

Read more about Chisel here: https://www.chisel-lang.org/

MyHDL (Python)

There have been a number of attempts to create a HDL on top of Python, but it appears the MyHDL is one of the most mature options. MyHDL has many similar goals to ROHD, but chose to develop in Python instead of Dart. MyHDL can also convert to SystemVerilog.

  • MyHDL uses "generators" and decorators to help model concurrent behavior of hardware, which is arguably less user-friendly and intuitive than async/await and event based simulation in ROHD.
  • While Python is a great programming langauge for the right purposes, some language features of Dart make it better for representing hardware. Above is already mentioned Dart's isolates and async/await, which don't exist in the same way in Python. Dart is statically typed with null safety while Python is dynamically typed, which can make static analysis (including intellisense, type safety, etc.) more challenging in Python. Python can also be challenging to scale to large programs without careful architecting.
  • Python is inherently slower to execute than Dart.
  • MyHDL has support for cosimulation via VPI calls to SystemVerilog simulators. The MyHDL C/VPI implementation is gratefully reused within a separate package in the ROHD ecosystem for cosimulation.

Read more about MyHDL here: http://www.myhdl.org/

High-Level Synthesis (HLS)

High-Level Synthesis (HLS) uses a subset of C++ and SystemC to describe algorithms and functionality, which EDA vendor tools can compile into SystemVerilog. The real strength of HLS is that it enables design exploration to optimize a higher-level functional intent for area, power, and/or performance through proper staging and knowledge of the characteristics of the targeted process.

  • HLS is a step above/away from RTL-level modelling, which is a strength in some situations but might not be the right level in others.
  • HLS uses C++/SystemC, which is arguably a less "friendly" language to use than Dart.

Read more about one example of an HLS tool (Cadence's Stratus tool) here: https://www.cadence.com/en_US/home/tools/digital-design-and-signoff/synthesis/stratus-high-level-synthesis.html

There are a number of other attempts to make HLS better, including XLS and Dhalia. There are discussions on ways to reasonably incorporate some of the strengths of HLS approaches into ROHD.

Transaction Level Verilog (TL-Verilog)

Transaction Level Verilog (TL-Verilog) is like an extension on top of SystemVerilog that makes pipelining simpler and more concise.

  • TL-Verilog makes RTL design easier, but doesn't really add much in terms of verification
  • Abstraction of pipelining is something that could be achievable with ROHD, but is not (yet) implemented in base ROHD.

Read more about TL-Verilog here: https://www.redwoodeda.com/tl-verilog

PyMTL

PyMTL is another attempt at creating an HDL in Python. It is developed at Cornell University and the third version (PyMTL 3) is currently in Beta. PyMTL aims to resolve a lot of the same things as ROHD, but with Python. It supports conversion to SystemVerilog and simulation.

  • The Python language trade-offs described in the above section on MyHDL apply to PyMTL as well.

Read more about PyMTL here: https://github.com/pymtl/pymtl3 or https://pymtl3.readthedocs.io/en/latest/

cocotb

cocotb is a Python-based testbench framework for testing SystemVerilog and VHDL designs. It makes no attempt to represent hardware or create a simulator, but rather connects to other hardware simulators via things like VPI calls.

Read more about cocotb here: https://github.com/cocotb/cocotb or https://docs.cocotb.org/en/stable/


2021 August 6
Author: Max Korbel <[email protected]>

Copyright (C) 2021 Intel Corporation
SPDX-License-Identifier: BSD-3-Clause

Comments
  • Strange input signal behavior

    Strange input signal behavior

    Describe the bug

    The incoming signal behaves incorrectly in a certain case. Adding a useless assignment operator solves the problem.

    To Reproduce

    Steps to reproduce the behavior:

    1. Get project
    2. Go to file and comment highlighted line
    3. Run another file

    Expected behavior

    The "codepoint" input does not require the use of a useless assignment operator to work correctly.

    Actual behavior

    The "codepoint" input does not work correctly.

    Additional details

    Dart SDK version: 2.18.0 (stable) (Fri Aug 26 10:22:54 2022 +0000) on "linux_x64"
    
    name: utf8encoder_hw
    version: 0.1.0-prototype.1
    description: A hardware UTF-8 encoder written in Dart using the ROHD framework.
    repository: https://github.com/chykon/utf8encoder-hw
    issue_tracker: https://github.com/chykon/utf8encoder-hw/issues
    
    environment:
      sdk: '>=2.18.0 <3.0.0'
    
    dependencies:
      rohd: ^0.3.2
    
    dev_dependencies:
      test: ^1.21.5
      very_good_analysis: ^3.0.1
    

    Additional context To me, this is some weird issue that occurs with code point U+2020 but does not occur with U+2019 and U+2021. I also want to note that I encountered a problem when testing using this file. Before the appearance of the U+2020 code point, there are many other three-byte sequences in the file, but there are no problems with them.

    bug 
    opened by chykon 8
  • Assignment missing from generated SystemVerilog

    Assignment missing from generated SystemVerilog

    Describe the bug

    Assignment missing from generated SystemVerilog.

    To Reproduce

    Use code:

    import 'dart:io';
    import 'package:rohd/rohd.dart';
    
    class ExampleModule extends Module {
      ExampleModule() {
        final out = addOutput('out');
        final val = Logic(name: 'val');
        val <= Const(1);
    
        Combinational([
          out < val,
        ]);
      }
    
      Logic get out => output('out');
    }
    
    Future<void> main() async {
      final exampleModule = ExampleModule();
      await exampleModule.build();
      File('code.sv').writeAsStringSync(exampleModule.generateSynth());
      WaveDumper(exampleModule);
      print(exampleModule.out.value);
    }
    

    The console output is correct:

    1'h1
    Exited
    

    But the file with SystemVerilog code:

    /**
     * Generated by ROHD - www.github.com/intel/rohd
     * Generation time: 2022-09-19 17:16:56.034245
     */
    
    module ExampleModule(
    output logic out
    );
    logic val;
    
    //  combinational
    always_comb begin
      out = val;
    end
    
    endmodule : ExampleModule
    

    Expected behavior

    The generated SystemVerilog code has an assignment for the "val" variable.

    Actual behavior

    The variable "val" contains an unknown bit.

    Additional details

    Dart SDK version: 2.18.0 (stable) (Fri Aug 26 10:22:54 2022 +0000) on "linux_x64"
    
    name: package
    
    environment:
      sdk: '>=2.14.0 <3.0.0'
    
    dependencies:
      rohd: ^0.3.2
    
    bug 
    opened by chykon 5
  • [FIX-issue#99] Allowing negative logic index values

    [FIX-issue#99] Allowing negative logic index values

    Issue #99

    • Now one can use negative values in indices for indexing or subset slicing.
    • This effect is applied on BusSubset that is used by Logic slice()
    • Indirectly this effect is also passed to function that uses slice() like operator[] (indexing operator) and getRange()
    opened by RPG-coder-intc 5
  • Make it easier to construct a single-bit `LogicValues` and `LogicValue` from a single bool

    Make it easier to construct a single-bit `LogicValues` and `LogicValue` from a single bool

    Is your feature request related to a problem? Please describe. To build a LogicValues using existing constructors from a bool can be a bit verbose:

    LogicValues.from([myBool ? LogicValue.one : LogicValue.zero]);
    

    Describe the solution you'd like It would be nice to do something like:

    LogicValues.fromBool(myBool);
    

    Something similar in LogicValue would be nice too.

    enhancement good first issue 
    opened by mkorbel1 5
  • [Uncertain]Incorrect behavior of non-blocking assignment in simulation result

    [Uncertain]Incorrect behavior of non-blocking assignment in simulation result

    Describe the bug

    The waveform generated by the ROHD simulator doesn't have same behavior like other simulators such as modelsim. I need some helps to clarify this bug.

    To Reproduce

    Full dart code file delay_signal.txt Please change the file extension to dart. Core part:

        List<Logic> _z = List<Logic>.generate(depth, (index) => Logic(width: bitWidth));
    
        var out = addOutput('out', width: bitWidth);
    
        List<ConditionalAssign> _zList = [_z[0] < inputVal];
        for(int i = 0; i<_z.length;i++){
        // for(int i = _z.length-1; i>=0;i--){
          if(i == _z.length-1){
            _zList.add(out < _z[i]);
          }else{
            _zList.add(_z[i+1] < _z[i]);
          }
        }
    
        Sequential(clk, [
          IfBlock([
            Iff(en, _zList
            ),
            Else([
              out < 0,
            ])
          ])
        ]);
      }
    

    Steps to reproduce the behavior:

    1. Run a simulation with ROHD
    2. See the waveform from gtkwave

    Expected behavior

    The input value should be appeared in the out value after few clock cycles.

    Generated systemverilog:

    //  sequential
    always_ff @(posedge clk) begin
      if(en) begin
          s0 <= inputVal;
          s1 <= s0;
          s2 <= s1;
          s3 <= s2;
          s4 <= s3;
          out <= s4;
      end   else begin
          out <= 0;
      end 
    end
    

    modelsim/others result: <- Correct result image ROHD result: image

    Actual behavior

    The out value directly equal to the input val at the first positive edge.

    Additional details

    Please paste the output of dart --version

    > dart --version
    Dart SDK version: 2.15.1 (stable) (Unknown timestamp) on "linux_x64"
    

    Please paste the contents of your pubspec.yaml file and identify the version of ROHD you're using

    name: delay_signal
    description: A simple command-line application.
    version: 1.0.0
    
    environment:
      sdk: '>=2.14.3 <3.0.0'
    
    
    # dependencies:
    #   path: ^1.8.0
    dependencies:
      rohd:
        git:
          url: https://github.com/intel/rohd.git
          ref: main
    
    
    dev_dependencies:
      lints: ^1.0.0
    
    bug 
    opened by wswongat 4
  • Feature/logicvalue_ofbool

    Feature/logicvalue_ofbool

    Description & Motivation

    When helping another Intel Engineer using Rohd, I found the lack of conversion from bool to a LogicValue inconvenient, so I'm proposing adding this helper function to make LogicValues slightly more convenient.

    Related Issue(s)

    None

    Testing

    Added new test cases in logic-values_test.dart just for this feature.

    Backwards-compatibility

    Is this a breaking change that will not be backwards-compatible? If yes, how so?

    No breaking change

    Documentation

    Does the change require any updates to documentation? If so, where? Are they included?

    Hopefully the API comment I added before the function translates properly into documentation there. I'm not sure how to generate/test this locally.

    opened by eric-norige 4
  • Support multiple triggers on flops

    Support multiple triggers on flops

    Is your feature request related to a problem? Please describe. Support multiple triggers for flops, like in SystemVerilog:

    always_ff @(posedge clk or posedge reset)
    

    Describe the solution you'd like The FF and FlipFlop should have a syntax that accepts a list of signals instead of a single clk signal.

    Describe alternatives you've considered Using something like clk | reset is insufficient because there could be a rising edge of reset during a clock high period.

    enhancement 
    opened by mkorbel1 4
  • [Issue-112] Automatically extract rohd version from pubspec to add into generated sv

    [Issue-112] Automatically extract rohd version from pubspec to add into generated sv

    Description & Motivation

    It would be nice if the generated outputs (e.g. SystemVerilog, waveform dumps) had a guaranteed accurate version number of ROHD that generated them. A version number (from pubspec.yaml) would be good, but even better would be to also include a git hash, so it can be determined exactly what generated the code.

    Related Issue(s)

    issue #112

    Testing

    Add test to expect the rohd version and git commit are available in the generated system verilog code generation.

    Backwards-compatibility

    Is this a breaking change that will not be backwards-compatible? If yes, how so?

    no.

    Documentation

    Does the change require any updates to documentation? If so, where? Are they included?

    Ya, added to each of the file created.

    opened by quekyj 3
  • resolves #153

    resolves #153

    Description & Motivation

    Modified the overloaded operator[] on Logic so that it can accept either an int or another Logic, and appropriately generates hardware if necessary (if it's a Logic).

    Related Issue(s)

    resolves #153

    Testing

    Added unit test: 'simcompare Index by Logic test'

    Backwards-compatibility

    Is this a breaking change that will not be backwards-compatible? If yes, how so?

    No. Fully backward compatible.

    Documentation

    Does the change require any updates to documentation? If so, where? Are they included?

    No.

    opened by akshay-wankhede 3
  • Add a test against multiple sequential drivers on the same signal

    Add a test against multiple sequential drivers on the same signal

    Motivation

    It doesn't make sense for a signal to be driven by two drivers in a Sequential block. The code already prevents this, but testing is incomplete.

    Desired solution

    Add a test ensuring that an exception is thrown when there are multiple drivers for a flop.

    enhancement good first issue 
    opened by mkorbel1 3
  • Add operations for sign and zero extending

    Add operations for sign and zero extending

    Motivation

    Padding width of signals (either signed or unsigned) is a bit too verbose. It would be nice to be able to extend/pad Logic and LogicValues.

    Desired solution

    Operation on Logic and LogicValues that return zero extended and sign extended versions with larger width.

    Alternatives considered

    Existing solution requires using something like swizzle.

    enhancement 
    opened by mkorbel1 3
  • Fix combinational sensitivity excessive pessimism, fix #233

    Fix combinational sensitivity excessive pessimism, fix #233

    Description & Motivation

    Issue #233 finds that searches for Combinational sensitivity lists, it is excessively pessimistic in that sometimes there aren't really any combinational paths, but it assumes that there may be. This can cause an issue where a false combinational loop is detected, causing incorrect X-generation.

    This PR fixes the bug by calculating more detailed combinational paths for Modules at build time. This information can be leveraged by Combinational to understand more accurately where combinational paths may exist. Results are cached to avoid repeated calculations when multiple Combinationals search through similar paths of potential sensitivities. All Modules with custom functionality must explicitly define any combinational paths from all inputs to applicable outputs or else Combinational will be unable to properly determine an accurate sensitivity list. A new FullyCombinational mixin is included in this PR to automatically add all input/output combinations as potential combinational paths, since that's a common case for many small custom gates.

    Additionally,

    • Added RohdException base type for all ROHD exceptions, making it easier to handle ROHD-related exceptions
    • Added new ModuleNotBuiltException, used in multiple places in Module

    Related Issue(s)

    Fix #233

    Testing

    • Added a new test that had reproduced the original issue without this fix.
    • Existing tests cover scenarios where non-trivial sensitivities exist.

    Backwards-compatibility

    Is this a breaking change that will not be backwards-compatible? If yes, how so?

    Other custom functionality modules defined outside of the ROHD framework which had previously benefited from assumption of the behavior of FullyCombinational will now be treated as the complete opposite (no combinational paths). This could mean Combinationals would now be missing sensitivities that previously existed. If those sensitivities were true, then existing simulations in ROHD might now have incorrect behavior. This is likely rare, and since this is really a bug fix it doesn't quite feel like it's breaking backwards-compatibility.

    Documentation

    Does the change require any updates to documentation? If so, where? Are they included?

    Doc comments updated/included

    opened by mkorbel1 0
  • A helper function to save generated System Verilog string as a file

    A helper function to save generated System Verilog string as a file

    Motivation

    I'm wondering if we can have a helper function to save system Verilog module generateSynth() to a file. Its a pain to keep copy pasting the code below to keep track of system verilog code generated.

    import 'dart:io';
    
    final res = mod.generateSynth();
    final out = File('output.txt').openWrite();
    out. Write(res);
    
    File('temp.sv').writeAsStringSync(myString);
    

    I am thinking maybe someone who also beneficial to have the system verilog .sv file as well.

    Desired solution

    There are two ways I can think of.

    First is update:

    • generateSynth() function to receive arguments like generateSynth(toFile=true, path='./mypath/simMod.sv)'
    • Note that this might cause breaking changes as openWrite().close() will return Future<void>.

    Second:

    • Create a static helper function to just dump in string to any file format.

    Alternatives considered

    No response

    Additional details

    No response

    enhancement 
    opened by quekyj 0
  • Add helper function(s) to

    Add helper function(s) to "split" `Logic`s and `LogicValue`s

    Motivation

    Some common use cases:

    • Split a bus into individual bits to be processed independently
    • Split a bus into chunks of equal size (e.g. bytes)
    • Split a bus into chunks of unequal size (e.g. decoding a header with various fields)

    Desired solution

    A generic and powerful solution that applies to these and more cases would be ideal. It would be useful to have matching APIs for both Logic and LogicValue.

    Alternatives considered

    No response

    Additional details

    No response

    enhancement 
    opened by mkorbel1 0
  • Gates should output `X` (never `Z`) when inputs are invalid

    Gates should output `X` (never `Z`) when inputs are invalid

    Describe the bug

    Some gates (e.g. the Mux) will potentially output a Z if the input (e.g. the control) is a Z instead of outputting an X. We should fix the Mux and also search for any other gates or built-in modules that may be outputting a Z instead of an X when inputs are invalid.

    To Reproduce

    Set the control on Mux to Z, and observe output value.

    Expected behavior

    Output is X

    Actual behavior

    Output is Z

    Additional: Dart SDK info

    No response

    Additional: pubspec.yaml

    No response

    Additional: Context

    No response

    bug 
    opened by mkorbel1 0
  • `Port` should validate that names are sanitary

    `Port` should validate that names are sanitary

    Describe the bug

    When creating a Port, the expectation is that the name will not change. Since Port extends from Logic, and Logic was updated to prevent names from being unsanitary by renaming them using the Sanitizer, it is now possible that the name will be sanitized silently, leading to bugs down the line.

    Usually, it's not a good idea to name a port an unsanitary name ever, but sometimes it makes sense to want to name it something unsanitary if you know it will always be uniquified such that it will not actually be unsanitary on an interface.

    To Reproduce

    Name a Port a SystemVerilog keyword (e.g. "end"), uniqufiy it so that it's a legal name on an interface, then attempt to access port("end")

    Expected behavior

    When constructing a Port, it will immediately throw an exception if the name is not sanitary.

    Actual behavior

    Port name is silently sanitized, making port calls unable to find the port.

    Additional: Dart SDK info

    No response

    Additional: pubspec.yaml

    No response

    Additional: Context

    Exists/introduced in ROHD v0.4.1

    bug good first issue 
    opened by mkorbel1 2
  • `Combinational` sensitivity detection is excessively pessimistic

    `Combinational` sensitivity detection is excessively pessimistic

    Describe the bug

    The current implementation that searches for expanded sensitivity lists in Combinational will not look "inside" other Modules along the path from its outputs to inputs. If a Sequential is inside of another Module along the path, it will skip over it assuming that any input may have a combinational path to any output. This is excessively pessimistic, and can lead to detection of non-existent combinational loops in Logic reentrance checking.

    To Reproduce

    Connections like shown below will reproduce this issue:

      ______________________
      | Module             |
    --|<-- [Sequential] <--|--
    | |____________________| |
    |                        |
    ---->[Combinational]----->
    

    If the combinational in the diagram is also responsible for driving some other input to the module, it can cause a false combinational loop detection.

    Expected behavior

    No invalid detection of combinational loops.

    Actual behavior

    X generation due to reentrance detection in Logic.put

    Additional: Dart SDK info

    No response

    Additional: pubspec.yaml

    No response

    Additional: Context

    No response

    bug 
    opened by mkorbel1 0
Releases(v0.4.1)
  • v0.4.1(Dec 16, 2022)

    What's Changed

    • resolves #153 by @akshay-wankhede in https://github.com/intel/rohd/pull/171
    • resolves issue #138 by @quekyj in https://github.com/intel/rohd/pull/190
    • Fixes: 157 by @akshay-wankhede in https://github.com/intel/rohd/pull/203
    • Fix bugs related to module naming and instantiation by @mkorbel1 in https://github.com/intel/rohd/pull/207
    • Allow constants for modulo and shift operations on Logic by @mkorbel1 in https://github.com/intel/rohd/pull/208
    • Fix typo on modulo test by @mkorbel1 in https://github.com/intel/rohd/pull/209
    • _Wires underneath Logics by @mkorbel1 in https://github.com/intel/rohd/pull/199
    • Fix bugs related to 64-bit int conversion, fix #212 by @mkorbel1 in https://github.com/intel/rohd/pull/213
    • [Issue-12] simpler constructor of simple control blocks by @quekyj in https://github.com/intel/rohd/pull/210
    • Replace awkward map+reduce chain with smart literal by @eric-norige in https://github.com/intel/rohd/pull/214
    • Optimize LogicValue operations to avoid Strings where possible by @mkorbel1 in https://github.com/intel/rohd/pull/215
    • [Issue-112] Automatically extract rohd version from pubspec to add into generated sv by @quekyj in https://github.com/intel/rohd/pull/200
    • Fix bug related to late connection signal prop with wires by @mkorbel1 in https://github.com/intel/rohd/pull/218
    • Fixed LogicValue hash and equality inconsistency by forcing construction consistency by @mkorbel1 in https://github.com/intel/rohd/pull/217
    • Fix the tree example doc by @mkorbel1 in https://github.com/intel/rohd/pull/222
    • [Issue-114] Add test to sequential driver on same signal to return Exception by @quekyj in https://github.com/intel/rohd/pull/197

    New Contributors

    • @akshay-wankhede made their first contribution in https://github.com/intel/rohd/pull/171
    • @quekyj made their first contribution in https://github.com/intel/rohd/pull/190

    Full Changelog: https://github.com/intel/rohd/compare/v0.4.0...v0.4.1

    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Oct 24, 2022)

    What's Changed

    • Fix #163 - invalid generated SystemVerilog for bit slicing on expressions by @mkorbel1 in https://github.com/intel/rohd/pull/164
    • fix constant collapsing, fix #159 by @mkorbel1 in https://github.com/intel/rohd/pull/160
    • Fix Combinational sensitivity detection - Issue #158 by @mkorbel1 in https://github.com/intel/rohd/pull/166
    • Improve performance of Combinational execute by @mkorbel1 in https://github.com/intel/rohd/pull/156
    • Rework script "run_coverage" by @chykon in https://github.com/intel/rohd/pull/173
    • Use issue forms instead of old template by @chykon in https://github.com/intel/rohd/pull/176
    • Upgrade lints package, make lints more strict, and fix new lint errors by @mkorbel1 in https://github.com/intel/rohd/pull/174
    • [FIX-issue#99] Allowing negative logic index values by @RPG-coder-intc in https://github.com/intel/rohd/pull/155
    • Remove accidental dontDeleteTmpFiles for a bus test by @mkorbel1 in https://github.com/intel/rohd/pull/178
    • Improving GitHub Actions workflow and local testing by @chykon in https://github.com/intel/rohd/pull/177
    • Fix badges in readme after workflow changes by @mkorbel1 in https://github.com/intel/rohd/pull/179
    • Increase Dart SDK version by @chykon in https://github.com/intel/rohd/pull/181
    • Fix #183, parsing of unsigned large binary integers by @mkorbel1 in https://github.com/intel/rohd/pull/184
    • Update to contributor covenant v2.1 (fix #182) by @mkorbel1 in https://github.com/intel/rohd/pull/185
    • Expose synthesis results from synth builder (fix #172) by @mkorbel1 in https://github.com/intel/rohd/pull/186
    • Rename topModuleName to definitionName in ExternalSystemVerilogModule by @mkorbel1 in https://github.com/intel/rohd/pull/187
    • Clean up names for ports by @mkorbel1 in https://github.com/intel/rohd/pull/188
    • Add full SV reserved keyword list to sanitizer, fix #168 by @mkorbel1 in https://github.com/intel/rohd/pull/189

    New Contributors

    • @chykon made their first contribution in https://github.com/intel/rohd/pull/173
    • @RPG-coder-intc made their first contribution in https://github.com/intel/rohd/pull/155

    Full Changelog: https://github.com/intel/rohd/compare/v0.3.2...v0.4.0

    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Aug 19, 2022)

    What's Changed

    • Finished commit for FSM by @shubskmr in https://github.com/intel/rohd/pull/127
    • Fix for issue #126 Simulator reset does not wait for simulation to complete and test to reproduce the issue by @madhuriakella in https://github.com/intel/rohd/pull/131
    • add modulo support by @chaparalas in https://github.com/intel/rohd/pull/136
    • Add Discord server information by @mkorbel1 in https://github.com/intel/rohd/pull/143
    • Added actions to execute at the end of the simulation by @mkorbel1 in https://github.com/intel/rohd/pull/149
    • Moved wave dump file writing to be async for performance by @mkorbel1 in https://github.com/intel/rohd/pull/150

    New Contributors

    • @madhuriakella made their first contribution in https://github.com/intel/rohd/pull/131
    • @chaparalas made their first contribution in https://github.com/intel/rohd/pull/136

    Full Changelog: https://github.com/intel/rohd/compare/v0.3.1...v0.3.2

    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Jun 6, 2022)

    What's Changed

    • Fix #129, waveform dump bug for multi-bit values by @mkorbel1 in https://github.com/intel/rohd/pull/130

    Full Changelog: https://github.com/intel/rohd/compare/v0.3.0...v0.3.1

    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(May 5, 2022)

    What's Changed

    • Module hierarchy tracing fixes by @mkorbel1 in https://github.com/intel/rohd/pull/85
    • Provide the ability to reserve instance names and provide + reserve definition names by @mkorbel1 in https://github.com/intel/rohd/pull/86
    • Fix typo in README by @eric-norige in https://github.com/intel/rohd/pull/87
    • Enhanced bin() to ignore '_'. Ticket - https://github.com/intel/rohd/… by @shubskmr in https://github.com/intel/rohd/pull/88
    • Add explicit width to Const generated SystemVerilog by @mkorbel1 in https://github.com/intel/rohd/pull/94
    • Refactor to combine LogicValue and LogicValues into LogicValue, plus some related adjustments by @mkorbel1 in https://github.com/intel/rohd/pull/115
    • Various features and testing for Logic and LogicValue by @mkorbel1 in https://github.com/intel/rohd/pull/121

    New Contributors

    • @shubskmr made their first contribution in https://github.com/intel/rohd/pull/88

    Full Changelog: https://github.com/intel/rohd/compare/v0.2.0...v0.3.0

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Feb 9, 2022)

    What's Changed

    • Convert forEach loops to make debug easier by @mkorbel1 in https://github.com/intel/rohd/pull/68
    • Feature/logicvalue_ofbool by @eric-norige in https://github.com/intel/rohd/pull/71
    • Improve logicValues testing, fixing todos by @eric-norige in https://github.com/intel/rohd/pull/73
    • Initial implementation of more robust tests for LogicValue and LogicV… by @kimmeljo in https://github.com/intel/rohd/pull/21
    • Adjustments to Interface by @mkorbel1 in https://github.com/intel/rohd/pull/74
    • modified swizzle functionality and added capability to values by @mkorbel1 in https://github.com/intel/rohd/pull/75
    • "External" module updates by @mkorbel1 in https://github.com/intel/rohd/pull/76
    • Added a new test for injection on flop clocks by @mkorbel1 in https://github.com/intel/rohd/pull/78
    • Fixed #79 bug related to Sequential sampling by @mkorbel1 in https://github.com/intel/rohd/pull/80
    • Added a FIR filter example by @wswongat in https://github.com/intel/rohd/pull/81
    • Replace from with of, plus a couple small fixes by @mkorbel1 in https://github.com/intel/rohd/pull/82

    New Contributors

    • @eric-norige made their first contribution in https://github.com/intel/rohd/pull/71
    • @kimmeljo made their first contribution in https://github.com/intel/rohd/pull/21
    • @wswongat made their first contribution in https://github.com/intel/rohd/pull/81

    Full Changelog: https://github.com/intel/rohd/compare/v0.1.2...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Dec 6, 2021)

    What's Changed

    • Move counter.dart to example.dart for pub.dev visibility by @mkorbel1 in https://github.com/intel/rohd/pull/62
    • Make some LogicValues types const for performance by @mkorbel1 in https://github.com/intel/rohd/pull/63
    • Sequential and Sequential.multi by @mkorbel1 in https://github.com/intel/rohd/pull/65
    • Improve exception and error messaging by @mkorbel1 in https://github.com/intel/rohd/pull/67

    Full Changelog: https://github.com/intel/rohd/compare/v0.1.1...v0.1.2

    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Nov 30, 2021)

    What's Changed

    • Update instructions to depend on ROHD by @mkorbel1 in https://github.com/intel/rohd/pull/51
    • Updated ROHD Verification Framework references in documentation by @mkorbel1 in https://github.com/intel/rohd/pull/54
    • Dart automatic formatting by @mkorbel1 in https://github.com/intel/rohd/pull/55
    • Fix #38: Interface.connectIO bug with no tags specified by @mkorbel1 in https://github.com/intel/rohd/pull/58
    • Fix uniquified Interface.getPorts bug, add tests, and improve documentation by @mkorbel1 in https://github.com/intel/rohd/pull/60

    Full Changelog: https://github.com/intel/rohd/compare/v0.1.0...v0.1.1

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Nov 10, 2021)

FIDL(Flutter Interface Definition Language) is a language for transfer objects cross platforms.

Flutter Interface Definition Language (FIDL) README in English(TODO) FIDL 即 Flutter 接口定义语言,类似于AIDL(Android Interface Definition Language)。您可以利用它定义不同平台

null 47 Dec 7, 2022
Encode App-Dev is a open source project which contains different projects of Application development, Android development, IOS development, Flutter, Kotlin, Dart, Java, Swift etc.

HACKTOBERFEST 2022 Encode App-Dev is an open source project which contains different projects of Application development, Android development, IOS dev

null 4 Dec 4, 2022
Example of verifying cryptographically signed and encrypted license files using Dart, Ed25519 and AES-256-GCM

Example Dart Cryptographic License Files This is an example of how to verify and decrypt cryptographic license files in Dart, using Ed25519 signature

Keygen 4 Oct 27, 2022
Software analytics tool that helps developers analyse and improve software quality.

Dart Code Metrics Note: you can find the full documentation on the website Configuration | Rules | Metrics | Anti-patterns Dart Code Metrics is a stat

Dart Code Checker 745 Dec 26, 2022
A simple dart library for extracting the Open Graph protocol on a web pages

ogp_data_extract A simple dart library for extracting the Open Graph protocol on

KINTO 0 Jan 12, 2022
Flutter package for sending and verifying SMS/OTP

Flutter Termii A Flutter plugin that helps developers use messaging channels to verify and authenticate customer transactions Android iOS Linux macOS

Abdulazeez Oshinowo 5 May 26, 2022
Open source Flutter-based GUI application that enables you to interact with Amphitheatre

Amphitheatre Desktop Amphitheatre Desktop is an open source Flutter-based application that enables you to interact with Amphitheatre using a GUI inste

Amphitheatre 17 Dec 16, 2022
Call Kit is a prebuilt feature-rich call component, which enables you to build one-on-one and group voice/video calls into your app with only a few lines of code.

Call Kit (ZegoUIKitPrebuiltCall) Call Kit is a prebuilt feature-rich call component, which enables you to build one-on-one and group voice/video calls

ZEGOCLOUD 9 Dec 26, 2022
Docker images for the Dart programming language (https://dart.dev)

dart-docker This is the Git repo of the Docker "Official Images" for the Dart programming language. See the Docker Hub page for a full description on

Dart 49 Dec 14, 2022
App concept created with Flutter using Dart programming language, inspired by Groceries Shopping App Interaction.

Grocery Shop Flutter App concept created with Flutter using Dart programming language, inspired by Groceries Shopping App Interaction. About The app w

Wilton Neto 485 Dec 9, 2022
The component created with Flutter using Dart programming language, inspired in Fluid Slider by Ramotion.

Fluid Slider Flutter The component created with Flutter using Dart programming language, inspired in Fluid Slider by Ramotion. About The component was

Wilton Neto 41 Sep 30, 2022
Flutter component concept created with Flutter using Dart programming language, inspired by Gooey Rab Bar.

Gooey Tab Bar Flutter Flutter component concept created with Flutter using Dart programming language, inspired by Gooey Tab Bar. About This component

Wilton Neto 216 Dec 14, 2022
A Flutter Enterprise Software Development Architecture. Start to develop your bigger app easily.

A Flutter Enterprise Software Development Architecture. Start to develop your bigger app easily.

Shibaji Debnath 36 Jan 7, 2023
A Flutter repo with a ready-to-go architecture containing flavors, bloc, device settings, json serialization and connectivity

Flutter Ready to Go A Flutter repo with a ready-to-go architecture containing flavors, bloc, device settings, json serialization and connectivity. Why

null 139 Nov 11, 2022
This repository was created to provide the basics of the Dart programming language and Its use cases.

dart-exercises A collection of source code of the Dart Programming language. How does this repository works? Clone / Fork this repository to make your

Technosoft Labs 2 Oct 28, 2021
Implementation of data structures and algorithms in Dart programming language.

Algorithms in Dart Implementation of several algorithms with Dart programming language. Use dartdoc to generate documentation. Lists List data structu

Mafinar Khan 197 Dec 24, 2022
🇮🇪 A generic programming language interpreter, linter, formatter, and all that jazz, written in Dart.

Irishman ???? A generic programming language interpreter, linter, formatter, and all that jazz, written in Dart. Installation To install this package

Fairfield Programming Association 2 Oct 8, 2022
Repo for Teach Yourself mastering dart programming language

mastering-dart Repo for Teach Yourself mastering dart programming language Chapter Membuat Aplikasi Pertama Menggunakan Dart Percabangan Perulangan Fu

Feri Lukmansyah 50 Nov 10, 2022