EDA Playground lets you type in and run HDL code (using a selection of free and commercial simulators and synthesizers).
It's great for learning HDLs, it's great for testing out unfamiliar things and it's great for sharing code.
You can start typing straight away. But to run your code, you'll need to sign or log in. Logging in with a Google account gives you access to all non-commercial simulators and some commercial simulators:
To run commercial simulators, you need to register and log in with a username and password. Registration is free, and only pre-approved email's will have access to the commercial simulators.
211
//------------------------------------------------------------------------------
// Module: top
//------------------------------------------------------------------------------
module top;
import uvm_pkg::*;
reg clk;
jelly_bean_if jb_if( clk );
jelly_bean_taster dut( jb_if ); // DUT
initial begin // clock
clk = 0;
forever #5ns clk = ! clk;
end
initial begin // waveform
$dumpfile( "dump.vcd" );
$dumpvars( 0, top );
end
initial begin
uvm_config_db#( virtual jelly_bean_if )::set( .cntxt( null ),
.inst_name( "uvm_test_top.*" ),
.field_name( "jb_if" ),
.value( jb_if ) );
run_test();
end
endmodule: top
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
//------------------------------------------------------------------------------
// Package: jelly_bean_pkg
//------------------------------------------------------------------------------
package jelly_bean_pkg;
import uvm_pkg::*;
typedef enum bit [2:0] { NO_FLAVOR, APPLE, BLUEBERRY, BUBBLE_GUM, CHOCOLATE } flavor_e;
typedef enum bit [1:0] { RED, GREEN, BLUE } color_e;
typedef enum bit [1:0] { UNKNOWN, YUMMY, YUCKY } taste_e;
`include "transactions.svh"
`include "sequences.svh"
`include "agent.svh"
`include "env.svh"
`include "test.svh"
endpackage: jelly_bean_pkg
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
//------------------------------------------------------------------------------
// Class: jelly_bean_transaction
//------------------------------------------------------------------------------
class jelly_bean_transaction extends uvm_sequence_item;
`uvm_object_utils( jelly_bean_transaction )
randc flavor_e flavor;
rand color_e color;
rand bit sugar_free;
rand bit sour;
taste_e taste;
constraint flavor_color_con {
flavor != NO_FLAVOR;
flavor == APPLE -> color != BLUE;
flavor == BLUEBERRY -> color == BLUE;
}
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name = "jelly_bean_transaction" );
super.new( name );
endfunction: new
//----------------------------------------------------------------------------
// Function: do_copy
//----------------------------------------------------------------------------
virtual function void do_copy( uvm_object rhs );
jelly_bean_transaction that;
if ( ! $cast( that, rhs ) ) begin
`uvm_error( get_name(), "rhs is not a jelly_bean_transaction" )
return;
end
super.do_copy( rhs );
this.flavor = that.flavor;
this.color = that.color;
this.sugar_free = that.sugar_free;
this.sour = that.sour;
this.taste = that.taste;
endfunction: do_copy
//----------------------------------------------------------------------------
// Function: do_compare
//----------------------------------------------------------------------------
virtual function bit do_compare( uvm_object rhs, uvm_comparer comparer );
jelly_bean_transaction that;
if ( ! $cast( that, rhs ) ) return 0;
return ( super.do_compare( rhs, comparer ) &&
this.flavor == that.flavor &&
this.color == that.color &&
this.sugar_free == that.sugar_free &&
this.sour == that.sour &&
this.taste == that.taste );
endfunction: do_compare
//----------------------------------------------------------------------------
// Function: convert2string
//----------------------------------------------------------------------------
virtual function string convert2string();
string s = super.convert2string();
s = { s, $sformatf( "\nname : %s", get_name() ) };
s = { s, $sformatf( "\nflavor : %s", flavor.name() ) };
s = { s, $sformatf( "\ncolor : %s", color.name() ) };
s = { s, $sformatf( "\nsugar_free: %b", sugar_free ) };
s = { s, $sformatf( "\nsour : %b", sour ) };
s = { s, $sformatf( "\ntaste : %s", taste.name() ) };
return s;
endfunction: convert2string
endclass: jelly_bean_transaction
//------------------------------------------------------------------------------
// Class: sugar_free_jelly_bean_transaction
//------------------------------------------------------------------------------
class sugar_free_jelly_bean_transaction extends jelly_bean_transaction;
`uvm_object_utils( sugar_free_jelly_bean_transaction )
constraint sugar_free_con {
sugar_free == 1;
}
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name = "sugar_free_jelly_bean_transaction" );
super.new( name );
endfunction: new
endclass: sugar_free_jelly_bean_transaction
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
//------------------------------------------------------------------------------
// Class: one_jelly_bean_sequence
//------------------------------------------------------------------------------
class one_jelly_bean_sequence extends uvm_sequence#( jelly_bean_transaction );
`uvm_object_utils( one_jelly_bean_sequence )
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name = "one_jelly_bean_sequence" );
super.new( name );
endfunction: new
//----------------------------------------------------------------------------
// Task: body
//----------------------------------------------------------------------------
task body();
jelly_bean_transaction jb_tx;
jb_tx = jelly_bean_transaction::type_id::create( .name( "jb_tx" ) );
start_item( jb_tx );
assert( jb_tx.randomize() );
finish_item( jb_tx );
endtask: body
endclass: one_jelly_bean_sequence
//------------------------------------------------------------------------------
// Class: same_flavored_jelly_bean_sequence
// Sequence of transactions.
//------------------------------------------------------------------------------
class same_flavored_jelly_bean_sequence extends uvm_sequence#( jelly_bean_transaction );
`uvm_object_utils( same_flavored_jelly_bean_sequence )
rand int unsigned num_jelly_beans; // knob
rand jelly_bean_transaction flavor_setter;
constraint num_jelly_beans_con { num_jelly_beans inside { [2:4] }; }
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name = "" );
super.new( name );
flavor_setter = jelly_bean_transaction::type_id::create( .name( "flavor_setter" ) );
endfunction: new
//----------------------------------------------------------------------------
// Task: body
//----------------------------------------------------------------------------
task body();
jelly_bean_transaction jb_tx;
// flavor_e jb_flavor;
// jb_tx = jelly_bean_transaction::type_id::create( .name( "jb_tx" ) );
// assert( jb_tx.randomize() );
// jb_flavor = jb_tx.flavor;
repeat ( num_jelly_beans ) begin
jb_tx = jelly_bean_transaction::type_id::create( .name( "jb_tx" ) );
start_item( jb_tx );
assert( jb_tx.randomize() with { jb_tx.flavor == flavor_setter.flavor; } );
finish_item( jb_tx );
end
endtask: body
//----------------------------------------------------------------------------
// Function: do_copy
//----------------------------------------------------------------------------
virtual function void do_copy( uvm_object rhs );
same_flavored_jelly_bean_sequence that;
if ( ! $cast( that, rhs ) ) begin
`uvm_error( get_name(), "rhs is not a same_flavored_jelly_bean_sequence" )
return;
end
super.do_copy( rhs );
this.num_jelly_beans = that.num_jelly_beans;
endfunction: do_copy
//----------------------------------------------------------------------------
// Function: do_compare
//----------------------------------------------------------------------------
virtual function bit do_compare( uvm_object rhs, uvm_comparer comparer );
same_flavored_jelly_bean_sequence that;
if ( ! $cast( that, rhs ) ) return 0;
return ( super.do_compare( rhs, comparer ) &&
this.num_jelly_beans == that.num_jelly_beans );
endfunction: do_compare
//----------------------------------------------------------------------------
// Function: convert2string
//----------------------------------------------------------------------------
virtual function string convert2string();
string s = super.convert2string();
s = { s, $sformatf( "\nnum_jelly_beans: %0d", num_jelly_beans ) };
return s;
endfunction: convert2string
endclass: same_flavored_jelly_bean_sequence
//------------------------------------------------------------------------------
// Class: gift_boxed_jelly_bean_sequence
// Sequence of sequences.
//------------------------------------------------------------------------------
class gift_boxed_jelly_bean_sequence extends uvm_sequence#( jelly_bean_transaction );
`uvm_object_utils( gift_boxed_jelly_bean_sequence )
rand int unsigned num_jelly_bean_flavors; // knob
constraint num_jelly_bean_flavors_con { num_jelly_bean_flavors inside { [2:3] }; }
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name = "" );
super.new( name );
endfunction: new
//----------------------------------------------------------------------------
// Task: body
//----------------------------------------------------------------------------
task body();
same_flavored_jelly_bean_sequence jb_seq;
jb_seq = same_flavored_jelly_bean_sequence::type_id::create( .name( "jb_seq" ) );
repeat ( num_jelly_bean_flavors ) begin
// jb_seq = same_flavored_jelly_bean_sequence::type_id::create( .name( "jb_seq" ) );
assert( jb_seq.randomize() );
`uvm_info( get_name(), jb_seq.convert2string(), UVM_NONE )
jb_seq.start( m_sequencer );
end
endtask: body
//----------------------------------------------------------------------------
// Function: do_copy
//----------------------------------------------------------------------------
virtual function void do_copy( uvm_object rhs );
gift_boxed_jelly_bean_sequence that;
if ( ! $cast( that, rhs ) ) begin
`uvm_error( get_name(), "rhs is not a gift_boxed_jelly_bean_sequence" )
return;
end
super.do_copy( rhs );
this.num_jelly_bean_flavors = that.num_jelly_bean_flavors;
endfunction: do_copy
//----------------------------------------------------------------------------
// Function: do_compare
//----------------------------------------------------------------------------
virtual function bit do_compare( uvm_object rhs, uvm_comparer comparer );
gift_boxed_jelly_bean_sequence that;
if ( ! $cast( that, rhs ) ) return 0;
return ( super.do_compare( rhs, comparer ) &&
this.num_jelly_bean_flavors == that.num_jelly_bean_flavors );
endfunction: do_compare
//----------------------------------------------------------------------------
// Function: convert2string
//----------------------------------------------------------------------------
virtual function string convert2string();
string s = super.convert2string();
s = { s, $sformatf( "\nnum_jelly_bean_flavors: %0d", num_jelly_bean_flavors ) };
return s;
endfunction: convert2string
endclass: gift_boxed_jelly_bean_sequence
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
//------------------------------------------------------------------------------
// Typedef: jelly_bean_sequencer
//------------------------------------------------------------------------------
typedef uvm_sequencer#( jelly_bean_transaction ) jelly_bean_sequencer;
//------------------------------------------------------------------------------
// Class: jelly_bean_driver
//------------------------------------------------------------------------------
class jelly_bean_driver extends uvm_driver#( jelly_bean_transaction );
`uvm_component_utils( jelly_bean_driver )
virtual jelly_bean_if jb_vi;
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new
//----------------------------------------------------------------------------
// Function: build_phase
//----------------------------------------------------------------------------
function void build_phase( uvm_phase phase );
super.build_phase( phase );
if ( ! uvm_config_db#( virtual jelly_bean_if )::get
( .cntxt( this ), .inst_name( "" ), .field_name( "jb_if" ), .value( jb_vi ) ) ) begin
`uvm_fatal( get_name(), "jb_if not found" )
end
endfunction: build_phase
//----------------------------------------------------------------------------
// Function: main_phase
//----------------------------------------------------------------------------
task main_phase( uvm_phase phase );
jelly_bean_transaction jb_tx;
forever begin
jb_vi.master_cb.flavor <= NO_FLAVOR;
seq_item_port.get_next_item( jb_tx );
phase.raise_objection( .obj( this ), .description( get_name() ) );
@jb_vi.master_cb;
jb_vi.master_cb.flavor <= jb_tx.flavor;
jb_vi.master_cb.color <= jb_tx.color;
jb_vi.master_cb.sugar_free <= jb_tx.sugar_free;
jb_vi.master_cb.sour <= jb_tx.sour;
seq_item_port.item_done();
@jb_vi.master_cb;
phase.drop_objection( .obj( this ), .description( get_name() ) );
end
endtask: main_phase
endclass: jelly_bean_driver
//------------------------------------------------------------------------------
// Class: jelly_bean_monitor
//------------------------------------------------------------------------------
class jelly_bean_monitor extends uvm_monitor;
`uvm_component_utils( jelly_bean_monitor )
uvm_analysis_port#( jelly_bean_transaction ) jb_ap;
virtual jelly_bean_if jb_vi;
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new
//----------------------------------------------------------------------------
// Function: build_phase
//----------------------------------------------------------------------------
function void build_phase( uvm_phase phase );
super.build_phase( phase );
if ( ! uvm_config_db#( virtual jelly_bean_if )::get
( .cntxt( this ), .inst_name( "" ), .field_name( "jb_if" ), .value( jb_vi ) ) ) begin
`uvm_fatal( get_name(), "jb_if not found" )
end
jb_ap = new( .name( "jb_ap" ), .parent( this ) );
endfunction: build_phase
//----------------------------------------------------------------------------
// Function: main_phase
//----------------------------------------------------------------------------
task main_phase( uvm_phase phase );
forever begin
jelly_bean_transaction jb_tx;
@jb_vi.slave_cb;
if ( jb_vi.slave_cb.flavor != NO_FLAVOR ) begin
phase.raise_objection( .obj( this ), .description( get_name() ) );
jb_tx = jelly_bean_transaction::type_id::create( .name( "jb_tx" ) );
jb_tx.flavor = flavor_e'( jb_vi.slave_cb.flavor );
jb_tx.color = color_e'( jb_vi.slave_cb.color );
jb_tx.sugar_free = jb_vi.slave_cb.sugar_free;
jb_tx.sour = jb_vi.slave_cb.sour;
@jb_vi.master_cb;
jb_tx.taste = taste_e'( jb_vi.master_cb.taste );
jb_ap.write( jb_tx );
phase.drop_objection( .obj( this ), .description( get_name() ) );
end
end
endtask: main_phase
endclass: jelly_bean_monitor
//------------------------------------------------------------------------------
// Class: jelly_bean_agent
//------------------------------------------------------------------------------
class jelly_bean_agent extends uvm_agent;
`uvm_component_utils( jelly_bean_agent )
uvm_analysis_port#( jelly_bean_transaction ) jb_ap;
jelly_bean_sequencer jb_seqr;
jelly_bean_driver jb_drvr;
jelly_bean_monitor jb_mon;
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new
//----------------------------------------------------------------------------
// Function: build_phase
//----------------------------------------------------------------------------
function void build_phase( uvm_phase phase );
super.build_phase( phase );
jb_ap = new( .name( "jb_ap" ), .parent( this ) );
jb_seqr = jelly_bean_sequencer::type_id::create( .name( "jb_seqr" ), .parent( this ) );
jb_drvr = jelly_bean_driver ::type_id::create( .name( "jb_drvr" ), .parent( this ) );
jb_mon = jelly_bean_monitor ::type_id::create( .name( "jb_mon" ), .parent( this ) );
endfunction: build_phase
//----------------------------------------------------------------------------
// Function: connect_phase
//----------------------------------------------------------------------------
function void connect_phase( uvm_phase phase );
super.connect_phase( phase );
jb_drvr.seq_item_port.connect( jb_seqr.seq_item_export );
jb_mon.jb_ap.connect( jb_ap );
endfunction: connect_phase
endclass: jelly_bean_agent
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
//------------------------------------------------------------------------------
// Class: jelly_bean_fc_subscriber
// Functional coverage collector.
//------------------------------------------------------------------------------
class jelly_bean_fc_subscriber extends uvm_subscriber#( jelly_bean_transaction );
`uvm_component_utils( jelly_bean_fc_subscriber )
jelly_bean_transaction jb_tx;
//----------------------------------------------------------------------------
// Covergroup: jelly_bean_cg
//----------------------------------------------------------------------------
covergroup jelly_bean_cg;
flavor_cp: coverpoint jb_tx.flavor;
color_cp: coverpoint jb_tx.color;
sugar_free_cp: coverpoint jb_tx.sugar_free;
sour_cp: coverpoint jb_tx.sour;
cross flavor_cp, color_cp, sugar_free_cp, sour_cp;
endgroup: jelly_bean_cg
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
jelly_bean_cg = new;
endfunction: new
//----------------------------------------------------------------------------
// Function: write
//----------------------------------------------------------------------------
function void write( jelly_bean_transaction t );
jb_tx = t;
jelly_bean_cg.sample();
endfunction: write
endclass: jelly_bean_fc_subscriber
//------------------------------------------------------------------------------
// Class: jelly_bean_sb_subscriber
// Scoreboard.
//------------------------------------------------------------------------------
class jelly_bean_sb_subscriber extends uvm_subscriber#( jelly_bean_transaction );
`uvm_component_utils( jelly_bean_sb_subscriber )
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new
//----------------------------------------------------------------------------
// Function: write
//----------------------------------------------------------------------------
function void write( jelly_bean_transaction t );
if ( t.flavor == CHOCOLATE && t.sour && t.taste == YUMMY ||
! ( t.flavor == CHOCOLATE && t.sour ) && t.taste == YUCKY ) begin
`uvm_error( get_name(), { "You lost sense of taste!", t.convert2string() } )
end else begin
`uvm_info( get_name(), { "You have a good sense of taste.", t.convert2string() }, UVM_LOW )
end
endfunction: write
endclass: jelly_bean_sb_subscriber
//------------------------------------------------------------------------------
// Class: jelly_bean_env
//------------------------------------------------------------------------------
class jelly_bean_env extends uvm_env;
`uvm_component_utils( jelly_bean_env )
jelly_bean_agent jb_agent;
jelly_bean_fc_subscriber jb_fc;
jelly_bean_sb_subscriber jb_sb;
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new
//----------------------------------------------------------------------------
// Function: build_phase
//----------------------------------------------------------------------------
function void build_phase( uvm_phase phase );
super.build_phase( phase );
jb_agent = jelly_bean_agent ::type_id::create( .name( "jb_agent" ), .parent( this ) );
jb_fc = jelly_bean_fc_subscriber::type_id::create( .name( "jb_fc" ), .parent( this ) );
jb_sb = jelly_bean_sb_subscriber::type_id::create( .name( "jb_sb" ), .parent( this ) );
endfunction: build_phase
//----------------------------------------------------------------------------
// Function: connect_phase
//----------------------------------------------------------------------------
function void connect_phase( uvm_phase phase );
super.connect_phase( phase );
jb_agent.jb_ap.connect( jb_fc.analysis_export );
jb_agent.jb_ap.connect( jb_sb.analysis_export );
endfunction: connect_phase
endclass: jelly_bean_env
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
//------------------------------------------------------------------------------
// Class: jelly_bean_test
//------------------------------------------------------------------------------
class jelly_bean_test extends uvm_test;
`uvm_component_utils( jelly_bean_test )
jelly_bean_env jb_env;
//----------------------------------------------------------------------------
// Function: new
//----------------------------------------------------------------------------
function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new
//----------------------------------------------------------------------------
// Function: build_phase
//----------------------------------------------------------------------------
function void build_phase( uvm_phase phase );
super.build_phase( phase );
jelly_bean_transaction::type_id::set_type_override(
sugar_free_jelly_bean_transaction::get_type() );
jb_env = jelly_bean_env::type_id::create( .name( "jb_env" ), .parent( this ) );
endfunction: build_phase
//----------------------------------------------------------------------------
// task: main_phase
//----------------------------------------------------------------------------
task main_phase( uvm_phase phase );
gift_boxed_jelly_bean_sequence jb_seq;
jb_seq = gift_boxed_jelly_bean_sequence::type_id::create( .name( "jb_seq" ) );
assert( jb_seq.randomize() );
`uvm_info( "jb_seq", jb_seq.convert2string(), UVM_NONE )
jb_seq.set_starting_phase( phase );
jb_seq.set_automatic_phase_objection( .value( 1 ) );
jb_seq.start( jb_env.jb_agent.jb_seqr );
endtask: main_phase
endclass: jelly_bean_test
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
`include "uvm_macros.svh"
`include "jelly_bean_pkg.sv"
`include "jelly_bean_if.sv"
//------------------------------------------------------------------------------
// Module: jelly_bean_taster
// This is the DUT.
//------------------------------------------------------------------------------
module jelly_bean_taster( jelly_bean_if.slave_mp jb_if );
import jelly_bean_pkg::*;
always @ ( posedge jb_if.clk ) begin
if ( jb_if.flavor == CHOCOLATE && jb_if.sour )
jb_if.taste <= #2ns YUCKY;
else
jb_if.taste <= #2ns YUMMY;
end
endmodule: jelly_bean_taster
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
//------------------------------------------------------------------------------
// Interface: jelly_bean_if
//------------------------------------------------------------------------------
interface jelly_bean_if( input bit clk );
logic [2:0] flavor;
logic [1:0] color;
logic sugar_free;
logic sour;
logic [1:0] taste;
//----------------------------------------------------------------------------
// Clocking block: master_cb
//----------------------------------------------------------------------------
clocking master_cb @( posedge clk );
default input #1ns output #1ns;
output flavor, color, sugar_free, sour;
input taste;
endclocking: master_cb
//----------------------------------------------------------------------------
// Clocking block: slave_cb
//----------------------------------------------------------------------------
clocking slave_cb @( posedge clk );
default input #1ns output #1ns;
input flavor, color, sugar_free, sour;
output taste;
endclocking: slave_cb
//----------------------------------------------------------------------------
// Modports
//----------------------------------------------------------------------------
modport master_mp( input clk, taste, output flavor, color, sugar_free, sour );
modport slave_mp ( input clk, flavor, color, sugar_free, sour, output taste );
modport master_sync_mp( clocking master_cb );
modport slave_sync_mp ( clocking slave_cb );
endinterface: jelly_bean_if
//==============================================================================
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//==============================================================================
xxxxxxxxxx
//==============================================================================
// Source code for "UVM Tutorial for Candy Lovers" Post #23
//
// The MIT License (MIT)
//
// Copyright (c) 2014 ClueLogic, LLC
// http://cluelogic.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//==============================================================================
Your account is not validated. If you wish to use commercial simulators, you need a validated account.
If you have already registered (or have recently changed your email address), but have not clicked on the link in the email we sent you, please do so. If you cannot find the email, please check your spam/junk folder. Or click here to resend the email.
If you have not already registered for a full account, you can do so by clicking below. You will then need to provide us with some identification information. You may wish to save your code first.
Creating, deleting, and renaming files is not supported during Collaboration. To encourage development of these features for Collaboration, tweet to @EDAPlayground
This playground may have been modified. Please save or copy before starting collaboration.
Your exercise has been submitted.