% render "layouts/guides.html" do
Generally speaking, an Origen application setup is the same whether you are generating
a pattern/flow for the ATE or if you wish to simulate it.
Therefore, the rest of the guides are applicable for how to setup a [model](<%= path "guides/models/introduction" %>) and a
[controller](<%= path "guides/controllers/introduction" %>) for your DUT,
and how to create a [pattern](<%= path "guides/patterns/introduction" %>).
However, there are still a few simulation-specific points that are worth noting to help
make your application simulation-ready.
#### Pin Definitions
To simulate, you will at the very least need a model that corresponds to your DUT and which
defines the pins that you want to wiggle.
It is not necessary to define all the pins of your DUT in the model, but for those that you do
define the IDs should match up between the model and the top-level Verilog module for your
DUT.
The easiest way to achieve this is to define your model's pins by importing the pins that were
extracted from the design (using `sim:build` as described in the
[Compiling the DUT section](<%= path "guides/simulation/compiling" %>)).
This will guarantee that your model exactly matches the design, and if you want
to use different pin names in the ATE patterns you can define these as aliases and add a
[`pin_pattern_order` statement](<%= path "guides/pattern/pins/#Controlling_the_Pattern_Pin_Order" %>)
to choose the alias instead of the h/ware names:
~~~ruby
module MyApp
class MyDUT
include Origen::TopLevel
def initialize(options = {})
import 'my_dut', dir: "#{Origen.root!}/vendor/pins", namespace: nil
# Add aliases if you want to use different names in your application and in ATE patterns
add_pin_alias :resetn, :reset_neg_async
end
end
end
~~~
Alternatively, if you already have your pins defined manually in the application and you need to
reconcile these with what they are called in the design, then you can add the `rtl_name` attribute
to your definition:
~~~ruby
add_pin :resetn, rtl_name: :reset_neg_async
~~~
Once you have your pins defined, you can immediately create a pattern and simulate it
to see if you can see the pins wiggling!
~~~ruby
# pattern/sign_of_life.rb
Pattern.create do
10.times do
dut.pin(:my_pin).drive!(1)
dut.pin(:my_pin).drive!(0)
end
end
~~~
To simulate it:
~~~text
origen g sign_of_life -e environment/sim.rb
~~~
#### Simulation Startup
When simulating a pattern, the same [startup callback](<%= path "guides/misc/callbacks/#Pattern_Generation" %>)
(that you might use to implement a mode entry or other setup sequence) will be called as it would
when you are generating for an ATE.
However, sometimes you may need to do some additional setup in simulation, for example to drive
some power pins that would be handled by a power supply on an ATE - i.e. they are not normally
cared about in the pattern.
A simulation-specific callback exists for this purpose, this will be called immediately upon a
simulation starting and before the pattern or flow creation gets underway - i.e. it will be
called before the regular `startup` callback.
~~~ruby
def simulation_startup
# Drive these power pins to 1, these are not included in the ATE patterns and will be handled
# be a power supply on the tester
pin(:vdd).drive(1)
pin(:vddc).drive(1)
pin(:vss).drive(0)
end
~~~
**Note that if multiple patterns are being generated back-back in a single simulation, then the
`simulation_startup` will only be called once at the very start of the simulation. In contrast,
the `startup` method will be called at the start of every individual pattern within the simulation.**
#### Simulation Specific Code
Any simulation-specific code in your application can be gated as shown below:
~~~ruby
if tester.sim?
# Only executed when simulating
end
~~~
#### Starting the Simulator in an Interactive Session
When in an interactive session (`origen i`) the simulator can be started by typing
`tester.start`.
If you want this to happen automatically every time you start an interactive session when
the simulation environment is selected, add this to the [interactive startup callback](<%= path "guides/misc/callbacks/#interactive_startup" %>):
~~~ruby
def interactive_startup
# Always start the simulator immediately if I open an interactive session with the
# simulation environment selected
tester.start if tester.sim?
end
~~~
See [the debugging guide](<%= path "guides/simulation/debugging" %>) for details about APIs
that are useful when interacting with your DUT in a live ad-hoc simulation from the console.
% end