origen_sim 0.16.1 → 0.20.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51be12abd354fc71656f9fd5931460deecd27102072858c29eecac293eb01d1b
4
- data.tar.gz: 26a6bccbbf6c72375853bcc8b5ed940e9484754e282b23699aec0c87d0fc4449
3
+ metadata.gz: 0dc77dd81416662c4ecff9e01c03a7ed7a01cc31d79087ec6c9340cd72e0dd7f
4
+ data.tar.gz: 223d8e87547338de2ddf5061c5789b2f09c576e4acb448d666d9f4305db6acbe
5
5
  SHA512:
6
- metadata.gz: 00db8e5cd0f05f678a7acafed75edea1623db71175c40e0b51bdcf5c074a973a88e6ff31b32d7ff005560172bafa9fe6ae7eda78c55cf27d0742cbfae801537d
7
- data.tar.gz: 4dcb3cf9b28e516d76270a7d7b3891f141b326b8dc55b3975d740bf5492edafbeca6889a05f07a7a5613c9dbbf01b1b1e01bbbe1bac229a1a053b78b7830a707
6
+ metadata.gz: f29952826fecf63d1e7c96f96ebee945a0d48685ac21771138ea7c4dca51f0c433e2ea1198c9ea76068fb28528fc3af1320131dca5fb4ef0db8527494f8a7c56
7
+ data.tar.gz: 00db5869a5ebb43ae9138011ac0c36a649547fb37a9fb86f1b32bdf96588815fb4a11f78c0535b8ab258117011d001dac6030044dff266c6aaf503e5c4be1d12
@@ -36,10 +36,12 @@ class OrigenSimApplication < Origen::Application
36
36
  section.page :introduction, heading: "Introduction"
37
37
  section.page :howitworks, heading: "How It Works"
38
38
  section.page :compiling, heading: "Compiling the DUT"
39
+ section.page :ams, heading: "AMS Support"
39
40
  section.page :environment, heading: "Environment Setup"
40
41
  section.page :app, heading: "Application Setup"
41
42
  section.page :patterns, heading: "Simulating Patterns"
42
43
  section.page :flows, heading: "Simulating Flows"
44
+ section.page :direct, heading: "Direct DUT Manipulation"
43
45
  section.page :log, heading: "Simulator Log Output"
44
46
  section.page :artifacts, heading: "Artifacts"
45
47
  section.page :debugging, heading: "Debugging"
data/config/commands.rb CHANGED
@@ -17,33 +17,42 @@ case @command
17
17
  # in here or you can require an external file if preferred.
18
18
  when "sim:build_example"
19
19
  Dir.chdir(Origen.root) do
20
- output = `origen sim:build #{Origen.app.remotes_dir}/example_rtl/dut1/dut1.v`
20
+ cmd = "origen sim:build #{Origen.app.remotes_dir}/example_rtl/dut1/stub.v"
21
+ if ARGV.include?('-e') || ARGV.include?('--environment')
22
+ index = ARGV.index('-e') || ARGV.index('--environment')
23
+ ARGV.delete_at(index)
24
+ Origen.environment.temporary = ARGV.delete_at(index)
25
+ end
26
+ cmd += ' ' + ARGV.join(' ') unless ARGV.empty?
27
+ # Enable wreal pins in the DUT RTL
28
+ cmd += ' --define ORIGEN_WREAL' if ARGV.include?('--wreal')
29
+ output = `#{cmd}`
21
30
  puts output
22
31
  Origen.load_target
23
32
  dir = "simulation/default/#{tester.simulator.config[:vendor]}"
24
- FileUtils.rm_rf(dir) if File.exist?(dir)
25
33
  FileUtils.mkdir_p(dir)
26
- case tester.simulator.config[:vendor]
27
- when :icarus
28
- output =~ / (cd .*)\n/
29
- system $1
30
- FileUtils.mv "#{Origen.config.output_directory}/origen.vpi", "simulation/default/icarus"
31
- output =~ /\n(.*iverilog .*)\n/
32
- system $1
33
- FileUtils.mv "origen.vvp", "simulation/default/icarus"
34
+ Dir.chdir dir do
35
+ case tester.simulator.config[:vendor]
36
+ when :icarus
37
+ output =~ / (cd .*)\n/
38
+ system $1.gsub('stub', 'dut1')
39
+ FileUtils.mv "#{Origen.config.output_directory}/origen.vpi", '.'
40
+ output =~ /\n(.*iverilog .*)\n/
41
+ system $1.gsub('stub', 'dut1')
34
42
 
35
- when :cadence
36
- output =~ /\n(.*irun .*)\n/
37
- system $1
38
- FileUtils.mv "INCA_libs", "simulation/default/cadence"
43
+ when :cadence
44
+ output =~ /\n(.*irun .*)\n/
45
+ system $1.gsub('stub', 'dut1')
39
46
 
40
- when :synopsys
41
- output =~ /\n(.*vcs .*)\n/
42
- system $1
43
- FileUtils.mv "simv", "simulation/default/synopsys"
44
- FileUtils.mv "simv.daidir", "simulation/default/synopsys"
45
- FileUtils.rm_rf "csrc"
47
+ when :synopsys
48
+ if tester.simulator.config[:verdi]
49
+ output =~ /\n(.*vcs .*ORIGEN_FSDB.*)\n/
50
+ else
51
+ output =~ /\n(.*vcs .*ORIGEN_VPD.*)\n/
52
+ end
53
+ system $1.gsub('stub', 'dut1')
46
54
 
55
+ end
47
56
  end
48
57
 
49
58
  puts
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OrigenSim
2
2
  MAJOR = 0
3
- MINOR = 16
4
- BUGFIX = 1
3
+ MINOR = 20
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
data/ext/bridge.c CHANGED
@@ -723,18 +723,25 @@ PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
723
723
  end_simulation();
724
724
  return 0;
725
725
  // Peek
726
- // Returns the current value of the given net
726
+ // Returns the current value of the given net, the 2nd argument specifies whether to
727
+ // return an integer or a float/real value
727
728
  //
728
- // 9^origen.debug.errors
729
+ // 9^origen.debug.errors^i
730
+ // 9^origen.dut.my_real_val^f
729
731
  case '9' :
730
732
  arg1 = strtok(NULL, "^");
733
+ arg2 = strtok(NULL, "^");
731
734
  handle = vpi_handle_by_name(arg1, NULL);
732
735
  if (handle) {
733
- //v.format = vpiDecStrVal; // Seems important to set this before get
734
- v.format = vpiBinStrVal;
735
- vpi_get_value(handle, &v);
736
- //DEBUG("%s\n", v.value.str);
737
- sprintf(msg, "%s\n", v.value.str);
736
+ if (*arg2 == 'i') {
737
+ v.format = vpiBinStrVal;
738
+ vpi_get_value(handle, &v);
739
+ sprintf(msg, "%s\n", v.value.str);
740
+ } else {
741
+ v.format = vpiRealVal;
742
+ vpi_get_value(handle, &v);
743
+ sprintf(msg, "%f\n", v.value.real);
744
+ }
738
745
  client_put(msg);
739
746
  } else {
740
747
  client_put("FAIL\n");
@@ -751,17 +758,25 @@ PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
751
758
  vpi_put_value(handle, &v, NULL, vpiNoDelay);
752
759
  break;
753
760
  // Poke
754
- // Sets the given value on the given net, the number should be
755
- // given as a decimal string
761
+ // Sets the given value on the given net, the number should be given
762
+ // as a decimal string, an integer or a float, and the 2nd argument specifies
763
+ // which has been given
756
764
  //
757
- // b^origen.debug.errors^15
765
+ // b^origen.debug.errors^i^15
766
+ // b^origen.dut.my_real_val^f^1.12
758
767
  case 'b' :
759
768
  arg1 = strtok(NULL, "^");
760
769
  arg2 = strtok(NULL, "^");
770
+ arg3 = strtok(NULL, "^");
761
771
  handle = vpi_handle_by_name(arg1, NULL);
762
772
  if (handle) {
763
- v.format = vpiDecStrVal;
764
- v.value.str = arg2;
773
+ if (*arg2 == 'i') {
774
+ v.format = vpiDecStrVal;
775
+ v.value.str = arg3;
776
+ } else {
777
+ v.format = vpiRealVal;
778
+ v.value.real = strtof(arg3, NULL);
779
+ }
765
780
  vpi_put_value(handle, &v, NULL, vpiNoDelay);
766
781
  }
767
782
  break;
@@ -917,6 +932,41 @@ PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
917
932
  match_loop_open = false;
918
933
  }
919
934
  break;
935
+ // Force
936
+ // Forces the given value on the given net, the number should be given
937
+ // as a decimal string, an integer or a float, and the 2nd argument specifies
938
+ // which has been given
939
+ //
940
+ // r^origen.dut.some.net^i^1^
941
+ // r^origen.dut.some.net^f^1.25
942
+ case 'r' :
943
+ arg1 = strtok(NULL, "^");
944
+ arg2 = strtok(NULL, "^");
945
+ arg3 = strtok(NULL, "^");
946
+ handle = vpi_handle_by_name(arg1, NULL);
947
+ if (handle) {
948
+ if (*arg2 == 'i') {
949
+ v.format = vpiDecStrVal;
950
+ v.value.str = arg3;
951
+ } else {
952
+ v.format = vpiRealVal;
953
+ v.value.real = strtof(arg3, NULL);
954
+ }
955
+ vpi_put_value(handle, &v, NULL, vpiForceFlag);
956
+ }
957
+ break;
958
+ // Release
959
+ // Releases an existing force on the given net
960
+ //
961
+ // s^origen.dut.some.net
962
+ // s^origen.dut.some.net
963
+ case 's' :
964
+ arg1 = strtok(NULL, "^");
965
+ handle = vpi_handle_by_name(arg1, NULL);
966
+ if (handle) {
967
+ vpi_put_value(handle, &v, NULL, vpiReleaseFlag);
968
+ }
969
+ break;
920
970
  default :
921
971
  origen_log(LOG_ERROR, "Illegal message received from Origen: %s", orig_msg);
922
972
  runtime_errors += 1;
@@ -1034,7 +1084,11 @@ PLI_INT32 bridge_on_miscompare(PLI_BYTE8 * user_dat) {
1034
1084
 
1035
1085
  vpi_free_object(argv);
1036
1086
 
1037
- origen_log(LOG_ERROR, "Miscompare on pin %s, expected %d received %d", pin_name, expected, received);
1087
+ if (received) {
1088
+ origen_log(LOG_ERROR, "Miscompare on pin %s, expected %d received %d", pin_name, expected, received);
1089
+ } else {
1090
+ origen_log(LOG_ERROR, "Miscompare on pin %s, expected %d received X or Z", pin_name, expected);
1091
+ }
1038
1092
 
1039
1093
  error_count++;
1040
1094
 
@@ -1062,7 +1116,11 @@ PLI_INT32 bridge_on_miscompare(PLI_BYTE8 * user_dat) {
1062
1116
  strcpy((*miscompare).pin_name, pin_name);
1063
1117
  (*miscompare).cycle = cycle_count;
1064
1118
  (*miscompare).expected = expected;
1065
- (*miscompare).received = received;
1119
+ if (received) {
1120
+ (*miscompare).received = received;
1121
+ } else {
1122
+ (*miscompare).received = -1;
1123
+ }
1066
1124
  }
1067
1125
  transaction_error_count++;
1068
1126
  }
data/ext/origen.c CHANGED
@@ -3,6 +3,7 @@
3
3
  /// this extension into the simulation
4
4
  ///
5
5
  #include "origen.h"
6
+ #include "defines.h"
6
7
  #include "bridge.h"
7
8
  #include "client.h"
8
9
  #include <string.h>
@@ -12,12 +13,38 @@ static void init(void);
12
13
 
13
14
  static void init() {
14
15
  register_callback(cbStartOfSimulation, origen_startup);
15
-
16
16
  register_callback(cbEndOfSimulation, origen_shutdown);
17
-
18
17
  bridge_register_system_tasks();
19
18
  }
20
19
 
20
+ // This function is provided as another way to initialize Origen, by calling this manually
21
+ PLI_INT32 origen_init(p_cb_data data) {
22
+ vpi_printf("Origen Initialized!\n");
23
+ init();
24
+ return 0;
25
+ }
26
+
27
+ // Some legacy simulators require this manual initialization function to be called bootstrap, but
28
+ // otherwise equivalent to the origen_init() function
29
+ PLI_INT32 bootstrap(p_cb_data data) {
30
+ vpi_printf("Origen Initialized!\n");
31
+ init();
32
+ return 0;
33
+ }
34
+
35
+ #ifdef ORIGEN_VCS
36
+ // Origen will be initialized by calling the $origen_vcs_init task from the testbench, this is required
37
+ // for VCS since it does not allow multiple definitions of vlog_startup_routine, which is the
38
+ // conventional way of registering a VPI plugin.
39
+ PLI_INT32 origen_vcs_init(PLI_BYTE8 * user_dat) {
40
+ register_callback(cbEndOfSimulation, origen_shutdown);
41
+ return origen_startup(user_dat);
42
+ }
43
+ #else
44
+ // This is the standard way to initialize Origen, by registering this init function through the
45
+ // vlog_startup_routines. The simulator will then call this init function at simulation startup
46
+ void (*vlog_startup_routines[])(void) = { init, 0 };
47
+ #endif
21
48
 
22
49
  /// Returns the value of the given argument, or NULL if not supplied.
23
50
  /// This example:
@@ -87,15 +114,6 @@ PLI_INT32 origen_shutdown(p_cb_data data) {
87
114
  return 0;
88
115
  }
89
116
 
90
- /// Function to call the init PLI's init function
91
- /// Some toolchains will call this automatically, some will not
92
- /// Available here for those which do not automatically call init() for each PLI
93
- PLI_INT32 bootstrap(p_cb_data data) {
94
- vpi_printf("Origen Bootstrap Called!\n");
95
- init();
96
- return 0;
97
- }
98
-
99
117
  ///
100
118
  /// Registers a very basic VPI callback with reason and handler.
101
119
  ///
@@ -112,9 +130,3 @@ static void register_callback(PLI_INT32 aReason, PLI_INT32 (*aHandler)(p_cb_data
112
130
 
113
131
  vpi_free_object(vpi_register_cb(&call));
114
132
  }
115
-
116
-
117
- ///
118
- /// Bootstrap vector, make the simulator execute init() on startup
119
- ///
120
- void (*vlog_startup_routines[])(void) = { init, 0 };
data/ext/origen.h CHANGED
@@ -2,8 +2,14 @@
2
2
  #define ORIGEN_H
3
3
 
4
4
  #include "common.h"
5
+ #include "defines.h"
5
6
 
6
7
  PLI_INT32 origen_startup(p_cb_data);
7
8
  PLI_INT32 origen_shutdown(p_cb_data);
9
+ #ifdef ORIGEN_VCS
10
+ PLI_INT32 origen_vcs_init(PLI_BYTE8*);
11
+ #endif
12
+ PLI_INT32 origen_init(p_cb_data);
13
+ PLI_INT32 bootstrap(p_cb_data);
8
14
 
9
15
  #endif
@@ -0,0 +1,2 @@
1
+ $bridge_on_miscompare call=bridge_on_miscompare
2
+ $origen_vcs_init call=origen_vcs_init
@@ -23,6 +23,7 @@ Usage: origen sim:build TOP_LEVEL_VERILOG_FILE [options]
23
23
  options[:source_dirs] << path
24
24
  end
25
25
  opts.on('--sv', 'Generate a .sv file instead of a .v file.') { |t| options[:sv] = t }
26
+ opts.on('--wreal', 'Enable real number modeling support on DUT pins defined as real wires (wreal)') { |t| options[:wreal] = t }
26
27
  opts.on('--verilog_top_output_name NAME', 'Renames the output filename from origen.v to NAME.v') do |name|
27
28
  options[:verilog_top_output_name] = name
28
29
  end
@@ -95,7 +96,7 @@ candidates = ast.top_level_modules
95
96
  candidates = ast.modules if candidates.empty?
96
97
 
97
98
  if candidates.size == 0
98
- puts "Sorry, couldn't find any Verilog module declarations in that file"
99
+ puts "Sorry, couldn't find any Verilog module declarations in that file (this could be due to a parse error)"
99
100
  _exit_fail_
100
101
  elsif candidates.size > 1
101
102
  if options[:top_level_name]
@@ -116,7 +117,7 @@ rtl_top_module = mod.name
116
117
 
117
118
  mod.to_top_level # Creates dut
118
119
 
119
- # Update the pins with any setings from the command line
120
+ # Update the pins with any settings from the command line
120
121
  options[:initial_pin_states].each do |pin, state|
121
122
  dut.pins(pin).meta[:origen_sim_init_pin_state] = state
122
123
  end
@@ -157,51 +158,97 @@ else
157
158
 
158
159
  dut.export(rtl_top_module, dir: "#{output_directory}", namespace: nil)
159
160
 
161
+ SYNOPSYS_SWITCHES = %W(
162
+ #{output_directory}/#{output_name}
163
+ #{output_directory}/bridge.c
164
+ #{output_directory}/client.c
165
+ -P\ #{output_directory}/origen_tasks.tab
166
+ -CFLAGS\ "-std=c99 -DORIGEN_VCS"
167
+ +vpi
168
+ #{output_directory}/origen.c
169
+ +define+ORIGEN_VCS
170
+ -debug_access+all
171
+ -timescale=1ns/1ns
172
+ -v2005
173
+ -full64
174
+ )
175
+
176
+ if options[:wreal]
177
+ SYNOPSYS_SWITCHES += %w(
178
+ +define+ORIGEN_WREAL
179
+ -realport
180
+ -sverilog
181
+ -wreal\ res_max
182
+ )
183
+ end
184
+
185
+ SYNOPSYS_DVE_SWITCHES = SYNOPSYS_SWITCHES + %w(
186
+ +define+ORIGEN_VPD
187
+ )
188
+
189
+ SYNOPSYS_VERDI_SWITCHES = SYNOPSYS_SWITCHES + %W(
190
+ +define+ORIGEN_FSDB
191
+ -kdb
192
+ -P\ #{ENV['VERDI_HOME'] || '$VERDI_HOME'}/share/PLI/VCS/LINUX64/novas.tab
193
+ #{ENV['VERDI_HOME'] || '$VERDI_HOME'}/share/PLI/VCS/LINUX64/pli.a
194
+ )
195
+
196
+ CADENCE_SWITCHES = %W(
197
+ #{output_directory}/#{output_name}
198
+ #{output_directory}/*.c
199
+ -ccargs\ "-std=c99"
200
+ -top\ origen
201
+ -elaborate
202
+ -snapshot\ origen
203
+ -access\ +rw
204
+ -timescale\ 1ns/1ns
205
+ )
206
+
207
+ if options[:wreal]
208
+ CADENCE_SWITCHES += %w(
209
+ +define+ORIGEN_WREAL
210
+ -ams
211
+ )
212
+ end
213
+
160
214
  puts
161
215
  puts
162
216
  puts '-----------------------------------------------------------'
163
- puts 'Cadence Incisive (irun)'
217
+ puts 'Icarus Verilog'
164
218
  puts '-----------------------------------------------------------'
165
219
  puts
220
+ puts 'Compile the VPI extension using the following command:'
221
+ puts
222
+ puts " cd #{output_directory} && #{ENV['ORIGEN_SIM_IVERILOG_VPI'] || 'iverilog-vpi'} *.c --name=origen && cd #{Pathname.pwd}"
223
+ puts
166
224
  puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
167
225
  puts
168
226
  puts " #{output_directory}/#{output_name} \\"
169
- puts " #{output_directory}/*.c \\"
170
- puts ' -ccargs "-std=c99" \\'
171
- puts ' -top origen \\'
172
- puts ' -elaborate \\'
173
- puts ' -snapshot origen \\'
174
- puts ' -access +rw \\'
175
- puts ' -timescale 1ns/1ns'
227
+ puts ' -o origen.vvp \\'
228
+ puts ' -DORIGEN_VCD'
176
229
  puts
177
- puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
230
+ 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):'
178
231
  puts
179
- puts " #{ENV['ORIGEN_SIM_IRUN'] || 'irun'} #{rtl_top} #{output_directory}/#{output_name} #{output_directory}/*.c -ccargs \"-std=c99\" -top origen -elaborate -snapshot origen -access +rw -timescale 1ns/1ns -incdir #{Pathname.new(rtl_top).dirname}"
232
+ puts " #{ENV['ORIGEN_SIM_IVERILOG'] || 'iverilog'} #{rtl_top} #{output_directory}/#{output_name} -o origen.vvp -DORIGEN_VCD -I #{Pathname.new(rtl_top).dirname}"
180
233
  puts
181
- puts 'Copy the following directory (produced by irun) to simulation/<target>/cadence/. within your Origen application:'
234
+ puts 'Copy the following files (produced by iverilog) to simulation/<target>/icarus/. within your Origen application:'
182
235
  puts
183
- puts ' INCA_libs'
236
+ puts " #{output_directory}/origen.vpi"
237
+ puts ' origen.vvp'
184
238
  puts
185
239
  puts '-----------------------------------------------------------'
186
- puts 'Synopsys VCS'
240
+ puts 'Synopsys VCS w/ DVE Waveviewer'
187
241
  puts '-----------------------------------------------------------'
188
242
  puts
189
243
  puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
190
244
  puts
191
- puts " #{output_directory}/#{output_name} \\"
192
- puts " #{output_directory}/bridge.c \\"
193
- puts " #{output_directory}/client.c \\"
194
- puts ' -CFLAGS "-std=c99" \\'
195
- puts ' +vpi \\'
196
- puts " #{output_directory}/origen.c \\"
197
- puts ' +define+ORIGEN_VPD=1 \\'
198
- puts ' -debug_access+all \\'
199
- puts ' -PP \\'
200
- puts ' -timescale=1ns/1ns'
245
+ SYNOPSYS_DVE_SWITCHES.each do |switch|
246
+ puts " #{switch} \\"
247
+ end
201
248
  puts
202
- puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
249
+ puts 'Here is an example which may work for the file you just parsed (add additional +incdir+ options at the end if required):'
203
250
  puts
204
- puts " #{ENV['ORIGEN_SIM_VCS'] || 'vcs'} #{rtl_top} #{output_directory}/#{output_name} #{output_directory}/bridge.c #{output_directory}/client.c -CFLAGS \"-std=c99\" +vpi #{output_directory}/origen.c -timescale=1ns/1ns +define+ORIGEN_VPD=1 +incdir+#{Pathname.new(rtl_top).dirname} -debug_access+all -PP"
251
+ puts " #{ENV['ORIGEN_SIM_VCS'] || 'vcs'} #{rtl_top} +incdir+#{Pathname.new(rtl_top).dirname} " + SYNOPSYS_DVE_SWITCHES.join(' ')
205
252
  puts
206
253
  puts 'Copy the following files (produced by vcs) to simulation/<target>/synopsys/. within your Origen application:'
207
254
  puts
@@ -209,57 +256,41 @@ else
209
256
  puts ' simv.daidir'
210
257
  puts
211
258
  puts '-----------------------------------------------------------'
212
- puts 'Icarus Verilog'
259
+ puts 'Synopsys VCS w/ Verdi Waveviewer'
213
260
  puts '-----------------------------------------------------------'
214
261
  puts
215
- puts 'Compile the VPI extension using the following command:'
216
- puts
217
- puts " cd #{output_directory} && #{ENV['ORIGEN_SIM_IVERILOG_VPI'] || 'iverilog-vpi'} *.c --name=origen && cd #{Pathname.pwd}"
218
- puts
219
262
  puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
220
263
  puts
221
- puts " #{output_directory}/#{output_name} \\"
222
- puts ' -o origen.vvp \\'
223
- puts ' -DORIGEN_VCD'
264
+ SYNOPSYS_VERDI_SWITCHES.each do |switch|
265
+ puts " #{switch} \\"
266
+ end
224
267
  puts
225
- 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):'
268
+ puts 'Here is an example which may work for the file you just parsed (add additional +incdir+ options at the end if required):'
226
269
  puts
227
- puts " #{ENV['ORIGEN_SIM_IVERILOG'] || 'iverilog'} #{rtl_top} #{output_directory}/#{output_name} -o origen.vvp -DORIGEN_VCD -I #{Pathname.new(rtl_top).dirname}"
270
+ puts " #{ENV['ORIGEN_SIM_VCS'] || 'vcs'} #{rtl_top} +incdir+#{Pathname.new(rtl_top).dirname} " + SYNOPSYS_VERDI_SWITCHES.join(' ')
228
271
  puts
229
- puts 'Copy the following files (produced by iverilog) to simulation/<target>/icarus/. within your Origen application:'
272
+ puts 'Copy the following files (produced by vcs) to simulation/<target>/synopsys/. within your Origen application:'
230
273
  puts
231
- puts " #{output_directory}/origen.vpi"
232
- puts ' origen.vvp'
274
+ puts ' simv'
275
+ puts ' simv.daidir'
233
276
  puts
234
277
  puts '-----------------------------------------------------------'
235
- puts 'Verdi w/ Synopsys VCS'
278
+ puts 'Cadence Incisive (irun)'
236
279
  puts '-----------------------------------------------------------'
237
280
  puts
238
281
  puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
239
282
  puts
240
- puts " #{output_directory}/#{output_name} \\"
241
- puts " #{output_directory}/brdige.c \\"
242
- puts " #{output_directory}/client.c \\"
243
- puts ' -CFLAGS "-std=c99" \\'
244
- puts ' +vpi \\'
245
- puts " #{output_directory}/origen.c \\"
246
- puts ' +define+ORIGEN_FSDB=1 \\'
247
- puts ' -debug_access+all \\'
248
- puts ' +lint=all,noVCDE,noIWU,noVNGS,noCAWM-L,noPORTFRC,noZERO,noNS \\'
249
- puts ' -PP \\'
250
- puts ' -timescale=1ns/100ps \\'
251
- puts ' -full64 \\'
252
- puts ' -lca \\'
253
- puts ' -kdb \\'
283
+ CADENCE_SWITCHES.each do |switch|
284
+ puts " #{switch} \\"
285
+ end
254
286
  puts
255
287
  puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
256
288
  puts
257
- puts " #{ENV['ORIGEN_SIM_VCS'] || 'vcs'} #{rtl_top} #{output_directory}/#{output_name} #{output_directory}/bridge.c #{output_directory}/client.c -CFLAGS \"-std=c99\" +vpi #{output_directory}/origen.c +define+ORIGEN_FSDB=1 +incdir+#{Pathname.new(rtl_top).dirname} -debug_access+all +lint=all,noVCDE,noIWU,noVNGS,noCAWM-L,noPORTFRC,noZERO,noNS -PP -timescale=1ns/100ps -full64 -lca -kdb"
289
+ puts " #{ENV['ORIGEN_SIM_IRUN'] || 'irun'} #{rtl_top} -incdir #{Pathname.new(rtl_top).dirname} " + CADENCE_SWITCHES.join(' ')
258
290
  puts
259
- puts 'Copy the following files (produced by vcs) to simulation/<target>/verdi/. within your Origen application:'
291
+ puts 'Copy the following directory (produced by irun) to simulation/<target>/cadence/. within your Origen application:'
260
292
  puts
261
- puts ' simv'
262
- puts ' simv.daidir'
293
+ puts ' INCA_libs'
263
294
  puts
264
295
  puts '-----------------------------------------------------------'
265
296
  puts
@@ -51,6 +51,44 @@ module Origen
51
51
  @simulator_value = nil
52
52
  end
53
53
 
54
+ def driver_net
55
+ @driver_net ||= "#{tester.simulator.testbench_top}.pins.#{rtl_name}"
56
+ end
57
+
58
+ alias_method :_orig_drive, :drive
59
+ def drive(*args)
60
+ if _analog_pin_? && simulation_running? && tester.simulator.wreal?
61
+ tester.poke("#{driver_net}.drive_en", 1)
62
+ tester.poke("#{driver_net}.drive", args.first + 0.0)
63
+ else
64
+ _orig_drive(*args)
65
+ end
66
+ end
67
+ alias_method :write, :drive
68
+
69
+ alias_method :_orig_assert, :assert
70
+ def assert(*args)
71
+ if _analog_pin_? && simulation_running? && tester.simulator.wreal?
72
+ drive_enabled = tester.peek("#{driver_net}.drive_en").to_i
73
+ if drive_enabled == 1
74
+ tester.poke("#{driver_net}.drive_en", 0)
75
+ tester.cycle
76
+ end
77
+ measured = tester.peek("#{driver_net}.pin", true)
78
+ # Could implement checking/limits here in future
79
+ else
80
+ _orig_assert(*args)
81
+ end
82
+ end
83
+ alias_method :compare, :assert
84
+ alias_method :expect, :assert
85
+ alias_method :read, :assert
86
+ alias_method :measure, :assert
87
+
88
+ def _analog_pin_?
89
+ type == :analog || is_a?(Origen::Pins::PowerPin) || is_a?(Origen::Pins::GroundPin)
90
+ end
91
+
54
92
  def apply_force
55
93
  if force
56
94
  simulator.put("2^#{simulation_index}^#{force}")
@@ -3,12 +3,17 @@ module Origen
3
3
  module TopLevel
4
4
  # Like pins, except removes any pins which have their rtl_name
5
5
  # attribute set to 'nc'
6
- def rtl_pins
7
- @rtl_pins ||= begin
6
+ # Optionally pass in a type: option set to either :analog or :digital to
7
+ # have only the pins with that type returned
8
+ def rtl_pins(options = {})
9
+ @rtl_pins ||= {}
10
+ @rtl_pins[options[:type]] ||= begin
11
+ opts = options.dup
8
12
  p = []
9
13
  pins.each do |name, pin|
10
14
  options = {}
11
- unless pin.rtl_name.to_s.downcase == 'nc'
15
+ unless pin.rtl_name.to_s.downcase == 'nc' ||
16
+ (opts[:type] && pin.type && opts[:type] != pin.type)
12
17
  if pin.primary_group
13
18
  options[:group] = true
14
19
  end
@@ -78,7 +78,7 @@ module OrigenSim
78
78
  if Origen.debugger_enabled?
79
79
  Origen.log.error 'The simulation failed to get underway!'
80
80
  else
81
- Origen.log.error 'The simulation failed to get underway! (run again with -d to see why)'
81
+ Origen.log.error 'The simulation failed to get underway! (run again with -verbose to see why)'
82
82
  end
83
83
  else
84
84
  if in_progress
@@ -63,7 +63,6 @@ module OrigenSim
63
63
  # to be defined. This should be a comma-separeted string of the available values.
64
64
  # It will be assumed that each details will be defined in the snapshot.
65
65
  def fetch
66
- puts 'FETCHING!'.cyan
67
66
  # Read the available details.
68
67
  # names = str_peek("#{debug_module}.PARAMETER_NAMES").split(',')
69
68
  names = @simulator.peek_str(detail_names_net)