origen_sim 0.7.0 → 0.8.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
  SHA1:
3
- metadata.gz: f60a5e099e0edaf4c0c769034d2eb9dd2cef4660
4
- data.tar.gz: b89dd7aa4de98bd80bd7b130158ef0c5a2f0acc1
3
+ metadata.gz: 07feeaf38e2cacb8a570887c9bfc2acd38b26956
4
+ data.tar.gz: 693b70230e195a5b0fd49c586ec16f5116fe7d0d
5
5
  SHA512:
6
- metadata.gz: 17cb26ed22d5098edcdc59a2e5ee23e35a8b36b4b9b2b6959990bd151880da02a925719286a46b9d9dc20711a1640dbab809fbb01de5139ae7f5845c97a8bc52
7
- data.tar.gz: c30220fbebb6a393bdc5ff05e80d51401aa40b7ac031f69c56fa14c7ee673b2111851682e46967b767afaa72ae0299c517c32fd3ff1616ab5fd5a32ec5195a70
6
+ metadata.gz: 295d5c1df56f7341fa5e60b35b902169d92d21c482a2bee4452827d84e847697975e218aa4eb86e07d10d79e0939bee3d4e2a58ede7a347c8599fb26733ac7b9
7
+ data.tar.gz: e51c858045564989fa53ce7bc281d70afc887e5312f81908e44463a303c93d0c65d5a61cb15095a12892e7d3ff4dc3002bb5565f0735a3c37284298889500f7e
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenSim
2
2
  MAJOR = 0
3
- MINOR = 7
3
+ MINOR = 8
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
6
 
data/ext/bridge.c CHANGED
@@ -30,7 +30,7 @@ typedef struct Pin {
30
30
  } Pin;
31
31
 
32
32
  typedef struct Event {
33
- int time;
33
+ uint64_t time;
34
34
  char data;
35
35
  } Event;
36
36
 
@@ -62,7 +62,7 @@ static void bridge_capture_pin(char*);
62
62
  static void bridge_stop_capture_pin(char*);
63
63
  static void bridge_dont_care_pin(char*);
64
64
  static void bridge_register_wave_events(void);
65
- static void bridge_register_wave_event(int, int, int, int);
65
+ static void bridge_register_wave_event(int, int, int, uint64_t);
66
66
  static void bridge_enable_drive_wave(Pin*);
67
67
  static void bridge_disable_drive_wave(Pin*);
68
68
  static void bridge_enable_compare_wave(Pin*);
@@ -160,7 +160,7 @@ static void bridge_register_wave_events() {
160
160
  int x = 0;
161
161
 
162
162
  while (drive_waves[i].events[x].data != 'T' && x < MAX_WAVE_EVENTS) {
163
- int time;
163
+ uint64_t time;
164
164
 
165
165
  time = drive_waves[i].events[x].time;
166
166
 
@@ -180,7 +180,7 @@ static void bridge_register_wave_events() {
180
180
  int x = 0;
181
181
 
182
182
  while (compare_waves[i].events[x].data != 'T' && x < MAX_WAVE_EVENTS) {
183
- int time;
183
+ uint64_t time;
184
184
 
185
185
  time = compare_waves[i].events[x].time;
186
186
 
@@ -260,9 +260,9 @@ static void bridge_clear_waves_and_pins() {
260
260
  }
261
261
 
262
262
 
263
- static void bridge_set_period(char * p_in_ns) {
264
- int p = (int) strtol(p_in_ns, NULL, 10);
265
- period_in_ps = p * 1000;
263
+ static void bridge_set_period(char * p_in_ps_str) {
264
+ uint64_t p = (uint64_t) strtol(p_in_ps_str, NULL, 10);
265
+ period_in_ps = p;
266
266
  bridge_clear_waves_and_pins();
267
267
  }
268
268
 
@@ -472,8 +472,7 @@ PLI_INT32 bridge_apply_wave_event_cb(p_cb_data data) {
472
472
 
473
473
 
474
474
  /// Registers a callback to apply the given wave during this cycle
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
+ static void bridge_register_wave_event(int wave_ix, int event_ix, int compare, uint64_t delay_in_ps) {
477
476
  s_cb_data call;
478
477
  s_vpi_time time;
479
478
 
@@ -565,7 +564,7 @@ PLI_INT32 bridge_wait_for_msg(p_cb_data data) {
565
564
  bridge_define_pin(arg1, arg2, arg3, arg4);
566
565
  break;
567
566
  // Set Period
568
- // 1^100
567
+ // 1^100000
569
568
  case '1' :
570
569
  arg1 = strtok(NULL, "^");
571
570
  bridge_set_period(arg1);
@@ -757,7 +756,7 @@ static void end_simulation() {
757
756
  v.value.str = "1";
758
757
  vpi_put_value(handle, &v, NULL, vpiNoDelay);
759
758
  // Corner case during testing, the timeset may not have been set yet
760
- bridge_set_period("1");
759
+ bridge_set_period("1000");
761
760
  // Do a cycle so that the simulation sees the edge on origen.finish
762
761
  bridge_cycle();
763
762
  }
@@ -88,7 +88,7 @@ Origen.app.runner.launch action: :compile,
88
88
  check_for_changes: false,
89
89
  quiet: true
90
90
 
91
- dut.export(rtl_top_module, file_path: "#{output_directory}")
91
+ dut.export(rtl_top_module, dir: "#{output_directory}", namespace: nil)
92
92
 
93
93
  puts
94
94
  puts
@@ -367,12 +367,14 @@ module OrigenSim
367
367
  # moving onto another pattern
368
368
  def pattern_generated(path)
369
369
  sync_up if simulation_tester?
370
+ @simulation_completed_cleanly = true
370
371
  end
371
372
 
372
373
  # Called before every pattern is generated, but we only use it the
373
374
  # first time it is called to kick off the simulator process if the
374
375
  # current tester is an OrigenSim::Tester
375
376
  def before_pattern(name)
377
+ @simulation_completed_cleanly = false
376
378
  if simulation_tester?
377
379
  unless @enabled
378
380
  # When running pattern back-to-back, only want to launch the simulator the
@@ -438,14 +440,14 @@ module OrigenSim
438
440
 
439
441
  def wave_to_str(wave)
440
442
  wave.evaluated_events.map do |time, data|
441
- time = time * (config[:time_factor] || 1)
443
+ time = time * time_conversion_factor * (config[:time_factor] || 1)
442
444
  if data == :x
443
445
  data = 'X'
444
446
  elsif data == :data
445
447
  data = wave.drive? ? 'D' : 'C'
446
448
  end
447
449
  if data == 'C'
448
- "#{time}_#{data}_#{time + (config[:time_factor] || 1)}_X"
450
+ "#{time}_#{data}_#{time + (time_conversion_factor * (config[:time_factor] || 1))}_X"
449
451
  else
450
452
  "#{time}_#{data}"
451
453
  end
@@ -466,8 +468,8 @@ module OrigenSim
466
468
  end
467
469
 
468
470
  def set_period(period_in_ns)
469
- period_in_ns = period_in_ns * (config[:time_factor] || 1)
470
- put("1^#{period_in_ns}")
471
+ period_in_ps = period_in_ns * time_conversion_factor * (config[:time_factor] || 1)
472
+ put("1^#{period_in_ps}")
471
473
  end
472
474
 
473
475
  def cycle(number_of_cycles)
@@ -536,7 +538,7 @@ module OrigenSim
536
538
  # deal with it here to ensure cross simulator compatibility.
537
539
 
538
540
  # http://rubular.com/r/eTVGzrYmXQ
539
- if net =~ /(.*)\[(\d+):?(\.\.)?(\d*)\]$/
541
+ if !config[:vendor] == :synopsys && net =~ /(.*)\[(\d+):?(\.\.)?(\d*)\]$/
540
542
  path = Regexp.last_match(1)
541
543
  msb = Regexp.last_match(2).to_i
542
544
  lsb = Regexp.last_match(4)
@@ -606,6 +608,9 @@ module OrigenSim
606
608
  if c > 0
607
609
  @failed = true
608
610
  Origen.log.error "The simulation failed with #{c} errors!"
611
+ elsif !@simulation_completed_cleanly
612
+ @failed = true
613
+ Origen.log.error 'The simulation exited early!'
609
614
  end
610
615
  end
611
616
  end
@@ -688,6 +693,11 @@ module OrigenSim
688
693
 
689
694
  private
690
695
 
696
+ # Pre 0.8.0 the simulator represented the time in ns instead of ps
697
+ def time_conversion_factor
698
+ @time_conversion_factor ||= dut_version < '0.8.0' ? 1 : 1000
699
+ end
700
+
691
701
  def clean(net)
692
702
  if net =~ /^dut\./
693
703
  "origen.#{net}"
@@ -23,7 +23,13 @@ module OrigenSim
23
23
  @sync_cycles = 0
24
24
  yield
25
25
  end
26
- @sync_pins.map { |pin| simulator.peek("origen.pins.#{pin.id}.sync_memory[#{@sync_cycles - 1}:0]") }
26
+ @sync_pins.map do |pin|
27
+ if @sync_cycles.size == 1
28
+ simulator.peek("origen.pins.#{pin.id}.sync_memory[0]")
29
+ else
30
+ simulator.peek("origen.pins.#{pin.id}.sync_memory[#{@sync_cycles - 1}:0]")
31
+ end
32
+ end
27
33
  end
28
34
 
29
35
  # Start the simulator
@@ -100,8 +106,8 @@ module OrigenSim
100
106
  end
101
107
  end
102
108
  if simulator.sync_active?
109
+ @sync_cycles += 1
103
110
  pins.each do |pin|
104
- @sync_cycles += 1
105
111
  @sync_pins << pin unless @sync_pins.include?(pin)
106
112
  end
107
113
  end
@@ -59,6 +59,17 @@ module OrigenSimDev
59
59
  reg.bits 5..2, :p3
60
60
  reg.bits 9..6, :p4
61
61
  end
62
+
63
+ # Reg for testing parallel read/sync when this one is read the data will
64
+ # be read out via dout rather than JTAG
65
+ add_reg :parallel_read, 0x18 do |reg|
66
+ reg.bits 30..28, :b1
67
+ reg.bits 26..24, :b2
68
+ reg.bits 18..16, :b3
69
+ reg.bits 14..12, :b4
70
+ reg.bits 6..4, :b5
71
+ reg.bits 2..0, :b6
72
+ end
62
73
  end
63
74
 
64
75
  def interactive_startup
@@ -90,14 +101,27 @@ module OrigenSimDev
90
101
  end
91
102
 
92
103
  def read_register(reg, options = {})
93
- jtag.write_ir(0x8, size: 4)
94
- dr.rg_enable.write(1)
95
- dr.rg_read.write(1)
96
- dr.rg_addr.write(reg.address)
97
- jtag.write_dr(dr)
98
- dr.rg_enable.write(0)
99
- dr.rg_data.copy_all(reg)
100
- jtag.read_dr(dr)
104
+ # Special read for this register to test sync'ing over a parallel
105
+ if reg.id == :parallel_read
106
+ pins = []
107
+ reg.shift_out_with_index do |bit, i|
108
+ if bit.is_to_be_stored?
109
+ pins << dut.pins(:dout)[i]
110
+ end
111
+ end
112
+ tester.store_next_cycle(*pins.reverse)
113
+ 1.cycle
114
+ dut.pins(:dout).dont_care
115
+ else
116
+ jtag.write_ir(0x8, size: 4)
117
+ dr.rg_enable.write(1)
118
+ dr.rg_read.write(1)
119
+ dr.rg_addr.write(reg.address)
120
+ jtag.write_dr(dr)
121
+ dr.rg_enable.write(0)
122
+ dr.rg_data.copy_all(reg)
123
+ jtag.read_dr(dr)
124
+ end
101
125
  end
102
126
  end
103
127
  end
data/pattern/test.rb CHANGED
@@ -60,6 +60,16 @@ Pattern.create do
60
60
  unless dut.cmd.data == 0x2244_6688
61
61
  fail "CMD register did not sync from simulation"
62
62
  end
63
+
64
+ ss "Test sync of a register via a parallel interface"
65
+ dut.parallel_read.write(0)
66
+ dut.data_out.write!(0x7707_7077)
67
+ dut.pins(:dout).assert!(0x7707_7077)
68
+ dut.pins(:dout).dont_care
69
+ dut.parallel_read.sync
70
+ unless dut.parallel_read.data == 0x7707_7077
71
+ fail "PARALLEL_READ register did not sync from simulation"
72
+ end
63
73
  end
64
74
 
65
75
  ss "Do some operations with the counter, just for fun"
@@ -167,13 +167,11 @@ module origen;
167
167
  begin
168
168
  $vcdplusfile("origen.vpd");
169
169
  $vcdpluson;
170
+ $vcdplusmemon;
170
171
  end
171
172
  `endif
172
173
 
173
174
  always @(posedge finish) begin
174
- `ifdef ORIGEN_VPD
175
- $vcdplusoff;
176
- `endif
177
175
  //$display("********************************");
178
176
  //$display("Finishing simulation...");
179
177
  //$display("********************************");
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_sim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen McGinty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-06 00:00:00.000000000 Z
11
+ date: 2018-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.29'
19
+ version: '0.32'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.29'
26
+ version: '0.32'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: origen_testers
29
29
  requirement: !ruby/object:Gem::Requirement