origen_sim 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +5 -5
  2. data/config/application.rb +17 -2
  3. data/config/shared_commands.rb +7 -0
  4. data/config/version.rb +1 -1
  5. data/ext/bridge.c +13 -3
  6. data/lib/origen_sim.rb +10 -0
  7. data/lib/origen_sim/artifacts.rb +101 -0
  8. data/lib/origen_sim/commands/build.rb +41 -9
  9. data/lib/origen_sim/heartbeat.rb +13 -1
  10. data/lib/origen_sim/origen_testers/api.rb +90 -7
  11. data/lib/origen_sim/simulation.rb +49 -4
  12. data/lib/origen_sim/simulator.rb +171 -19
  13. data/lib/origen_sim/stderr_reader.rb +19 -13
  14. data/lib/origen_sim/stdout_reader.rb +22 -16
  15. data/lib/origen_sim/tester.rb +110 -1
  16. data/lib/origen_sim_dev/dut.rb +5 -0
  17. data/pattern/test.rb +143 -0
  18. data/templates/empty.gtkw +19 -1
  19. data/templates/empty.rc +86 -0
  20. data/templates/empty.svcf +79 -9
  21. data/templates/empty.tcl +37 -9
  22. data/templates/origen_guides/simulation/app.md.erb +131 -0
  23. data/templates/origen_guides/simulation/artifacts.md.erb +115 -0
  24. data/templates/origen_guides/simulation/compiling.md.erb +190 -0
  25. data/templates/origen_guides/simulation/debugging.md.erb +135 -0
  26. data/templates/origen_guides/simulation/environment.md.erb +217 -0
  27. data/templates/origen_guides/simulation/flows.md.erb +69 -0
  28. data/templates/origen_guides/simulation/howitworks.md.erb +64 -0
  29. data/templates/origen_guides/simulation/introduction.md.erb +35 -0
  30. data/templates/origen_guides/simulation/log.md.erb +118 -0
  31. data/templates/origen_guides/simulation/patterns.md.erb +193 -0
  32. data/templates/probe.tcl.erb +3 -0
  33. data/templates/rtl_v/origen.v.erb +19 -3
  34. data/templates/web/layouts/_guides.html.erb +15 -0
  35. metadata +18 -5
@@ -7,8 +7,8 @@
7
7
  # TopLevel.1
8
8
  # TopLevel.2
9
9
  # Source.1: origen.dut
10
- # Wave.1: 3 signals
11
- # Group count = 2
10
+ # Wave.1: 12 signals
11
+ # Group count = 3
12
12
  # Group Debug signal count = 3
13
13
  # Group DUT signal count = 0
14
14
  # End_DVE_Session_Save_Info
@@ -69,7 +69,7 @@ if {![gui_exist_window -window TopLevel.1]} {
69
69
  } else {
70
70
  set TopLevel.1 TopLevel.1
71
71
  }
72
- gui_show_window -window ${TopLevel.1} -show_state normal -rect {{525 653} {2223 1819}}
72
+ gui_show_window -window ${TopLevel.1} -show_state normal -rect {{529 678} {2226 1843}}
73
73
 
74
74
  # ToolBar settings
75
75
  gui_set_toolbar_attributes -toolbar {TimeOperations} -dock_state top
@@ -149,7 +149,7 @@ if {![gui_exist_window -window TopLevel.2]} {
149
149
  } else {
150
150
  set TopLevel.2 TopLevel.2
151
151
  }
152
- gui_show_window -window ${TopLevel.2} -show_state normal -rect {{293 121} {2365 1172}}
152
+ gui_show_window -window ${TopLevel.2} -show_state normal -rect {{297 146} {2368 1196}}
153
153
 
154
154
  # ToolBar settings
155
155
  gui_set_toolbar_attributes -toolbar {TimeOperations} -dock_state top
@@ -241,15 +241,42 @@ set _session_group_1 Debug
241
241
  gui_sg_create "$_session_group_1"
242
242
  set Debug "$_session_group_1"
243
243
 
244
- gui_sg_addsignal -group "$_session_group_1" { origen.debug.pattern origen.debug.comments origen.debug.errors }
244
+ gui_sg_addsignal -group "$_session_group_1" { origen.debug.pattern origen.debug.errors }
245
245
  gui_set_radix -radix {ascii} -signals {V1:origen.debug.pattern}
246
246
  gui_set_radix -radix {unsigned} -signals {V1:origen.debug.pattern}
247
- gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments}
248
- gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments}
249
247
 
250
- set _session_group_2 DUT
248
+ set _session_group_2 $_session_group_1|
249
+ append _session_group_2 Comments
251
250
  gui_sg_create "$_session_group_2"
252
- set DUT "$_session_group_2"
251
+ set Debug|Comments "$_session_group_2"
252
+
253
+ gui_sg_addsignal -group "$_session_group_2" { origen.debug.comments0 origen.debug.comments1 origen.debug.comments2 origen.debug.comments3 origen.debug.comments4 origen.debug.comments5 origen.debug.comments6 origen.debug.comments7 origen.debug.comments8 origen.debug.comments9 }
254
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments0}
255
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments0}
256
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments1}
257
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments1}
258
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments2}
259
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments2}
260
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments3}
261
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments3}
262
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments4}
263
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments4}
264
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments5}
265
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments5}
266
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments6}
267
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments6}
268
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments7}
269
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments7}
270
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments8}
271
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments8}
272
+ gui_set_radix -radix {ascii} -signals {V1:origen.debug.comments9}
273
+ gui_set_radix -radix {unsigned} -signals {V1:origen.debug.comments9}
274
+
275
+ gui_sg_move "$_session_group_2" -after "$_session_group_1" -pos 1
276
+
277
+ set _session_group_3 DUT
278
+ gui_sg_create "$_session_group_3"
279
+ set DUT "$_session_group_3"
253
280
 
254
281
 
255
282
  # Global: Highlighting
@@ -317,6 +344,7 @@ gui_list_create_group_when_add -wave -disable
317
344
  gui_marker_set_ref -id ${Wave.1} C1
318
345
  gui_wv_zoom_timerange -id ${Wave.1} 0 353973502
319
346
  gui_list_add_group -id ${Wave.1} -after {New Group} {Debug}
347
+ gui_list_add_group -id ${Wave.1} -after {origen.debug.pattern[1023:0]} {Debug|Comments}
320
348
  gui_list_add_group -id ${Wave.1} -after {New Group} {DUT}
321
349
  gui_seek_criteria -id ${Wave.1} {Any Edge}
322
350
 
@@ -0,0 +1,131 @@
1
+ % render "layouts/guides.html" do
2
+
3
+ Generally speaking, an Origen application setup is the same whether you are generating
4
+ a pattern/flow for the ATE or if you wish to simulate it.
5
+
6
+ Therefore, the rest of the guides are applicable for how to setup a [model](<%= path "guides/models/introduction" %>) and a
7
+ [controller](<%= path "guides/controllers/introduction" %>) for your DUT,
8
+ and how to create a [pattern](<%= path "guides/patterns/introduction" %>).
9
+
10
+ However, there are still a few simulation-specific points that are worth noting to help
11
+ make your application simulation-ready.
12
+
13
+ #### Pin Definitions
14
+
15
+ To simulate, you will at the very least need a model that corresponds to your DUT and which
16
+ defines the pins that you want to wiggle.
17
+
18
+ It is not necessary to define all the pins of your DUT in the model, but for those that you do
19
+ define the IDs should match up between the model and the top-level Verilog module for your
20
+ DUT.
21
+
22
+ The easiest way to achieve this is to define your model's pins by importing the pins that were
23
+ extracted from the design (using `sim:build` as described in the
24
+ [Compiling the DUT section](<%= path "guides/simulation/compiling" %>)).
25
+
26
+ This will guarantee that your model exactly matches the design, and if you want
27
+ to use different pin names in the ATE patterns you can define these as aliases and add a
28
+ [`pin_pattern_order` statement](<%= path "guides/pattern/pins/#Controlling_the_Pattern_Pin_Order" %>)
29
+ to choose the alias instead of the h/ware names:
30
+
31
+ ~~~ruby
32
+ module MyApp
33
+ class MyDUT
34
+ include Origen::TopLevel
35
+
36
+ def initialize(options = {})
37
+ import 'my_dut', dir: "#{Origen.root!}/vendor/pins", namespace: nil
38
+
39
+ # Add aliases if you want to use different names in your application and in ATE patterns
40
+ add_pin_alias :resetn, :reset_neg_async
41
+ end
42
+ end
43
+ end
44
+ ~~~
45
+
46
+ Alternatively, if you already have your pins defined manually in the application and you need to
47
+ reconcile these with what they are called in the design, then you can add the `rtl_name` attribute
48
+ to your definition:
49
+
50
+ ~~~ruby
51
+ add_pin :resetn, rtl_name: :reset_neg_async
52
+ ~~~
53
+
54
+ Once you have your pins defined, you can immediately create a pattern and simulate it
55
+ to see if you can see the pins wiggling!
56
+
57
+ ~~~ruby
58
+ # pattern/sign_of_life.rb
59
+
60
+ Pattern.create do
61
+ 10.times do
62
+ dut.pin(:my_pin).drive!(1)
63
+ dut.pin(:my_pin).drive!(0)
64
+ end
65
+ end
66
+ ~~~
67
+
68
+ To simulate it:
69
+
70
+ ~~~text
71
+ origen g sign_of_life -e environment/sim.rb
72
+ ~~~
73
+
74
+ #### Simulation Startup
75
+
76
+ When simulating a pattern, the same [startup callback](<%= path "guides/misc/callbacks/#Pattern_Generation" %>)
77
+ (that you might use to implement a mode entry or other setup sequence) will be called as it would
78
+ when you are generating for an ATE.
79
+
80
+ However, sometimes you may need to do some additional setup in simulation, for example to drive
81
+ some power pins that would be handled by a power supply on an ATE - i.e. they are not normally
82
+ cared about in the pattern.
83
+
84
+ A simulation-specific callback exists for this purpose, this will be called immediately upon a
85
+ simulation starting and before the pattern or flow creation gets underway - i.e. it will be
86
+ called before the regular `startup` callback.
87
+
88
+ ~~~ruby
89
+ def simulation_startup
90
+ # Drive these power pins to 1, these are not included in the ATE patterns and will be handled
91
+ # be a power supply on the tester
92
+ pin(:vdd).drive(1)
93
+ pin(:vddc).drive(1)
94
+ pin(:vss).drive(0)
95
+ end
96
+ ~~~
97
+
98
+ **Note that if multiple patterns are being generated back-back in a single simulation, then the
99
+ `simulation_startup` will only be called once at the very start of the simulation. In contrast,
100
+ the `startup` method will be called at the start of every individual pattern within the simulation.**
101
+
102
+ #### Simulation Specific Code
103
+
104
+ Any simulation-specific code in your application can be gated as shown below:
105
+
106
+ ~~~ruby
107
+ if tester.sim?
108
+ # Only executed when simulating
109
+ end
110
+ ~~~
111
+
112
+ #### Starting the Simulator in an Interactive Session
113
+
114
+ When in an interactive session (`origen i`) the simulator can be started by typing
115
+ `tester.start`.
116
+
117
+ If you want this to happen automatically every time you start an interactive session when
118
+ the simulation environment is selected, add this to the [interactive startup callback](<%= path "guides/misc/callbacks/#interactive_startup" %>):
119
+
120
+ ~~~ruby
121
+ def interactive_startup
122
+ # Always start the simulator immediately if I open an interactive session with the
123
+ # simulation environment selected
124
+ tester.start if tester.sim?
125
+ end
126
+ ~~~
127
+
128
+ See [the debugging guide](<%= path "guides/simulation/debugging" %>) for details about APIs
129
+ that are useful when interacting with your DUT in a live ad-hoc simulation from the console.
130
+
131
+ % end
@@ -0,0 +1,115 @@
1
+ % render "layouts/guides.html" do
2
+
3
+ When OrigenSim runs, it will change the current directory to run the simulator. This is not necessarily the
4
+ same directory that the compiled snapshot resides in and will most likely break relative paths compiled into the
5
+ snapshot.
6
+
7
+ OrigenSim provides an <code>artifacts</code> API to handle this problem. <code>Artifacts</code> are just files or
8
+ directories that need to be available in the run directory prior to the simulation start. This can be used to
9
+ reconstruct the run directory regardless of vendor or target configurations, and without requiring you to build in the
10
+ logic into the application itself.
11
+
12
+ OrigenSim will automatically look for artifacts in the directory <code>#{Origen.app.root}/simulation/application/artifacts</code>.
13
+ Anything in the this folder will be moved to the run directory and placed in <code>application/artifacts</code> just before the
14
+ simulation process starts. These artifacts will be populated across targets. You can override an artifact with one
15
+ specific to your target by placing an artifact with the same name in <code>simulation/TARGET/artifacts</code>.
16
+
17
+ For example, if I have an artifact <code>simulation/application/artifacts/startup.sv</code> that I need for
18
+ three targets, <code>rtl</code>, <code>part_analog</code>, and <code>all_analog</code>, this same artifact will be used
19
+ whenever any of those targets are used. Then, consider I have a new target <code>gate</code>, which has a different
20
+ <code>startup.sv</code> to run. By placing this at <code>simulation/gate/artifacts/startup.sv</code>, OrigenSim
21
+ will replace the artifact in <code>simulation/application/artifacts</code> with this one, in the same run directory.
22
+
23
+ Warning: Default artifacts only go a single level deep. Directories placed at <code>simulation/TARGET/artifacts</code>
24
+ will override an entire directory at <code>application/artifacts</code>. If you need more
25
+ control over the artifacts, you can see further down in this guide for manually adding artifacts.
26
+
27
+ OrigenSim provides two further customizations to the default setup. Like the target directory, you can pass additional
28
+ <code>user_artifact_dirs</code>, which will override any artifacts found at either the default or target artifact levels.
29
+ These artifacts will override each other in the order of the Array definition.
30
+
31
+ All of these artifacts have different sources, but they are placed in the same <code>artifact_run_dir</code>, which
32
+ defaults to <code>application/artifacts</code>. This location is customizable as well with the <code>artifact_run_dir</code>
33
+ option.
34
+
35
+ ~~~ruby
36
+ OrigenSim::cadence do |sim|
37
+ # Add a user artifact directory
38
+ sim.user_artifact_dirs ["#{Origen.app.root}/simulation/testbench"]
39
+
40
+ # Change the artifact target location, within the context of the run directory.
41
+ # NOTE: this is relative to the run directory. This expands to /path/to/run/dir/testbench
42
+ sim.artifact_run_dir "./testbench"
43
+ end
44
+ ~~~
45
+
46
+ Note here that the <code>artifact_run_dir</code> is <b>implicitly relative</b> to the
47
+ run directory. Relative paths are expanded in the context of the run directory, <b>not</b> relative to
48
+ the current script location.
49
+
50
+ Artifacts can be populated either by symlinks or by copying the contents directly. By default, Linux will symlink the
51
+ contents and unlink to clean them. However, due to the elevated priveledges required by later Windows systems to symlink objects,
52
+ the default behavior for Windows is to just copy files. This does mean that larger, and/or a large number, of artifacts
53
+ may take longer. This behavior can be changed however:
54
+
55
+ ~~~ruby
56
+ OrigenSim::cadence do |sim|
57
+ # Force all artifacts to be copied
58
+ artifact_populate_method :copy
59
+
60
+ # Force all artifacts to be symlinked
61
+ artifact_populate_method :symlink
62
+ end
63
+ ~~~
64
+
65
+ OrigemSim's artifacts can be queried, populated, or cleaned, directly by accessing the <code>OrigenSim.artifact</code>
66
+ object (note: the exclusion of the <i>s</i>). Some methods also exist to retrieve and list the current artifacts:
67
+
68
+ ~~~ruby
69
+ # Populate all the artifacts
70
+ tester.simulator.artifact.populate
71
+
72
+ # Clean the currently populated artifacts
73
+ tester.simulator.artifact.clean
74
+
75
+ # List the current artifact names
76
+ tester.simulator.list_artifacts
77
+
78
+ # Retrieve the current artifact instances (as a Hash whose keys are the names returned above)
79
+ tester.simulator.artifacts
80
+
81
+ # Retrieve a single artifact
82
+ tester.simulator.artifacts[my_artifact]
83
+ tester.simulator.artifact[my_artifact]
84
+ ~~~
85
+
86
+ The <code>OrigenSim::Artifacts</code> class inherits from
87
+ [Origen::Componentable](http://origen-sdk.org/origen/guides/models/componentable/#The_Parent_Class),
88
+ so any of the <i>componentable</i> methods are available.
89
+
90
+ Additional single-artifact items can be added manually:
91
+
92
+ ~~~ruby
93
+ # in environment/sim.rb
94
+
95
+ tester = OrigenSim::cadence do |sim|
96
+ end
97
+
98
+ tester.simulator.artifact(:my_artifact) do |a|
99
+ # Point to a custom target
100
+ a.target "/path/to/my/artifact.mine"
101
+
102
+ # Point to a custom run target
103
+ # Recall this will expand to /path/to/run/dir/custom_artifacts
104
+ # This ultimately places the artifact at /path/to/run/dir/custom_artifacts/artifact.mine
105
+ a.run_target "./custom_artifacts"
106
+
107
+ # Indicate this artifact should be copied, regardlesss of global/OS settings.
108
+ a.populate_method :copy
109
+ end
110
+ ~~~
111
+
112
+ Note that this takes place <b>outside</b> of the initial tester instantiation, but can still occur in the environment
113
+ file.
114
+
115
+ % end
@@ -0,0 +1,190 @@
1
+ % render "layouts/guides.html" do
2
+
3
+ The details of how to build a given IP or SoC design can be complicated and can vary significantly
4
+ from case to case; it is something that is best managed by the design or verification team for
5
+ a given design under test (DUT).
6
+
7
+ Therefore, OrigenSim does not attempt to manage the simulation build process but instead provides
8
+ components that should be integrated into the target DUT's existing design build flow in order to
9
+ produce an output that is compatible with OrigenSim.
10
+
11
+ #### High-Level Flow
12
+
13
+ The high-level flow that we are aiming for here is as follows:
14
+
15
+ 1. The design flow owner runs an Origen command to create the Origen components, the top-level Verilog
16
+ is supplied as an input to this command and this will be used to create a DUT-specific Origen testbench
17
+ 2. The design flow owner incorporates these components into their build flow and executes it, stopping
18
+ after elaboration to create the Origen simulation object
19
+ 3. The design flow owner delivers the Origen simulation object to the Origen flow owner (e.g. the test engineer)
20
+ 4. The Origen flow owner integrates this simulation object into an Origen application
21
+
22
+ This process should be repeated from step 1 anytime either of the following occur:
23
+
24
+ * Changes are made to the top-level pin interface of the DUT
25
+ * A new version of OrigenSim is available with some new features that need to be compiled into the DUT
26
+
27
+ The process should be repeated from step 2 anytime:
28
+
29
+ * Changes have been made to the internal operation of the DUT (design changes) and you wish to be included
30
+ in Origen simulations
31
+
32
+
33
+ #### Creating the Origen Components
34
+
35
+ The OrigenSim plugin provides a command called `sim:build` to create the Origen components that should
36
+ be incorporated into the design build process.
37
+
38
+ To check if this is available, run the `origen` command outside of an application workspace, you should
39
+ see something like this:
40
+
41
+ ~~~text
42
+ > origen
43
+
44
+ Usage: origen COMMAND [ARGS]
45
+
46
+ The following commands are available:
47
+ new Create a new Origen application or plugin. "origen new my_app" creates a
48
+ new origen application workspace in "./my_app"
49
+ interactive Start an interactive Origen console (short-cut alias: "i"), this is just
50
+ IRB with the 'origen' lib loaded automatically
51
+
52
+ The following global commands are provided by plugins:
53
+ sim:build Build an Origen testbench and simulator extension for a given design
54
+
55
+ Many commands can be run with -h (or --help) for more information.
56
+ ~~~
57
+
58
+ Note the `sim:build` command is noted as being provided by a plugin at the bottom. If you don't see that
59
+ then it means that OrigenSim needs to be installed into your global Ruby, if you have the required admin
60
+ rights you can do this by simply executing:
61
+
62
+ ~~~text
63
+ gem install origen_sim
64
+ ~~~
65
+
66
+ If you don't have the required permission then speak to your system administrator to have them do this.
67
+ More detailed information on how to manage your globally available plugins like this can be found in
68
+ the [advanced guide on how Origen is invoked](<%= path "guides/advanced/invocations" %>).
69
+
70
+ If the `origen` command does not work at all, then first refer
71
+ to [the guide on how to install Origen](<%= path "guides/starting/installing" %>).
72
+
73
+ Once you have verified that you have the `sim:build` command available, execute it by supplying the
74
+ path to your top-level Verilog file like this:
75
+
76
+ ~~~text
77
+ origen sim:build path/to/my_top_level.v
78
+ ~~~
79
+
80
+ **It is highly recommended that you supply a stub model here, all that Origen needs to know about is the
81
+ top-level pin interface and reducing the amount of superfluous design code will reduce the chance
82
+ of parse errors during this step.**
83
+
84
+ Multiple files can be passed in, for example to include a defines file:
85
+
86
+ ~~~text
87
+ origen sim:build path/to/my_defines.v path/to/my_top_level.v
88
+ ~~~
89
+
90
+ If you prefer, it also works by supplying the source file directory path(s) separately:
91
+
92
+ ~~~text
93
+ origen sim:build my_defines.v my_top_level.v -s path/to
94
+ ~~~
95
+
96
+ The `sim:build` command does have some rudimentary support for evaluating and applying Verilog compiler
97
+ directive rules, though at the time of writing it does not evaluate Verilog parameters.
98
+
99
+ If you find that it does choke on your design files please do enter a ticket describing the code
100
+ which failed to parse here - <https://github.com/Origen-SDK/origen_verilog/issues>
101
+
102
+ In most cases any parse issues can be resolved by moving to a stub model or by simply removing the
103
+ offending code to create a partial stub.
104
+
105
+ Once you see a message like this, you are ready to move onto the next step:
106
+
107
+ ~~~text
108
+ -----------------------------------------------------------
109
+
110
+ Testbench and VPI extension created!
111
+
112
+ This file can be imported into an Origen top-level DUT model to define the pins:
113
+
114
+ /path/to/origen/my_top_level.rb
115
+
116
+ See above for what to do now to create an Origen-enabled simulation object for your particular simulator.
117
+
118
+ ~~~
119
+
120
+ #### Building the Design
121
+
122
+ We need to start from a command which can compile and elaborate the DUT only, so any 3rd party testbench
123
+ should be removed from the build process before we go any further.
124
+
125
+ The output from the previous step contains compiler-specific instructions on what files and switches
126
+ should be added to your build command, here for example for Cadence:
127
+
128
+
129
+ ~~~text
130
+ -----------------------------------------------------------
131
+ Cadence (irun)
132
+ -----------------------------------------------------------
133
+
134
+ Add the following to your build script to create an Origen-enabled simulation object (AND REMOVE ANY OTHER TESTBENCH!):
135
+
136
+ /path/to/my/origen/origen.v \
137
+ /path/to/my/origen/*.c \
138
+ -ccargs "-std=c99" \
139
+ -top origen \
140
+ -elaborate \
141
+ -snapshot origen \
142
+ -access +rw \
143
+ -timescale 1ns/1ns
144
+
145
+ The following files should then be used for Origen integration:
146
+
147
+ /home/nxa21353/Code/my_origen/origen/my_design_top.rb
148
+ INCA_libs/ (created by irun)
149
+ ~~~
150
+
151
+ At the time of writing Cadence, Synopsys and Icarus Verilog simulators are supported.
152
+
153
+ Simply add the files and switches as instructed to your baseline build command and it should then create
154
+ a snapshot of your design that is ready to talk to Origen.
155
+
156
+ The compiler-specific notes also mention what files should be given to the Origen application integrator, in
157
+ this case for Cadence the `INCA_libs` directory and an Origen file that defines the DUT's pins.
158
+
159
+ Once you are in possession of these files, you are ready for the final step:
160
+
161
+
162
+ #### Integrating the Simulation Object
163
+
164
+ One of the generated components from the `sim:build` command is an Origen file that defines the DUT's pins. If you wish to use this
165
+ in your model (optional, you can define them in the model by hand or any other way you like), then check it
166
+ into your application's `vendor` directory and import it within your model's `initialize` method like this:
167
+
168
+ ~~~ruby
169
+ # Import pin definitions as extracted from the design
170
+ import 'my_top_level', dir: "#{Origen.root!}/vendor/wherever/i/like", namespace: nil
171
+ ~~~
172
+
173
+ Note that `'my_top_level'` corresponds to the name of the file.
174
+
175
+ Your application should already have a target setup that corresponds to this DUT, if not create one.
176
+
177
+ The copy the compiled design files into `simulation/TARGET/SIMULATOR/.`, where `TARGET` is the name
178
+ of the target, e.g. `my_dut` and `SIMULATOR` is either `cadence`, `synopsys` or `icarus`.
179
+
180
+ For example, the `INCA_libs` directory in this Cadence example might be copied to `simulation/my_dut/cadence/INCA_libs`.
181
+
182
+ You can check these simulation files into your application's revision control system, but since they can be very large binaries
183
+ it is recommended that you add the `simulation` directory to your `.gitignore` and use an alternative revision control
184
+ tool like DesignSync to store them.
185
+
186
+ This will be further discussed in the environment setup, which is the [next section](<%= path "guides/simulation/environment" %>)
187
+ of this guide to simulation...
188
+
189
+
190
+ % end