origen_sim 0.5.5 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/application.rb +12 -1
- data/config/commands.rb +31 -10
- data/config/global_commands.rb +12 -0
- data/config/shared_commands.rb +11 -4
- data/config/version.rb +2 -2
- data/ext/bridge.c +18 -8
- data/ext/client.c +1 -1
- data/ext/defines.h.erb +6 -0
- data/ext/origen.c +6 -6
- data/lib/origen_sim/commands/build.rb +119 -81
- data/lib/origen_sim/commands/ci.rb +36 -0
- data/lib/origen_sim/commands/co.rb +36 -0
- data/lib/origen_sim/origen/pins/pin.rb +7 -13
- data/lib/origen_sim/origen_testers/api.rb +66 -0
- data/lib/origen_sim/simulator.rb +123 -43
- data/lib/origen_sim_dev/dut.rb +6 -4
- data/pattern/test.rb +28 -16
- data/templates/empty.gtkw +26 -0
- data/templates/rtl_v/origen.v.erb +10 -49
- metadata +24 -6
- data/ext/README.md +0 -2
data/lib/origen_sim_dev/dut.rb
CHANGED
@@ -16,11 +16,12 @@ module OrigenSimDev
|
|
16
16
|
add_pin :trstn, reset: :drive_lo
|
17
17
|
add_pin_alias :tclk, :tck
|
18
18
|
add_pin :dout, size: 32
|
19
|
+
add_pin :test_bus, size: 16
|
19
20
|
add_pin :din_port, size: 32, rtl_name: 'din', reset: :drive_lo
|
20
|
-
add_pin :p1,
|
21
|
-
add_pin :p2,
|
22
|
-
add_pin :p3, size: 4,
|
23
|
-
add_pin :p4, size: 4,
|
21
|
+
add_pin :p1, force: 0
|
22
|
+
add_pin :p2, force: 1
|
23
|
+
add_pin :p3, size: 4, force: 0
|
24
|
+
add_pin :p4, size: 4, force: 0xA
|
24
25
|
add_pin :v1, rtl_name: 'nc'
|
25
26
|
add_pin :v2, rtl_name: :nc
|
26
27
|
|
@@ -68,6 +69,7 @@ module OrigenSimDev
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def startup(options = {})
|
72
|
+
# tester.simulator.log_messages = true
|
71
73
|
tester.set_timeset('func', 100)
|
72
74
|
|
73
75
|
dut.pin(:rstn).drive!(1)
|
data/pattern/test.rb
CHANGED
@@ -34,27 +34,32 @@ Pattern.create do
|
|
34
34
|
dut.cmd.write!(0x1234_5678)
|
35
35
|
dut.cmd.read!(0x1234_5678)
|
36
36
|
|
37
|
-
tester.
|
38
|
-
|
37
|
+
if tester.sim?
|
38
|
+
tester.simulator.poke("dut.cmd", 0x1122_3344)
|
39
|
+
dut.cmd.read!(0x1122_3344)
|
40
|
+
end
|
39
41
|
|
40
42
|
ss "Test storing a register"
|
41
43
|
dut.cmd.write!(0x2244_6688)
|
42
44
|
dut.cmd.store!
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
if tester.sim?
|
47
|
+
sim = tester.simulator
|
48
|
+
capture_value = sim.peek("origen.pins.tdo.memory").to_i
|
49
|
+
unless capture_value == 0x11662244 # 0x2244_6688 reversed
|
50
|
+
if capture_value
|
51
|
+
fail "Captured #{capture_value.to_hex} instead of 0x11662244!"
|
52
|
+
else
|
53
|
+
fail "Nothing captured instead of 0x11662244!"
|
54
|
+
end
|
50
55
|
end
|
51
|
-
end
|
52
56
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
57
|
+
ss "Test sync of a register"
|
58
|
+
dut.cmd.write(0) # Make Origen forget the actual value
|
59
|
+
dut.cmd.sync
|
60
|
+
unless dut.cmd.data == 0x2244_6688
|
61
|
+
fail "CMD register did not sync from simulation"
|
62
|
+
end
|
58
63
|
end
|
59
64
|
|
60
65
|
ss "Do some operations with the counter, just for fun"
|
@@ -76,9 +81,16 @@ Pattern.create do
|
|
76
81
|
dut.pins(:dout).assert!(0x5555_AAAA)
|
77
82
|
dut.pins(:dout).dont_care
|
78
83
|
|
79
|
-
ss "Verify that
|
84
|
+
ss "Verify that forcing pins works"
|
80
85
|
dut.p.p1.assert!(0)
|
81
86
|
dut.p.p2.assert!(1)
|
82
87
|
dut.p.p3.assert!(0)
|
83
|
-
dut.p.p4.assert!(
|
88
|
+
dut.p.p4.assert!(0xA)
|
89
|
+
|
90
|
+
ss "Test sim_capture"
|
91
|
+
tester.sim_capture :cmd55, :dout, :test_bus, :tdo do
|
92
|
+
dut.pins(:din_port).drive!(0x1234_5678)
|
93
|
+
dut.cmd.write!(0x55)
|
94
|
+
60.cycles
|
95
|
+
end
|
84
96
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
[*]
|
2
|
+
[*] GTKWave Analyzer v3.3.66 (w)1999-2015 BSI
|
3
|
+
[*] Thu Jan 11 09:12:49 2018
|
4
|
+
[*]
|
5
|
+
[dumpfile] "/home/stephen/Code/github/origen_sim/waves/default/origen.vcd"
|
6
|
+
[dumpfile_mtime] "Wed Jan 10 17:49:53 2018"
|
7
|
+
[dumpfile_size] 411132
|
8
|
+
[savefile] "/home/stephen/Code/github/origen_sim/templates/empty.gtkw"
|
9
|
+
[timestart] 0
|
10
|
+
[size] 2308 1127
|
11
|
+
[pos] -1 -1
|
12
|
+
*-25.716982 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
13
|
+
[treeopen] origen.
|
14
|
+
[treeopen] origen.debug.
|
15
|
+
[treeopen] origen.dut.
|
16
|
+
[sst_width] 225
|
17
|
+
[signals_width] 158
|
18
|
+
[sst_expanded] 1
|
19
|
+
[sst_vpaned_height] 337
|
20
|
+
@820
|
21
|
+
origen.debug.pattern[1023:0]
|
22
|
+
origen.debug.comments[1023:0]
|
23
|
+
@22
|
24
|
+
origen.debug.errors[31:0]
|
25
|
+
[pattern_trace] 1
|
26
|
+
[pattern_trace] 0
|
@@ -63,18 +63,14 @@ module pin_driver(error, pin, sync);
|
|
63
63
|
|
64
64
|
endmodule
|
65
65
|
|
66
|
-
module pin_drivers(errors, <%= dut.rtl_pins.map { |n, p, o| "#{p.id}_o"
|
66
|
+
module pin_drivers(errors, <%= dut.rtl_pins.map { |n, p, o| "#{p.id}_o" }.join(', ') %>);
|
67
67
|
|
68
68
|
% dut.rtl_pins.each do |name, pin, options|
|
69
|
-
% unless pin.tie_off
|
70
69
|
output <%= pin.id %>_o;
|
71
|
-
% end
|
72
70
|
% end
|
73
71
|
|
74
72
|
% dut.rtl_pins.each do |name, pin, options|
|
75
|
-
% unless pin.tie_off
|
76
73
|
wire <%= pin.id %>_err;
|
77
|
-
% end
|
78
74
|
% end
|
79
75
|
|
80
76
|
output reg [31:0] errors = 0;
|
@@ -83,12 +79,10 @@ module pin_drivers(errors, <%= dut.rtl_pins.map { |n, p, o| "#{p.id}_o" unless p
|
|
83
79
|
always @(
|
84
80
|
|
85
81
|
% dut.rtl_pins.each_with_index do |(name, pin, options), i|
|
86
|
-
%
|
87
|
-
% if i == 0
|
82
|
+
% if i == 0
|
88
83
|
posedge <%= pin.id %>_err
|
89
|
-
%
|
84
|
+
% else
|
90
85
|
or posedge <%= pin.id %>_err
|
91
|
-
% end
|
92
86
|
% end
|
93
87
|
% end
|
94
88
|
) begin
|
@@ -96,9 +90,7 @@ module pin_drivers(errors, <%= dut.rtl_pins.map { |n, p, o| "#{p.id}_o" unless p
|
|
96
90
|
end
|
97
91
|
|
98
92
|
% dut.rtl_pins.each do |name, pin, options|
|
99
|
-
% unless pin.tie_off
|
100
93
|
pin_driver <%= pin.driving? ? "#(#{pin.value}) " : '' %><%= pin.id %>(.pin(<%= pin.id %>_o), .error(<%= pin.id %>_err), .sync(sync));
|
101
|
-
% end
|
102
94
|
% end
|
103
95
|
|
104
96
|
endmodule
|
@@ -120,68 +112,37 @@ module origen;
|
|
120
112
|
reg finish = 0;
|
121
113
|
|
122
114
|
% dut.rtl_pins.each do |name, pin, options|
|
123
|
-
% unless pin.tie_off
|
124
115
|
wire <%= pin.id %>;
|
125
|
-
% end
|
126
116
|
% end
|
127
117
|
|
128
118
|
wire [31:0] errors;
|
129
119
|
|
130
120
|
pin_drivers pins (
|
131
121
|
% dut.rtl_pins.each_with_index do |(name, pin, options), i|
|
132
|
-
% unless pin.tie_off
|
133
122
|
.<%= pin.id %>_o(<%= pin.id %>),
|
134
|
-
% end
|
135
123
|
% end
|
136
124
|
.errors(errors)
|
137
125
|
);
|
138
126
|
|
139
|
-
// Create wires to tie off DUT signals, initially this was done by hardcoded values when instantiating
|
140
|
-
// below, however the simulator didn't like that if the target pin was defined as an inout
|
141
|
-
% dut.rtl_pins.each do |name, pin, options|
|
142
|
-
% if options[:group]
|
143
|
-
% if pin.group_index == 0
|
144
|
-
% if pin.primary_group.tie_off
|
145
|
-
wire [<%= pin.primary_group.size - 1 %>:0] <%= pin.rtl_name %>;
|
146
|
-
assign <%= pin.rtl_name %> = <%= "#{pin.primary_group.size}'b#{pin.tie_off.to_s * pin.primary_group.size}" %>;
|
147
|
-
% end
|
148
|
-
% end
|
149
|
-
% else
|
150
|
-
% if pin.tie_off
|
151
|
-
wire <%= pin.rtl_name %>;
|
152
|
-
assign <%= pin.rtl_name %> = 1'b<%= pin.tie_off %>;
|
153
|
-
% end
|
154
|
-
% end
|
155
|
-
% end
|
156
|
-
|
157
|
-
|
158
127
|
// Instantiate the DUT
|
159
128
|
<%= options[:top].sub(/\..*/, '') %> dut (
|
160
129
|
% dut.power_pins.each do |name, pin, options|
|
161
|
-
% unless pin.tie_off
|
162
130
|
.<%= pin.id %>(<%= pin.id %>),
|
163
|
-
% end
|
164
131
|
% end
|
165
132
|
% dut.ground_pins.each do |name, pin, options|
|
166
|
-
% unless pin.tie_off
|
167
133
|
.<%= pin.id %>(<%= pin.id %>),
|
168
|
-
% end
|
169
134
|
% end
|
170
135
|
% dut.rtl_pins.each_with_index do |(name, pin, options), i|
|
171
136
|
% if options[:group]
|
172
137
|
% if pin.group_index == 0
|
173
|
-
|
174
|
-
|
175
|
-
% else
|
176
|
-
.<%= pin.rtl_name %>({
|
177
|
-
% pin.primary_group.each_with_index do |pin, i|
|
138
|
+
.<%= pin.primary_group.id %>({
|
139
|
+
% pin.primary_group.each_with_index do |pin, i|
|
178
140
|
<%= pin.id %><%= i == (pin.primary_group.size - 1) ? '' : ',' %>
|
179
|
-
% end
|
180
|
-
})<%= i == (dut.rtl_pins.size - 1) ? '' : ',' %>
|
181
141
|
% end
|
142
|
+
})<%= i == (dut.rtl_pins.size - 1) ? '' : ',' %>
|
182
143
|
% end
|
183
144
|
% else
|
184
|
-
.<%= pin.rtl_name %>(<%= pin.
|
145
|
+
.<%= pin.rtl_name %>(<%= pin.id %>)<%= i == (dut.rtl_pins.size - 1) ? '' : ',' %>
|
185
146
|
% end
|
186
147
|
% end
|
187
148
|
);
|
@@ -190,13 +151,13 @@ module origen;
|
|
190
151
|
.errors(errors)
|
191
152
|
);
|
192
153
|
|
193
|
-
|
154
|
+
`ifdef ICARUS
|
194
155
|
initial
|
195
156
|
begin
|
196
|
-
$dumpfile("
|
157
|
+
$dumpfile("origen.vcd");
|
197
158
|
$dumpvars(0,origen);
|
198
159
|
end
|
199
|
-
|
160
|
+
`endif
|
200
161
|
|
201
162
|
always @(posedge finish) begin
|
202
163
|
$finish(2);
|
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.
|
4
|
+
version: 0.6.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:
|
11
|
+
date: 2018-01-19 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.
|
19
|
+
version: '0.29'
|
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.
|
26
|
+
version: '0.29'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: origen_testers
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: origen_verilog
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
41
55
|
description:
|
42
56
|
email:
|
43
57
|
- stephen.f.mcginty@gmail.com
|
@@ -48,19 +62,22 @@ files:
|
|
48
62
|
- config/application.rb
|
49
63
|
- config/boot.rb
|
50
64
|
- config/commands.rb
|
65
|
+
- config/global_commands.rb
|
51
66
|
- config/shared_commands.rb
|
52
67
|
- config/version.rb
|
53
|
-
- ext/README.md
|
54
68
|
- ext/bridge.c
|
55
69
|
- ext/bridge.h
|
56
70
|
- ext/client.c
|
57
71
|
- ext/client.h
|
58
72
|
- ext/common.h
|
73
|
+
- ext/defines.h.erb
|
59
74
|
- ext/origen.c
|
60
75
|
- ext/origen.h
|
61
76
|
- ext/vpi_user.h
|
62
77
|
- lib/origen_sim.rb
|
63
78
|
- lib/origen_sim/commands/build.rb
|
79
|
+
- lib/origen_sim/commands/ci.rb
|
80
|
+
- lib/origen_sim/commands/co.rb
|
64
81
|
- lib/origen_sim/flow.rb
|
65
82
|
- lib/origen_sim/generator.rb
|
66
83
|
- lib/origen_sim/origen/pins/pin.rb
|
@@ -72,6 +89,7 @@ files:
|
|
72
89
|
- lib/tasks/origen_sim.rake
|
73
90
|
- pattern/test.rb
|
74
91
|
- program/p1.rb
|
92
|
+
- templates/empty.gtkw
|
75
93
|
- templates/empty.svcf
|
76
94
|
- templates/probe.tcl.erb
|
77
95
|
- templates/rtl_v/origen.v.erb
|
@@ -98,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
116
|
version: 1.8.11
|
99
117
|
requirements: []
|
100
118
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.6.
|
119
|
+
rubygems_version: 2.6.8
|
102
120
|
signing_key:
|
103
121
|
specification_version: 4
|
104
122
|
summary: Plugin that provides a testbench environment to simulate Origen test patterns
|
data/ext/README.md
DELETED