origen_sim 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +5 -5
  2. data/config/application.rb +17 -2
  3. data/config/shared_commands.rb +7 -0
  4. data/config/version.rb +1 -1
  5. data/ext/bridge.c +13 -3
  6. data/lib/origen_sim.rb +10 -0
  7. data/lib/origen_sim/artifacts.rb +101 -0
  8. data/lib/origen_sim/commands/build.rb +41 -9
  9. data/lib/origen_sim/heartbeat.rb +13 -1
  10. data/lib/origen_sim/origen_testers/api.rb +90 -7
  11. data/lib/origen_sim/simulation.rb +49 -4
  12. data/lib/origen_sim/simulator.rb +171 -19
  13. data/lib/origen_sim/stderr_reader.rb +19 -13
  14. data/lib/origen_sim/stdout_reader.rb +22 -16
  15. data/lib/origen_sim/tester.rb +110 -1
  16. data/lib/origen_sim_dev/dut.rb +5 -0
  17. data/pattern/test.rb +143 -0
  18. data/templates/empty.gtkw +19 -1
  19. data/templates/empty.rc +86 -0
  20. data/templates/empty.svcf +79 -9
  21. data/templates/empty.tcl +37 -9
  22. data/templates/origen_guides/simulation/app.md.erb +131 -0
  23. data/templates/origen_guides/simulation/artifacts.md.erb +115 -0
  24. data/templates/origen_guides/simulation/compiling.md.erb +190 -0
  25. data/templates/origen_guides/simulation/debugging.md.erb +135 -0
  26. data/templates/origen_guides/simulation/environment.md.erb +217 -0
  27. data/templates/origen_guides/simulation/flows.md.erb +69 -0
  28. data/templates/origen_guides/simulation/howitworks.md.erb +64 -0
  29. data/templates/origen_guides/simulation/introduction.md.erb +35 -0
  30. data/templates/origen_guides/simulation/log.md.erb +118 -0
  31. data/templates/origen_guides/simulation/patterns.md.erb +193 -0
  32. data/templates/probe.tcl.erb +3 -0
  33. data/templates/rtl_v/origen.v.erb +19 -3
  34. data/templates/web/layouts/_guides.html.erb +15 -0
  35. metadata +18 -5
@@ -14,13 +14,24 @@ module OrigenSim
14
14
  end
15
15
 
16
16
  simulator.configure(opts, &block)
17
+ @comment_buffer = []
18
+ @last_comment_size = 0
17
19
  super()
18
20
  end
19
21
 
22
+ # Returns the current cycle count
23
+ def cycle_count
24
+ @cycle_count || 0
25
+ end
26
+
20
27
  def simulator
21
28
  OrigenSim.simulator
22
29
  end
23
30
 
31
+ def dut_version
32
+ simulator.dut_version
33
+ end
34
+
24
35
  def handshake(options = {})
25
36
  end
26
37
 
@@ -50,6 +61,12 @@ module OrigenSim
50
61
  simulator.sync_up
51
62
  end
52
63
 
64
+ # Flush any buffered simulation output, this should cause live waveviewers to
65
+ # reflect the latest state
66
+ def flush
67
+ simulator.flush
68
+ end
69
+
53
70
  def set_timeset(name, period_in_ns)
54
71
  super
55
72
  # Need to remove this once OrigenTesters does it
@@ -68,7 +85,10 @@ module OrigenSim
68
85
  puts '$tester.set_timeset("nvmbist", 40) # Where 40 is the period in ns'
69
86
  exit 1
70
87
  end
88
+ flush_comments unless @comment_buffer.empty?
71
89
  simulator.cycle(options[:repeat] || 1)
90
+ @cycle_count ||= 0
91
+ @cycle_count += options[:repeat] || 1
72
92
  if @after_next_vector
73
93
  @after_next_vector.call(@after_next_vector_args)
74
94
  @after_next_vector = nil
@@ -76,7 +96,7 @@ module OrigenSim
76
96
  end
77
97
 
78
98
  def c1(msg, options = {})
79
- simulator.write_comment(msg) if @step_comment_on
99
+ @comment_buffer << msg if @step_comment_on
80
100
  end
81
101
 
82
102
  def loop_vectors(name, number_of_loops, options = {})
@@ -126,8 +146,97 @@ module OrigenSim
126
146
  end
127
147
  end
128
148
 
149
+ def match(pin, state, timeout_in_cycles, options = {})
150
+ if dut_version <= '0.12.0'
151
+ OrigenSim.error "Use of match loops requires a DUT model compiled with OrigenSim version > 0.12.0, the current dut was compiled with #{dut_version}"
152
+ end
153
+ expected_val = state == :high ? 1 : 0
154
+ if options[:pin2]
155
+ expected_val2 = options[:state2] == :high ? 1 : 0
156
+ end
157
+ timed_out = true
158
+ 10.times do
159
+ (timeout_in_cycles / 10).cycles
160
+ current_val = simulator.peek("dut.#{pin.rtl_name}").to_i
161
+ if options[:pin2]
162
+ current_val2 = simulator.peek("dut.#{options[:pin2].rtl_name}").to_i
163
+ if current_val == expected_val || current_val2 == expected_val2
164
+ timed_out = false
165
+ break
166
+ end
167
+ else
168
+ if current_val == expected_val
169
+ timed_out = false
170
+ break
171
+ end
172
+ end
173
+ end
174
+ # Final assertion to make the pattern fail if the loop timed out
175
+ if timed_out
176
+ pin.restore_state do
177
+ pin.assert!(expected_val)
178
+ end
179
+ if options[:pin2]
180
+ options[:pin2].restore_state do
181
+ options[:pin2].assert!(expected_val2)
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ def match_block(timeout_in_cycles, options = {}, &block)
188
+ if dut_version <= '0.12.0'
189
+ OrigenSim.error "Use of match loops requires a DUT model compiled with OrigenSim version > 0.12.0, the current dut was compiled with #{dut_version}"
190
+ end
191
+ match_conditions = Origen::Utility::BlockArgs.new
192
+ fail_conditions = Origen::Utility::BlockArgs.new
193
+ if block.arity > 0
194
+ block.call(match_conditions, fail_conditions)
195
+ else
196
+ match_conditions.add(&block)
197
+ end
198
+ timed_out = true
199
+ simulator.match_loop do
200
+ 10.times do
201
+ (timeout_in_cycles / 10).cycles
202
+ # Consider the match resolved if any condition can execute without generating errors
203
+ if match_conditions.any? do |condition|
204
+ e = simulator.match_errors
205
+ condition.call
206
+ e == simulator.match_errors
207
+ end
208
+ timed_out = false
209
+ break
210
+ end
211
+ end
212
+ end
213
+ # Final execution to make the pattern fail if the loop timed out
214
+ if timed_out
215
+ if fail_conditions.instance_variable_get(:@block_args).empty?
216
+ match_conditions.each(&:call)
217
+ else
218
+ fail_conditions.each(&:call)
219
+ end
220
+ end
221
+ end
222
+
223
+ def wait(*args)
224
+ super
225
+ flush if Origen.running_interactively? && dut_version > '0.12.1'
226
+ end
227
+
129
228
  private
130
229
 
230
+ def flush_comments
231
+ # Looping for at least the length of the last comment is require to ensure that all lines
232
+ # from the last comment are either overwritten or cleared
233
+ [@comment_buffer.size, @last_comment_size].max.times do |i|
234
+ simulator.write_comment(i, @comment_buffer[i])
235
+ end
236
+ @last_comment_size = @comment_buffer.size
237
+ @comment_buffer.clear
238
+ end
239
+
131
240
  def after_next_vector(*args, &block)
132
241
  @after_next_vector = block
133
242
  @after_next_vector_args = args
@@ -24,6 +24,7 @@ module OrigenSimDev
24
24
  add_pin :p4, size: 4, force: 0xA
25
25
  add_pin :v1, rtl_name: 'nc'
26
26
  add_pin :v2, rtl_name: :nc
27
+ add_pin :done
27
28
  add_pin :not_present
28
29
 
29
30
  timeset :func do |t|
@@ -84,6 +85,10 @@ module OrigenSimDev
84
85
  # tester.simulator.log_messages = true
85
86
  tester.set_timeset('func', 100)
86
87
 
88
+ dut.pin(:rstn).drive!(1)
89
+ 10.cycles
90
+ dut.pin(:rstn).drive!(0)
91
+ 10.cycles
87
92
  dut.pin(:rstn).drive!(1)
88
93
  10.cycles
89
94
  dut.pin(:tck).drive!(1)
@@ -11,6 +11,9 @@ Pattern.create do
11
11
  dut.jtag.read_ir(0xE, size: 4)
12
12
 
13
13
  ss "Switch to slower timeset"
14
+ ss "And test multiple comments for Github issue #8"
15
+ ss "Blah blah, more stuff to verify that we can handle large comment blocks without having problems"
16
+ ss "Blah blah, more stuff to verify that we can handle large comment blocks without having problems"
14
17
  tester.set_timeset("func", 200)
15
18
 
16
19
  dut.jtag.write_ir(0x5, size: 4)
@@ -103,4 +106,144 @@ Pattern.create do
103
106
  dut.cmd.write!(0x55)
104
107
  60.cycles
105
108
  end
109
+
110
+ ss "Test the command works with static vectors"
111
+ dut.pin(:done).assert!(1)
112
+ dut.pin(:done).dont_care
113
+ dut.cmd.write!(0x75)
114
+ 5.cycles
115
+ dut.pin(:done).assert!(0)
116
+ dut.pin(:done).dont_care
117
+ 500.cycles
118
+ dut.pin(:done).assert!(0)
119
+ dut.pin(:done).dont_care
120
+ 500.cycles
121
+ dut.pin(:done).assert!(1)
122
+ dut.pin(:done).dont_care
123
+
124
+ ss "Test basic match loop"
125
+ dut.pin(:done).assert!(1)
126
+ dut.pin(:done).dont_care
127
+ dut.cmd.write!(0x75)
128
+ 5.cycles
129
+ dut.pin(:done).assert!(0)
130
+ dut.pin(:done).dont_care
131
+ tester.wait match: true, time_in_cycles: 2000, pin: dut.pin(:done), state: :high
132
+ dut.pin(:done).assert!(1)
133
+ dut.pin(:done).dont_care
134
+
135
+ ss "Test basic 2-pin match loop"
136
+ dut.pin(:done).assert!(1)
137
+ dut.pin(:done).dont_care
138
+ dut.cmd.write!(0x75)
139
+ 5.cycles
140
+ dut.pin(:done).assert!(0)
141
+ dut.pin(:done).dont_care
142
+ tester.wait match: true, time_in_cycles: 2000, pin: dut.pin(:tdo), state: :low,
143
+ pin2: dut.pin(:done), state2: :high
144
+ dut.pin(:done).assert!(1)
145
+ dut.pin(:done).dont_care
146
+
147
+ ss "Test a block match loop"
148
+ dut.pin(:done).assert!(1)
149
+ dut.pin(:done).dont_care
150
+ dut.cmd.write!(0x75)
151
+ 5.cycles
152
+ dut.pin(:done).assert!(0)
153
+ dut.pin(:done).dont_care
154
+ tester.wait match: true, time_in_cycles: 2000 do
155
+ dut.pin(:done).assert!(1)
156
+ end
157
+ dut.pin(:done).assert!(1)
158
+ dut.pin(:done).dont_care
159
+
160
+ # ss "Test a multi-block match loop"
161
+ # dut.pin(:done).assert!(1)
162
+ # dut.pin(:done).dont_care
163
+ # dut.cmd.write!(0x75)
164
+ # dut.pin(:done).assert!(0)
165
+ # dut.pin(:done).dont_care
166
+ # tester.wait match: true, time_in_cycles: 2000 do |conditions, fail|
167
+ # # Just do two conditions that do the same thing here, the content
168
+ # # is not important for testing this feature
169
+ # conditions.add do
170
+ # dut.pin(:done).assert!(1)
171
+ # end
172
+ # conditions.add do
173
+ # dut.pin(:done).assert!(1)
174
+ # end
175
+ # end
176
+ # dut.pin(:done).assert!(0)
177
+ # dut.pin(:done).dont_care
178
+
179
+ ss "Test sim_delay"
180
+ dut.pin(:done).assert!(1)
181
+ dut.pin(:done).dont_care
182
+ dut.cmd.write!(0x75)
183
+ 5.cycles
184
+ dut.pin(:done).assert!(0)
185
+ dut.pin(:done).dont_care
186
+ tester.sim_delay :delay1 do
187
+ dut.pin(:done).assert!(1)
188
+ end
189
+ dut.pin(:done).assert!(1)
190
+ dut.pin(:done).dont_care
191
+
192
+ ss "Test sim delay with timeout"
193
+ dut.pin(:done).assert!(1)
194
+ dut.pin(:done).dont_care
195
+ dut.cmd.write!(0x75)
196
+ 5.cycles
197
+ dut.pin(:done).assert!(0)
198
+ dut.pin(:done).dont_care
199
+ tester.sim_delay :delay1, time_in_cycles: 2000 do
200
+ dut.pin(:done).assert!(1)
201
+ end
202
+ dut.pin(:done).assert!(1)
203
+ dut.pin(:done).dont_care
204
+
205
+ ss "Test sim delay with resolution"
206
+ dut.pin(:done).assert!(1)
207
+ dut.pin(:done).dont_care
208
+ e = tester.cycle_count
209
+ dut.cmd.write!(0x75)
210
+ 5.cycles
211
+ dut.pin(:done).assert!(0)
212
+ dut.pin(:done).dont_care
213
+ tester.sim_delay :delay1, resolution: 10 do
214
+ dut.pin(:done).assert!(1)
215
+ end
216
+ dut.pin(:done).assert!(1)
217
+ dut.pin(:done).dont_care
218
+
219
+ ss "Test sim delay with resolution and timeout"
220
+ dut.pin(:done).assert!(1)
221
+ dut.pin(:done).dont_care
222
+ e = tester.cycle_count
223
+ dut.cmd.write!(0x75)
224
+ 5.cycles
225
+ dut.pin(:done).assert!(0)
226
+ dut.pin(:done).dont_care
227
+ tester.sim_delay :delay1, time_in_cycles: 2000, resolution: { time_in_cycles: 10 } do
228
+ dut.pin(:done).assert!(1)
229
+ end
230
+ dut.pin(:done).assert!(1)
231
+ dut.pin(:done).dont_care
232
+
233
+ ss "Test sim delay with padding"
234
+ dut.pin(:done).assert!(1)
235
+ dut.pin(:done).dont_care
236
+ e = tester.cycle_count
237
+ dut.cmd.write!(0x75)
238
+ 5.cycles
239
+ dut.pin(:done).assert!(0)
240
+ dut.pin(:done).dont_care
241
+ tester.sim_delay :delay1, time_in_cycles: 2000, padding: { time_in_cycles: 500 } do
242
+ dut.pin(:done).assert!(1)
243
+ end
244
+ dut.pin(:done).assert!(1)
245
+ dut.pin(:done).dont_care
246
+ if (tester.cycle_count - e) < 1400
247
+ OrigenSim.error "sim_delay padding was not applied!"
248
+ end
106
249
  end
@@ -17,10 +17,28 @@
17
17
  [signals_width] 158
18
18
  [sst_expanded] 1
19
19
  [sst_vpaned_height] 337
20
+ @800200
21
+ -debug
20
22
  @820
21
23
  origen.debug.pattern[1023:0]
22
- origen.debug.comments[1023:0]
24
+ @800200
25
+ -Comments
26
+ @820
27
+ origen.debug.comments0[1023:0]
28
+ origen.debug.comments1[1023:0]
29
+ origen.debug.comments2[1023:0]
30
+ origen.debug.comments3[1023:0]
31
+ origen.debug.comments4[1023:0]
32
+ origen.debug.comments5[1023:0]
33
+ origen.debug.comments6[1023:0]
34
+ origen.debug.comments7[1023:0]
35
+ origen.debug.comments8[1023:0]
36
+ origen.debug.comments9[1023:0]
37
+ @1000200
38
+ -Comments
23
39
  @22
24
40
  origen.debug.errors[31:0]
41
+ @1000200
42
+ -debug
25
43
  [pattern_trace] 1
26
44
  [pattern_trace] 0
@@ -0,0 +1,86 @@
1
+ Magic 271485
2
+ Revision Verdi_N-2017.12-SP2
3
+
4
+ ; Window Layout <x> <y> <width> <height> <signalwidth> <valuewidth>
5
+ viewPort 0 28 1450 327 288 65
6
+
7
+ ; File list:
8
+ ; openDirFile [-d delimiter] [-s time_offset] [-rf auto_bus_rule_file] path_name file_name
9
+ openDirFile -d / "" ""
10
+
11
+ ; file time scale:
12
+ ; fileTimeScale ### s|ms|us|ns|ps
13
+
14
+ ; signal spacing:
15
+ signalSpacing 5
16
+
17
+ ; windowTimeUnit is used for zoom, cursor & marker
18
+ windowTimeUnit 1ns
19
+
20
+ ; waveform viewport range
21
+ zoom 0.000000 4013756.949425 1n
22
+ cursor 10096.000000
23
+ marker 0.000000
24
+
25
+ ; user define markers
26
+ ; userMarker time_pos marker_name color linestyle
27
+ ; visible top row signal index
28
+ top 0
29
+ ; marker line index
30
+ markerPos 6
31
+
32
+ ; event list
33
+ ; addEvent event_name event_expression
34
+ ; curEvent event_name
35
+
36
+
37
+
38
+ COMPLEX_EVENT_BEGIN
39
+
40
+
41
+ COMPLEX_EVENT_END
42
+
43
+
44
+
45
+ ; toolbar current search type
46
+ ; curSTATUS search_type
47
+ curSTATUS ByChange
48
+
49
+
50
+ activeDirFile "" ""
51
+ addGroup "Debug"
52
+ addSignal -h 15 -UNSIGNED -HEX -holdScope errors[31:0]
53
+ addSignal -h 15 -UNSIGNED -ASC -holdScope pattern[1023:0]
54
+ addGroup "Comments"
55
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[0]
56
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[1]
57
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[2]
58
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[3]
59
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[4]
60
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[5]
61
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[6]
62
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[7]
63
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[8]
64
+ addSignal -h 15 -UNSIGNED -ASC /origen/debug/comments[9]
65
+ addGroup "DUT"
66
+
67
+ ; getSignalForm Scope Hierarchy Status
68
+ ; active file of getSignalForm
69
+ activeDirFile "" ""
70
+
71
+ GETSIGNALFORM_SCOPE_HIERARCHY_BEGIN
72
+ getSignalForm close
73
+
74
+ "/FSN_DLLDELAY_1"
75
+ "/origen"
76
+
77
+ SCOPE_LIST_BEGIN
78
+ "/testbench/msf1"
79
+ "/FSN_DLLDELAY_1"
80
+ "/testbench"
81
+ "/origen"
82
+ "/origen/dut"
83
+ "/origen/debug"
84
+ SCOPE_LIST_END
85
+
86
+ GETSIGNALFORM_SCOPE_HIERARCHY_END
@@ -2,18 +2,22 @@
2
2
  # Preferences
3
3
  #
4
4
  preferences set plugin-enable-svdatabrowser-new 1
5
- preferences set toolbar-SimControl-WaveWindow {
5
+ preferences set toolbar-Standard-WaveWindow {
6
6
  usual
7
- position -row 1 -pos 4 -anchor e
7
+ position -pos 1
8
8
  }
9
9
  preferences set plugin-enable-groupscope 0
10
- preferences set sb-display-values 1
11
10
  preferences set plugin-enable-interleaveandcompare 0
12
11
  preferences set plugin-enable-waveformfrequencyplot 0
13
12
  preferences set toolbar-WaveZoom-WaveWindow {
14
13
  usual
15
14
  position -row 1 -pos 3 -anchor w
16
15
  }
16
+ preferences set toolbar-SimControl-WaveWindow {
17
+ usual
18
+ position -row 1 -pos 4 -anchor e
19
+ }
20
+ preferences set sb-display-values 1
17
21
  preferences set whats-new-dont-show-at-startup 1
18
22
  #
19
23
  # Groups
@@ -21,6 +25,7 @@ preferences set whats-new-dont-show-at-startup 1
21
25
  catch {group new -name Debug -overlay 0}
22
26
  catch {group new -name {Group 2} -overlay 0}
23
27
  catch {group new -name DUT -overlay 0}
28
+ catch {group new -name Comments -overlay 0}
24
29
  group using Debug
25
30
  group set -overlay 0
26
31
  group set -comment {}
@@ -28,8 +33,7 @@ group clear 0 end
28
33
 
29
34
  group insert \
30
35
  [subst {[format {origen.debug.pattern[1023:0]}]} ] \
31
- [subst {[format {origen.debug.comments[1023:0]}]} ] \
32
- [subst {[format {origen.debug.errors[31:0]}]} ]
36
+ Comments
33
37
  group using {Group 2}
34
38
  group set -overlay 0
35
39
  group set -comment {}
@@ -40,6 +44,22 @@ group set -overlay 0
40
44
  group set -comment {}
41
45
  group clear 0 end
42
46
 
47
+ group using Comments
48
+ group set -overlay 0
49
+ group set -comment {}
50
+ group clear 0 end
51
+
52
+ group insert \
53
+ [subst {[format {origen.debug.comments0[1023:0]}]} ] \
54
+ [subst {[format {origen.debug.comments1[1023:0]}]} ] \
55
+ [subst {[format {origen.debug.comments2[1023:0]}]} ] \
56
+ [subst {[format {origen.debug.comments3[1023:0]}]} ] \
57
+ [subst {[format {origen.debug.comments4[1023:0]}]} ] \
58
+ [subst {[format {origen.debug.comments5[1023:0]}]} ] \
59
+ [subst {[format {origen.debug.comments6[1023:0]}]} ] \
60
+ [subst {[format {origen.debug.comments7[1023:0]}]} ] \
61
+ [subst {[format {origen.debug.comments8[1023:0]}]} ] \
62
+ [subst {[format {origen.debug.comments9[1023:0]}]} ]
43
63
 
44
64
  #
45
65
  # Mnemonic Maps
@@ -70,16 +90,52 @@ waveform baseline set -time 0
70
90
 
71
91
 
72
92
  set groupId0 [waveform add -groups Debug]
93
+
94
+ set groupId1 [waveform find -name Comments]
95
+ set gpGlist1 [waveform hierarchy contents $groupId1]
96
+ set gpID1 [lindex $gpGlist1 0]
97
+ foreach {name attrs} [subst {
98
+ {[format {origen.debug.comments0[1023:0]}]} {-radix %a}
99
+ {[format {origen.debug.comments1[1023:0]}]} {-radix %a}
100
+ {[format {origen.debug.comments2[1023:0]}]} {-radix %a}
101
+ {[format {origen.debug.comments3[1023:0]}]} {-radix %a}
102
+ {[format {origen.debug.comments4[1023:0]}]} {-radix %a}
103
+ {[format {origen.debug.comments5[1023:0]}]} {-radix %a}
104
+ {[format {origen.debug.comments6[1023:0]}]} {-radix %a}
105
+ {[format {origen.debug.comments7[1023:0]}]} {-radix %a}
106
+ {[format {origen.debug.comments8[1023:0]}]} {-radix %a}
107
+ {[format {origen.debug.comments9[1023:0]}]} {-radix %a}
108
+ }] childcmds {
109
+ {}
110
+ {}
111
+ {}
112
+ {}
113
+ {}
114
+ {}
115
+ {}
116
+ {}
117
+ {}
118
+ {}
119
+ } {
120
+ set expected [ join [waveform signals -format path $gpID1] ]
121
+ if {[string equal $name $expected] || $name == "cdivider"} {
122
+ if {$attrs != ""} {
123
+ eval waveform format $gpID1 $attrs
124
+ }
125
+ if { $childcmds != ""} {
126
+ eval $childcmds
127
+ }
128
+ }
129
+ set gpGlist1 [lrange $gpGlist1 1 end]
130
+ set gpID1 [lindex $gpGlist1 0]
131
+ }
132
+
73
133
  set gpGlist0 [waveform hierarchy contents $groupId0]
74
134
  set gpID0 [lindex $gpGlist0 0]
75
135
  foreach {name attrs} [subst {
76
136
  {[format {origen.debug.pattern[1023:0]}]} {-radix %a}
77
- {[format {origen.debug.comments[1023:0]}]} {-radix %a}
78
- {[format {origen.debug.errors[31:0]}]} {}
79
137
  }] childcmds {
80
138
  {}
81
- {}
82
- {}
83
139
  } {
84
140
  set expected [ join [waveform signals -format path $gpID0] ]
85
141
  if {[string equal $name $expected] || $name == "cdivider"} {
@@ -94,7 +150,21 @@ foreach {name attrs} [subst {
94
150
  set gpID0 [lindex $gpGlist0 0]
95
151
  }
96
152
 
153
+ set id [waveform add -signals [subst {
154
+ {[format {origen.debug.errors[31:0]}]}
155
+ } ]]
97
156
 
98
157
  set groupId0 [waveform add -groups DUT]
99
158
 
159
+ waveform xview limits 0 32768000ns
160
+
161
+ #
162
+ # Waveform Window Links
163
+ #
164
+
165
+ #
166
+ # Console windows
167
+ #
168
+ console set -windowname Console
169
+ window geometry Console 600x250+2364+0
100
170