origen_sim 0.5.5 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|