origen_sim 0.16.1 → 0.20.0

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