origen_sim 0.12.0 → 0.13.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 +5 -5
- data/config/application.rb +17 -2
- data/config/shared_commands.rb +7 -0
- data/config/version.rb +1 -1
- data/ext/bridge.c +13 -3
- data/lib/origen_sim.rb +10 -0
- data/lib/origen_sim/artifacts.rb +101 -0
- data/lib/origen_sim/commands/build.rb +41 -9
- data/lib/origen_sim/heartbeat.rb +13 -1
- data/lib/origen_sim/origen_testers/api.rb +90 -7
- data/lib/origen_sim/simulation.rb +49 -4
- data/lib/origen_sim/simulator.rb +171 -19
- data/lib/origen_sim/stderr_reader.rb +19 -13
- data/lib/origen_sim/stdout_reader.rb +22 -16
- data/lib/origen_sim/tester.rb +110 -1
- data/lib/origen_sim_dev/dut.rb +5 -0
- data/pattern/test.rb +143 -0
- data/templates/empty.gtkw +19 -1
- data/templates/empty.rc +86 -0
- data/templates/empty.svcf +79 -9
- data/templates/empty.tcl +37 -9
- data/templates/origen_guides/simulation/app.md.erb +131 -0
- data/templates/origen_guides/simulation/artifacts.md.erb +115 -0
- data/templates/origen_guides/simulation/compiling.md.erb +190 -0
- data/templates/origen_guides/simulation/debugging.md.erb +135 -0
- data/templates/origen_guides/simulation/environment.md.erb +217 -0
- data/templates/origen_guides/simulation/flows.md.erb +69 -0
- data/templates/origen_guides/simulation/howitworks.md.erb +64 -0
- data/templates/origen_guides/simulation/introduction.md.erb +35 -0
- data/templates/origen_guides/simulation/log.md.erb +118 -0
- data/templates/origen_guides/simulation/patterns.md.erb +193 -0
- data/templates/probe.tcl.erb +3 -0
- data/templates/rtl_v/origen.v.erb +19 -3
- data/templates/web/layouts/_guides.html.erb +15 -0
- metadata +18 -5
data/lib/origen_sim/tester.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/origen_sim_dev/dut.rb
CHANGED
@@ -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)
|
data/pattern/test.rb
CHANGED
@@ -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
|
data/templates/empty.gtkw
CHANGED
@@ -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
|
-
|
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
|
data/templates/empty.rc
ADDED
@@ -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
|
data/templates/empty.svcf
CHANGED
@@ -2,18 +2,22 @@
|
|
2
2
|
# Preferences
|
3
3
|
#
|
4
4
|
preferences set plugin-enable-svdatabrowser-new 1
|
5
|
-
preferences set toolbar-
|
5
|
+
preferences set toolbar-Standard-WaveWindow {
|
6
6
|
usual
|
7
|
-
position -
|
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
|
-
|
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
|
|