46: def RubyVpi.init_bench aDesignId, aSpecFormat, &aClockTrigger
47: if caller.find {|s| s =~ /^(.*?)_bench.rb:/}
48: testName = $1
49: else
50: raise 'Unable to determine name of test.'
51: end
52:
53: aClockTrigger ||= lambda {|clk| clk.intVal == 1}
54:
55: useDebugger = !(ENV['DEBUG'] || '').empty?
56: useCoverage = !(ENV['COVERAGE'] || '').empty?
57: usePrototype = !(ENV['PROTOTYPE'] || '').empty?
58:
59:
60: if useCoverage
61: require 'ruby-vpi/rcov'
62:
63: RubyVpi.with_coverage_analysis do |a|
64: a.dump_coverage_info [
65: Rcov::TextReport.new,
66: Rcov::HTMLCoverage.new(:destdir => "#{testName}_coverage")
67: ]
68: end
69:
70: Vpi::vpi_printf "#{Config::PROJECT_NAME}: coverage analysis is enabled for test #{testName.inspect}\n"
71: end
72:
73:
74: case aSpecFormat
75: when :xUnit
76: require 'test/unit'
77:
78: when :rSpec
79: ARGV.concat %w[-f s]
80: require 'spec'
81:
82: when :tSpec
83: ARGV << '-rs'
84: require 'test/spec'
85: end
86:
87:
88: if useDebugger
89: require 'ruby-debug'
90:
91: Debugger.start
92: Debugger.post_mortem
93:
94: Vpi::vpi_printf "#{Config::PROJECT_NAME}: debugger is enabled for test #{testName.inspect}\n"
95: end
96:
97:
98: unless Kernel.respond_to? :debugger
99: Kernel.class_eval do
100: define_method :debugger do
101:
102: end
103: end
104: end
105:
106:
107: require 'ruby-vpi/vpi'
108:
109: Object.class_eval do
110: include Vpi
111: end
112:
113:
114: unless design = vpi_handle_by_name("#{testName}_bench", nil)
115: raise "Verilog bench for test #{testName.inspect} is inaccessible."
116: end
117:
118: Kernel.const_set(aDesignId, design)
119: require "#{testName}_design.rb"
120:
121:
122: if usePrototype
123: require "#{testName}_proto.rb"
124:
125: Vpi.module_eval do
126: define_method :relay_verilog do
127: design.simulate!
128: end
129: end
130:
131: Vpi::vpi_printf "#{Config::PROJECT_NAME}: prototype is enabled for test #{testName.inspect}\n"
132:
133:
134: else
135: regs = design[VpiReg].sort_by {|h| h.lineNo}
136: clock = regs.first
137:
138: Vpi.module_eval do
139:
140: time = S_vpi_time.new
141: time.type = VpiSuppressTime
142:
143: value = S_vpi_value.new
144: value.format = VpiSuppressVal
145:
146: alarm = S_cb_data.new
147: alarm.reason = CbValueChange
148: alarm.cb_rtn = Vlog_relay_ruby
149: alarm.obj = clock
150: alarm.time = time
151: alarm.value = value
152: alarm.index = 0
153: alarm.user_data = nil
154:
155: vpi_free_object(vpi_register_cb(alarm))
156:
157: alias_method :relay_verilog_old, :relay_verilog
158:
159: define_method :relay_verilog do
160: begin
161: relay_verilog_old
162: end until aClockTrigger.call(clock)
163: end
164: end
165:
166:
167: relay_verilog_old
168: end
169:
170:
171: require "#{testName}_spec.rb"
172: end