origen_sim 0.5.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/application.rb +12 -1
- data/config/commands.rb +31 -10
- data/config/global_commands.rb +12 -0
- data/config/shared_commands.rb +11 -4
- data/config/version.rb +2 -2
- data/ext/bridge.c +18 -8
- data/ext/client.c +1 -1
- data/ext/defines.h.erb +6 -0
- data/ext/origen.c +6 -6
- data/lib/origen_sim/commands/build.rb +119 -81
- data/lib/origen_sim/commands/ci.rb +36 -0
- data/lib/origen_sim/commands/co.rb +36 -0
- data/lib/origen_sim/origen/pins/pin.rb +7 -13
- data/lib/origen_sim/origen_testers/api.rb +66 -0
- data/lib/origen_sim/simulator.rb +123 -43
- data/lib/origen_sim_dev/dut.rb +6 -4
- data/pattern/test.rb +28 -16
- data/templates/empty.gtkw +26 -0
- data/templates/rtl_v/origen.v.erb +10 -49
- metadata +24 -6
- data/ext/README.md +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d3ab8cb5d8aa155ae27711a8fba140910316c97
|
4
|
+
data.tar.gz: 6df912a7d278020ba64bda1d203fc3efd7f5d5a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5e6a4e7fcab4e0aff503dcbcacace8f929e50e4cb971029b4dc7ae850196a1014f512d5112af8685ff4a002b82d4493df1854fa07a99bc68ccb138d80857eed
|
7
|
+
data.tar.gz: c7dc8d1c270e0a1426177b0b3e96489aa8e714fe13299219f3a03fb7e675f3930c0dc9e106603f4042320118603aa42ecc6faaee0ffa1366152758d7af648a1c
|
data/config/application.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'origen'
|
2
2
|
class OrigenSimApplication < Origen::Application
|
3
|
+
attr_accessor :update_sim_captures
|
3
4
|
|
4
5
|
# See http://origen-sdk.org/origen/api/Origen/Application/Configuration.html
|
5
6
|
# for a full list of the configuration options available
|
@@ -27,9 +28,19 @@ class OrigenSimApplication < Origen::Application
|
|
27
28
|
#:patterns => "pattern",
|
28
29
|
#:templates => "templates",
|
29
30
|
#:programs => "program",
|
30
|
-
:command_launcher => "config/shared_commands.rb"
|
31
|
+
:command_launcher => "config/shared_commands.rb",
|
32
|
+
:global_launcher => "config/global_commands.rb"
|
31
33
|
}
|
32
34
|
|
35
|
+
config.remotes = [
|
36
|
+
{
|
37
|
+
dir: "example_rtl",
|
38
|
+
rc_url: 'https://github.com/Origen-SDK/example_rtl.git',
|
39
|
+
version: "master",
|
40
|
+
development: true
|
41
|
+
}
|
42
|
+
]
|
43
|
+
|
33
44
|
# See: http://origen-sdk.org/origen/latest/guides/utilities/lint/
|
34
45
|
config.lint_test = {
|
35
46
|
# Require the lint tests to pass before allowing a release to proceed
|
data/config/commands.rb
CHANGED
@@ -15,11 +15,34 @@ case @command
|
|
15
15
|
|
16
16
|
# Here is an example of how to implement a command, the logic can go straight
|
17
17
|
# in here or you can require an external file if preferred.
|
18
|
-
when "
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
when "sim:build_example"
|
19
|
+
Dir.chdir(Origen.root) do
|
20
|
+
output = `origen sim:build #{Origen.app.remotes_dir}/example_rtl/dut1/dut1.v`
|
21
|
+
puts output
|
22
|
+
Origen.load_target
|
23
|
+
FileUtils.mkdir_p "simulation/default/#{tester.simulator.config[:vendor]}"
|
24
|
+
case tester.simulator.config[:vendor]
|
25
|
+
when :icarus
|
26
|
+
output =~ / (cd .*)\n/
|
27
|
+
system $1
|
28
|
+
FileUtils.mv "#{Origen.config.output_directory}/origen.vpi", "simulation/default/icarus"
|
29
|
+
output =~ / (iverilog .*)\n/
|
30
|
+
system $1
|
31
|
+
FileUtils.mv "origen.vvp", "simulation/default/icarus"
|
32
|
+
|
33
|
+
when :cadence
|
34
|
+
output =~ / (irun .*)\n/
|
35
|
+
system = $1
|
36
|
+
FileUtils.mv "INCA_libs", "simulation/default/cadence"
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
puts
|
41
|
+
puts "Done, run this command to run a test simulation:"
|
42
|
+
puts
|
43
|
+
puts " origen g test"
|
44
|
+
puts
|
45
|
+
end
|
23
46
|
exit 0
|
24
47
|
|
25
48
|
## Example of how to make a command to run unit tests, this simply invokes RSpec on
|
@@ -65,10 +88,8 @@ else
|
|
65
88
|
# You probably want to also add the your commands to the help shown via
|
66
89
|
# origen -h, you can do this be assigning the required text to @application_commands
|
67
90
|
# before handing control back to Origen. Un-comment the example below to get started.
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
# test Run both specs and examples, -c will enable coverage
|
72
|
-
# EOT
|
91
|
+
@application_commands = <<-EOT
|
92
|
+
sim:build_example Build the example simulation object for the current environment setting
|
93
|
+
EOT
|
73
94
|
|
74
95
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
case @command
|
2
|
+
|
3
|
+
when "sim:build", "origen_sim:build"
|
4
|
+
require "#{Origen.root!}/lib/origen_sim/commands/build"
|
5
|
+
exit 0
|
6
|
+
|
7
|
+
else
|
8
|
+
@global_commands << <<-EOT
|
9
|
+
sim:build Build an Origen testbench and simulator extension for a given RTL design
|
10
|
+
EOT
|
11
|
+
|
12
|
+
end
|
data/config/shared_commands.rb
CHANGED
@@ -4,15 +4,22 @@ case @command
|
|
4
4
|
when 'generate'
|
5
5
|
$use_fast_probe_depth = false
|
6
6
|
@application_options << ["--fast", "Fast simulation, minimum probe depth"]
|
7
|
-
$use_fast_probe_depth =
|
7
|
+
$use_fast_probe_depth = ARGV.include?('--fast')
|
8
|
+
@application_options << ["--sim_capture", "Update sim captures (ignored when not running a simulation)"]
|
9
|
+
Origen.app!.update_sim_captures = ARGV.include?('--sim_capture')
|
8
10
|
|
9
|
-
when "
|
10
|
-
require "origen_sim/commands/
|
11
|
+
when "sim:ci", "origen_sim:ci"
|
12
|
+
require "#{Origen.root!}/lib/origen_sim/commands/ci"
|
13
|
+
exit 0
|
14
|
+
|
15
|
+
when "sim:co", "origen_sim:co"
|
16
|
+
require "#{Origen.root!}/lib/origen_sim/commands/co"
|
11
17
|
exit 0
|
12
18
|
|
13
19
|
else
|
14
20
|
@plugin_commands << <<-EOT
|
15
|
-
sim:
|
21
|
+
sim:ci Checkin a simulation snapshot
|
22
|
+
sim:co Checkout a simulation snapshot
|
16
23
|
EOT
|
17
24
|
|
18
25
|
end
|
data/config/version.rb
CHANGED
data/ext/bridge.c
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
///
|
5
5
|
#include "bridge.h"
|
6
6
|
#include "client.h"
|
7
|
+
#include "defines.h"
|
7
8
|
#include <stdint.h>
|
8
9
|
#include <stdlib.h>
|
9
10
|
#include <stdio.h>
|
@@ -39,7 +40,7 @@ typedef struct Wave {
|
|
39
40
|
int active_pin_count;
|
40
41
|
} Wave;
|
41
42
|
|
42
|
-
static
|
43
|
+
static uint64_t period_in_ps;
|
43
44
|
static long repeat = 0;
|
44
45
|
static Pin pins[MAX_NUMBER_PINS];
|
45
46
|
static int number_of_pins = 0;
|
@@ -261,7 +262,7 @@ static void bridge_clear_waves_and_pins() {
|
|
261
262
|
|
262
263
|
static void bridge_set_period(char * p_in_ns) {
|
263
264
|
int p = (int) strtol(p_in_ns, NULL, 10);
|
264
|
-
|
265
|
+
period_in_ps = p * 1000;
|
265
266
|
bridge_clear_waves_and_pins();
|
266
267
|
}
|
267
268
|
|
@@ -472,6 +473,7 @@ PLI_INT32 bridge_apply_wave_event_cb(p_cb_data data) {
|
|
472
473
|
|
473
474
|
/// Registers a callback to apply the given wave during this cycle
|
474
475
|
static void bridge_register_wave_event(int wave_ix, int event_ix, int compare, int delay_in_ns) {
|
476
|
+
uint64_t delay_in_ps = delay_in_ns * 1000;
|
475
477
|
s_cb_data call;
|
476
478
|
s_vpi_time time;
|
477
479
|
|
@@ -487,8 +489,9 @@ static void bridge_register_wave_event(int wave_ix, int event_ix, int compare, i
|
|
487
489
|
*d2 = compare;
|
488
490
|
|
489
491
|
time.type = vpiSimTime;
|
490
|
-
|
491
|
-
time.
|
492
|
+
|
493
|
+
time.high = (uint32_t)(delay_in_ps >> 32);
|
494
|
+
time.low = (uint32_t)(delay_in_ps);
|
492
495
|
|
493
496
|
call.reason = cbAfterDelay;
|
494
497
|
call.cb_rtn = bridge_apply_wave_event_cb;
|
@@ -512,7 +515,7 @@ PLI_INT32 bridge_init() {
|
|
512
515
|
/// When Origen requests a cycle, time will be advanced and this func will be called again.
|
513
516
|
PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
|
514
517
|
UNUSED(data);
|
515
|
-
int max_msg_len =
|
518
|
+
int max_msg_len = 1024;
|
516
519
|
char msg[max_msg_len];
|
517
520
|
int err;
|
518
521
|
char *opcode, *arg1, *arg2, *arg3, *arg4;
|
@@ -646,8 +649,10 @@ PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
|
|
646
649
|
arg1 = strtok(NULL, "^");
|
647
650
|
handle = vpi_handle_by_name(arg1, NULL);
|
648
651
|
if (handle) {
|
649
|
-
v.format = vpiDecStrVal; // Seems important to set this before get
|
652
|
+
//v.format = vpiDecStrVal; // Seems important to set this before get
|
653
|
+
v.format = vpiBinStrVal;
|
650
654
|
vpi_get_value(handle, &v);
|
655
|
+
//DEBUG("%s\n", v.value.str);
|
651
656
|
sprintf(msg, "%s\n", v.value.str);
|
652
657
|
client_put(msg);
|
653
658
|
} else {
|
@@ -726,6 +731,11 @@ PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
|
|
726
731
|
arg1 = strtok(NULL, "^");
|
727
732
|
bridge_stop_capture_pin(arg1);
|
728
733
|
break;
|
734
|
+
// Get version, returns the version of OrigenSim the DUT object was compiled with
|
735
|
+
// i^
|
736
|
+
case 'i' :
|
737
|
+
client_put(ORIGEN_SIM_VERSION"\n");
|
738
|
+
break;
|
729
739
|
default :
|
730
740
|
vpi_printf("ERROR: Illegal message received from Origen: %s\n", orig_msg);
|
731
741
|
runtime_errors += 1;
|
@@ -768,8 +778,8 @@ static void bridge_cycle() {
|
|
768
778
|
s_vpi_time time;
|
769
779
|
|
770
780
|
time.type = vpiSimTime;
|
771
|
-
time.high = (uint32_t)(
|
772
|
-
time.low = (uint32_t)(
|
781
|
+
time.high = (uint32_t)(period_in_ps >> 32);
|
782
|
+
time.low = (uint32_t)(period_in_ps);
|
773
783
|
|
774
784
|
call.reason = cbAfterDelay;
|
775
785
|
call.obj = 0;
|
data/ext/client.c
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
#include <sys/un.h>
|
10
10
|
#include <unistd.h>
|
11
11
|
#include <time.h>
|
12
|
+
#include <string.h>
|
12
13
|
|
13
14
|
static int sock;
|
14
15
|
static uint64_t msg_count = 0;
|
@@ -62,7 +63,6 @@ bool is_server_alive() {
|
|
62
63
|
/// Send a message to the master Origen process.
|
63
64
|
/// NOTE: THE CALLER IS RESPONSIBLE FOR ADDING A \n TERMINATOR TO
|
64
65
|
/// THE MESSAGE
|
65
|
-
/// to the data as this function will do it for you.
|
66
66
|
int client_put(char* data) {
|
67
67
|
if(send(sock, data , strlen(data), 0) < 0) {
|
68
68
|
return 1;
|
data/ext/defines.h.erb
ADDED
data/ext/origen.c
CHANGED
@@ -110,12 +110,12 @@ static void register_callback(PLI_INT32 aReason, PLI_INT32 (*aHandler)(p_cb_data
|
|
110
110
|
void (*vlog_startup_routines[])(void) = { init, 0 };
|
111
111
|
|
112
112
|
#if defined(CVER) || defined(VCS) || defined(NCSIM)
|
113
|
-
|
113
|
+
void vlog_startup_routines_bootstrap()
|
114
|
+
{
|
115
|
+
unsigned int i;
|
116
|
+
for (i = 0; vlog_startup_routines[i]; i++)
|
114
117
|
{
|
115
|
-
|
116
|
-
for (i = 0; vlog_startup_routines[i]; i++)
|
117
|
-
{
|
118
|
-
vlog_startup_routines[i]();
|
119
|
-
}
|
118
|
+
vlog_startup_routines[i]();
|
120
119
|
}
|
120
|
+
}
|
121
121
|
#endif
|
@@ -1,25 +1,26 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'origen_sim'
|
3
|
+
require_relative '../../../config/version'
|
4
|
+
require 'origen_verilog'
|
3
5
|
|
4
|
-
options = {}
|
6
|
+
options = { source_dirs: [] }
|
5
7
|
|
6
8
|
# App options are options that the application can supply to extend this command
|
7
9
|
app_options = @application_options || []
|
8
10
|
opt_parser = OptionParser.new do |opts|
|
9
11
|
opts.banner = <<-EOT
|
10
|
-
|
12
|
+
Build an Origen testbench and simulator VPI extension for the given top-level RTL design.
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
checked in, enabling repeatable builds in future.
|
14
|
+
The created artifacts should be included in a compilation of the given design to create
|
15
|
+
an Origen-enabled simulation object that can be used to simulate Origen-based test patterns.
|
15
16
|
|
16
|
-
Usage: origen
|
17
|
+
Usage: origen sim:build TOP_LEVEL_RTL_FILE [options]
|
17
18
|
EOT
|
18
|
-
opts.on('-
|
19
|
-
opts.on('-t', '--
|
20
|
-
opts.on('-
|
21
|
-
|
22
|
-
|
19
|
+
opts.on('-o', '--output DIR', String, 'Override the default output directory') { |t| options[:output] = t }
|
20
|
+
opts.on('-t', '--top NAME', String, 'Specify the top-level Verilog module name if OrigenSim can\'t work it out') { |t| options[:top_level_name] = t }
|
21
|
+
opts.on('-s', '--source_dir PATH', 'Directories to look for include files in (the directory containing the top-level is already considered)') do |path|
|
22
|
+
options[:source_dirs] << path
|
23
|
+
end
|
23
24
|
opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
|
24
25
|
app_options.each do |app_option|
|
25
26
|
opts.on(*app_option) {}
|
@@ -29,83 +30,120 @@ Usage: origen origen_sim:build [options]
|
|
29
30
|
end
|
30
31
|
|
31
32
|
opt_parser.parse! ARGV
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
|
34
|
+
unless ARGV.size > 0
|
35
|
+
puts 'You must supply a path to the top-level RTL file'
|
36
|
+
exit 1
|
37
|
+
end
|
38
|
+
rtl_top = ARGV.first
|
39
|
+
unless File.exist?(rtl_top)
|
40
|
+
puts "File does not exist: #{rtl_top}"
|
41
|
+
exit 1
|
40
42
|
end
|
41
43
|
|
42
|
-
|
43
|
-
config = simulator.configuration
|
44
|
-
tmp_dir = simulator.tmp_dir
|
45
|
-
|
46
|
-
unless options[:testrun]
|
47
|
-
FileUtils.rm_rf(tmp_dir) unless options[:incremental]
|
48
|
-
FileUtils.mkdir_p(tmp_dir)
|
49
|
-
FileUtils.rm_rf(simulator.compiled_dir) unless options[:incremental]
|
50
|
-
FileUtils.mkdir_p(simulator.compiled_dir)
|
51
|
-
FileUtils.rm_rf(simulator.artifacts_dir)
|
52
|
-
FileUtils.mkdir_p(simulator.artifacts_dir)
|
53
|
-
Array(config[:artifacts] || config[:artifact]).each do |f|
|
54
|
-
FileUtils.cp(f, simulator.artifacts_dir)
|
55
|
-
end
|
44
|
+
ast = OrigenVerilog.parse_file(rtl_top)
|
56
45
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
output: tmp_dir,
|
61
|
-
check_for_changes: false,
|
62
|
-
options: { vendor: config[:vendor], top: config[:rtl_top], incl: config[:incl_files] }
|
46
|
+
unless ast
|
47
|
+
puts 'Sorry, but the given top-level RTL file failed to parse'
|
48
|
+
exit 1
|
63
49
|
end
|
64
50
|
|
65
|
-
|
66
|
-
|
67
|
-
# Compile the VPI extension first
|
68
|
-
Dir.chdir tmp_dir do
|
69
|
-
system "iverilog-vpi #{Origen.root!}/ext/*.c -DICARUS --name=origen"
|
70
|
-
system "mv origen.vpi #{simulator.compiled_dir}"
|
71
|
-
end
|
72
|
-
# Build the object containing the DUT and testbench
|
73
|
-
cmd = "iverilog -o #{simulator.compiled_dir}/dut.vvp"
|
74
|
-
Array(config[:rtl_dir] || config[:rtl_dirs]).each do |dir|
|
75
|
-
cmd += " -I #{dir}"
|
76
|
-
end
|
77
|
-
Array(config[:rtl_file] || config[:rtl_files]).each do |f|
|
78
|
-
cmd += " #{f}"
|
79
|
-
end
|
80
|
-
cmd += " #{tmp_dir}/origen.v"
|
51
|
+
candidates = ast.top_level_modules
|
52
|
+
candidates = ast.modules if candidates.empty?
|
81
53
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
cmd += " -v #{f}"
|
89
|
-
end
|
90
|
-
Array(config[:rtl_dir] || config[:rtl_dirs]).each do |dir|
|
91
|
-
cmd += " -incdir #{dir}"
|
54
|
+
if candidates.size == 0
|
55
|
+
puts "Sorry, couldn't find any Verilog module declarations in that file"
|
56
|
+
exit 1
|
57
|
+
elsif candidates.size > 1
|
58
|
+
if options[:top_level_name]
|
59
|
+
mod = candidates.find { |c| c.name == options[:top_level_name] }
|
92
60
|
end
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
61
|
+
unless mod
|
62
|
+
puts "Sorry, couldn't work out what the top-level module is, please help by running again and specifying it via the --top switch with one of the following names:"
|
63
|
+
candidates.each do |c|
|
64
|
+
puts " #{c.name}"
|
65
|
+
end
|
66
|
+
exit 1
|
98
67
|
end
|
99
|
-
|
100
|
-
|
101
|
-
cmd += " #{Origen.root!}/ext/*.c -ccargs \"-std=c99\""
|
102
|
-
cmd += ' -elaborate -snapshot origen -access +rw'
|
103
|
-
cmd += " #{config[:explicit].strip.gsub(/\s+/, ' ')}" if config[:explicit]
|
68
|
+
else
|
69
|
+
mod = candidates.first
|
104
70
|
end
|
105
71
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
72
|
+
rtl_top_module = mod.name
|
73
|
+
|
74
|
+
mod.to_top_level # Creates dut
|
75
|
+
|
76
|
+
output_directory = options[:output] || Origen.config.output_directory
|
77
|
+
|
78
|
+
Origen.app.runner.launch action: :compile,
|
79
|
+
files: "#{Origen.root!}/templates/rtl_v/origen.v.erb",
|
80
|
+
output: output_directory,
|
81
|
+
check_for_changes: false,
|
82
|
+
quiet: true,
|
83
|
+
options: { vendor: :cadence, top: dut.name, incl: options[:incl_files] }
|
84
|
+
|
85
|
+
Origen.app.runner.launch action: :compile,
|
86
|
+
files: "#{Origen.root!}/ext",
|
87
|
+
output: output_directory,
|
88
|
+
check_for_changes: false,
|
89
|
+
quiet: true
|
90
|
+
|
91
|
+
dut.export(rtl_top_module, file_path: "#{output_directory}")
|
92
|
+
|
93
|
+
puts
|
94
|
+
puts
|
95
|
+
puts 'Testbench and VPI extension created!'
|
96
|
+
puts
|
97
|
+
puts 'This file can be imported into an Origen top-level DUT model to define the pins:'
|
98
|
+
puts
|
99
|
+
puts " #{output_directory}/#{rtl_top_module}.rb"
|
100
|
+
puts
|
101
|
+
puts 'See below for what to do now to create an Origen-enabled simulation object for your particular simulator:'
|
102
|
+
puts
|
103
|
+
puts '-----------------------------------------------------------'
|
104
|
+
puts 'Cadence Incisive (irun)'
|
105
|
+
puts '-----------------------------------------------------------'
|
106
|
+
puts
|
107
|
+
puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
|
108
|
+
puts
|
109
|
+
puts " #{output_directory}/origen.v \\"
|
110
|
+
puts " #{output_directory}/*.c \\"
|
111
|
+
puts ' -ccargs "-std=c99" \\'
|
112
|
+
puts ' -top origen \\'
|
113
|
+
puts ' -elaborate \\'
|
114
|
+
puts ' -snapshot origen \\'
|
115
|
+
puts ' -access +rw \\'
|
116
|
+
puts ' -timescale 1ns/1ns'
|
117
|
+
puts
|
118
|
+
puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
|
119
|
+
puts
|
120
|
+
puts " irun #{rtl_top} #{output_directory}/origen.v #{output_directory}/*.c -ccargs \"-std=c99\" -top origen -elaborate -snapshot origen -access +rw -timescale 1ns/1ns -incdir #{Pathname.new(rtl_top).dirname}"
|
121
|
+
puts
|
122
|
+
puts 'Copy the following directory (produced by irun) to simulation/<target>/cadence/. within your Origen application:'
|
123
|
+
puts
|
124
|
+
puts ' INCA_libs'
|
125
|
+
puts
|
126
|
+
puts '-----------------------------------------------------------'
|
127
|
+
puts 'Icarus Verilog'
|
128
|
+
puts '-----------------------------------------------------------'
|
129
|
+
puts
|
130
|
+
puts 'Compile the VPI extension using the following command:'
|
131
|
+
puts
|
132
|
+
puts " cd #{output_directory} && iverilog-vpi *.c -DICARUS --name=origen && cd #{Pathname.pwd}"
|
133
|
+
puts
|
134
|
+
puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
|
135
|
+
puts
|
136
|
+
puts " #{output_directory}/origen.v \\"
|
137
|
+
puts ' -o origen.vvp \\'
|
138
|
+
puts ' -DICARUS'
|
139
|
+
puts
|
140
|
+
puts 'Here is an example which may work for the file you just parsed (add additional source dirs with more -I options at the end if required):'
|
141
|
+
puts
|
142
|
+
puts " iverilog #{rtl_top} #{output_directory}/origen.v -o origen.vvp -DICARUS -I #{Pathname.new(rtl_top).dirname}"
|
143
|
+
puts
|
144
|
+
puts 'Copy the following files to simulation/<target>/icarus/. within your Origen application:'
|
145
|
+
puts
|
146
|
+
puts " #{output_directory}/origen.vpi"
|
147
|
+
puts ' origen.vvp (produced by the iverilog command)'
|
148
|
+
puts
|
149
|
+
puts
|