Class: OrigenSim::Tester

Inherits:
Object
  • Object
show all
Includes:
OrigenTesters::VectorBasedTester
Defined in:
lib/origen_sim/tester.rb

Overview

Responsible for interfacing the simulator with Origen

Constant Summary collapse

TEST_PROGRAM_GENERATOR =
OrigenSim::Generator

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Tester

Returns a new instance of Tester.



8
9
10
11
# File 'lib/origen_sim/tester.rb', line 8

def initialize(options = {})
  simulator.configure(options)
  super()
end

Instance Method Details

#c1(msg, options = {}) ⇒ Object



65
66
67
# File 'lib/origen_sim/tester.rb', line 65

def c1(msg, options = {})
  simulator.write_comment(msg) if @step_comment_on
end

#captureObject



20
21
22
23
24
25
26
27
# File 'lib/origen_sim/tester.rb', line 20

def capture
  simulator.sync do
    @sync_pins = []
    @sync_cycles = 0
    yield
  end
  @sync_pins.map { |pin| simulator.peek("origen.pins.#{pin.id}.sync_memory[#{@sync_cycles - 1}:0]") }
end

#handshake(options = {}) ⇒ Object



17
18
# File 'lib/origen_sim/tester.rb', line 17

def handshake(options = {})
end

#loop_vectors(name, number_of_loops, options = {}) ⇒ Object Also known as: loop_vector



69
70
71
72
73
# File 'lib/origen_sim/tester.rb', line 69

def loop_vectors(name, number_of_loops, options = {})
  number_of_loops.times do
    yield
  end
end

#push_vector(options) ⇒ Object

This method intercepts vector data from Origen, removes white spaces and compresses repeats



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/origen_sim/tester.rb', line 51

def push_vector(options)
  unless options[:timeset]
    puts 'No timeset defined!'
    puts 'Add one to your top level startup method or target like this:'
    puts '$tester.set_timeset("nvmbist", 40)   # Where 40 is the period in ns'
    exit 1
  end
  simulator.cycle(options[:repeat] || 1)
  if @after_next_vector
    @after_next_vector.call(@after_next_vector_args)
    @after_next_vector = nil
  end
end

#set_timeset(name, period_in_ns) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/origen_sim/tester.rb', line 40

def set_timeset(name, period_in_ns)
  super
  # Need to remove this once OrigenTesters does it
  dut.timeset = name
  dut.current_timeset_period = period_in_ns

  # Now update the simulator with the new waves
  simulator.on_timeset_changed
end

#simulatorObject



13
14
15
# File 'lib/origen_sim/tester.rb', line 13

def simulator
  OrigenSim.simulator
end

#startObject

Start the simulator



30
31
32
# File 'lib/origen_sim/tester.rb', line 30

def start
  simulator.start
end

#store_next_cycle(*pins) ⇒ Object

Capture the next vector generated

This method applies a store request to the next vector to be generated, note that is does not actually generate a new vector.

The captured data is added to the captured_data array.

This method is intended to be used by pin drivers, see the #capture method for the application level API.

Examples:

tester.store_next_cycle
tester.cycle                # This is the vector that will be captured


89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/origen_sim/tester.rb', line 89

def store_next_cycle(*pins)
  options = pins.last.is_a?(Hash) ? pins.pop : {}
  pins = dut.rtl_pins.values if pins.empty?
  if simulator.sync_active?
    pins.each do |pin|
      @sync_cycles += 1
      @sync_pins << pin unless @sync_pins.include?(pin)
    end
  end
  pins.each(&:capture)
  # A store request is only valid for one cycle, this tells the simulator
  # to stop after the next vector is generated
  after_next_vector do
    pins.each { |pin| simulator.put("h^#{pin.simulation_index}") }
  end
end

#sync_upObject

Blocks the Origen process until the simulator indicates that it has processed all operations up to this point



36
37
38
# File 'lib/origen_sim/tester.rb', line 36

def sync_up
  simulator.sync_up
end