Class: OrigenApb::Driver

Inherits:
Object
  • Object
show all
Includes:
Origen::Model
Defined in:
lib/origen_apb/driver.rb

Constant Summary collapse

REQUIRED_PINS =
[:paddr_pin, :penable_pin, :pwrite_pin, :pwdata_pin, :pstrb_pin, :psel_pin]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(owner, options = {}) ⇒ Driver

Initialize owner



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/origen_apb/driver.rb', line 9

def initialize(owner, options = {})
  if owner.is_a?(Hash)
    @owner = parent
    options = owner
  else
    @owner = owner
  end

  validate_pins(options)

  if defined?(owner.class::APB_CONFIG)
    options = owner.class::APB_CONFIG.merge(options)
  end

  options = {
    verbose:    false,
    init_state: :unknown
  }.merge(options)
end

Instance Attribute Details

#ownerObject (readonly)

Returns the value of attribute owner.



6
7
8
# File 'lib/origen_apb/driver.rb', line 6

def owner
  @owner
end

Instance Method Details

#apb_read_trans(options = {}) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/origen_apb/driver.rb', line 106

def apb_read_trans(options = {})
  # INITIAL INPUT STAGES TO BE SETUP HERE.
  @psel_pin.drive(0)
  @pwrite_pin.drive(0)
  @penable_pin.drive(0)
  @pstrb_pin.drive(0)
  @pwdata_pin.drive(0)
  tester.cycle
  # This is the SETUPa
  @paddr_pin.drive(options[:paddr])
  @pwrite_pin.drive(0)
  @psel_pin.drive(1) # User or Test (0 or 1)
  @pstrb_pin.drive(0)
  tester.wait time_in_cycles: 3
  @penable_pin.drive(1)
  @prdata_pin.assert(options[:pdata])
  tester.cycle
  @prdata_pin.dont_care
  # This is next phase?
  @pwrite_pin.drive(0)
  @psel_pin.drive(0)
  @penable_pin.drive(0)
  @pstrb_pin.drive(0)
  @pwdata_pin.drive(0)
  tester.cycle
end

#apb_write_trans(options = {}) ⇒ Object



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/origen_apb/driver.rb', line 133

def apb_write_trans(options = {})
  # INITIAL INPUT STAGES TO BE SETUP HERE.
  @psel_pin.drive(0)
  @pwrite_pin.drive(0)
  @penable_pin.drive(0)
  @pstrb_pin.drive(0)
  @pwdata_pin.drive(0)
  tester.cycle
  # This is the SETUPa
  @paddr_pin.drive(options[:paddr])
  @pwrite_pin.drive(options[:pwrite])
  @psel_pin.drive(1) # User or Test (0 or 1)
  @pstrb_pin.drive(15)
  @pwdata_pin.drive(options[:pdata])
  tester.wait time_in_cycles: 3
  @penable_pin.drive(1)
  tester.cycle
  @prdata_pin.dont_care
  # This is next phase?
  @pwrite_pin.drive(0)
  @psel_pin.drive(0)
  @penable_pin.drive(0)
  @pstrb_pin.drive(0)
  @pwdata_pin.drive(0)
  tester.cycle
end

#read_register(reg_or_val, options = {}) ⇒ Object

Read register. Handles register model as input or data/address pair. Sets up APB parameters values and passes along to pin-layer apb transaction method.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/origen_apb/driver.rb', line 66

def read_register(reg_or_val, options = {})
  options = {
    paddr: options[:address] || reg_or_val.address,
    pdata: reg_or_val,
    pread: 1
  }.merge(options)
  #      options[:paddr] = options[:paddr].to_hex
  cc '==== APB Read Transaction ===='
  if reg_or_val.respond_to?('data')
    data = reg_or_val.data
    name_string = 'Reg: ' + reg_or_val.name.to_s + ' '
  else
    data = reg_or_val
    name_string = ''
  end
  cc name_string + 'Addr: 0x' + options[:paddr].to_s(16) + ' Data: 0x' + data.to_s(16)
  apb_read_trans(options)
end

#validate_pins(options) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/origen_apb/driver.rb', line 29

def validate_pins(options)
  @pclk_pin = options[:pclk_pin] if options[:pclk_pin]
  @paddr_pin = options[:paddr_pin] if options[:paddr_pin]
  @pprot_pin = options[:pprot_pin] if options[:pprot_pin]
  @psel_pin = options[:psel_pin] if options[:psel_pin]
  @penable_pin = options[:penable_pin] if options[:penable_pin]
  @pwrite_pin = options[:pwrite_pin] if options[:pwrite_pin]
  @pwdata_pin = options[:pwdata_pin] if options[:pwdata_pin]
  @pstrb_pin = options[:pstrb_pin] if options[:pstrb_pin]
  @prdata_pin = options[:prdata_pin] if options[:prdata_pin]
  @pslverr_pin = options[:pslverr_pin] if options[:pslverr_pin]

  #
  @pclk_pin = @owner.pin(:pclk) if @pclk_pin.nil?
  @psel_pin = @owner.pin(:psel0) if @psel_pin.nil?
  @paddr_pin = @owner.pin(:paddr) if @paddr_pin.nil?
  @pprot_pin = @owner.pin(:pprot) if @pprot_pin.nil?
  @penable_pin = @owner.pin(:penable) if @penable_pin.nil?
  @pwrite_pin = @owner.pin(:pwrite) if @pwrite_pin.nil?
  @pwdata_pin = @owner.pin(:pwdata) if @pwdata_pin.nil?
  @pstrb_pin = @owner.pin(:pstrb) if @pstrb_pin.nil?
  @prdata_pin = @owner.pin(:prdata0) if @prdata_pin.nil?
  @pslverr_pin = @owner.pin(:pslverr) if @pslverr_pin.nil?
rescue
  puts 'Missing APB pins!'
  puts "In order to use the APB driver your #{owner.class} class must either define"
  puts 'the following pins (an alias is fine):'
  puts REQUIRED_PINS
  puts '-- or --'
  puts 'Pass the pins in the initialization options:'
  puts "sub_block :apb, class_name: 'OrigenApb::Driver', paddr: dut.pin(:paddr), penable: dut.pin(:penable), pwrite: dut.pin(:pwrite), pwdata: dut.pin(:pwdata), pstrb: dut.pin(:pstrb)"
  raise 'APB driver error!'
end

#write_register(reg_or_val, options = {}) ⇒ Object

Read register. Handles register model as input or data/address pair. Sets up APB parameters values and passes along to pin-layer apb transaction method.



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

def write_register(reg_or_val, options = {})
  options = {
    paddr:  options[:address] || reg_or_val.address,
    pdata:  reg_or_val,
    pwrite: 1
  }.merge(options)
  cc '==== APB Write Transaction ===='
  if reg_or_val.respond_to?('data')
    data = reg_or_val.data
    name_string = 'Reg: ' + reg_or_val.name.to_s + ' '
  else
    data = reg_or_val
    name_string = ''
  end
  cc name_string + 'Addr: 0x' + options[:paddr].to_s(16) + ' Data: 0x' + data.to_s(16)
  apb_write_trans(options)
end