我添加了一些ChipModes,如下所示:
add_mode :mode1
add_mode :mode2
当我将DUT模式设置为:mode1时,我想让一些时钟改变它们的设定点。
with_mode :mode1 do
clocks(:clk1).setpoint = 1.0.Ghz
clocks(:clk2).setpoint = 1.2.Ghz
end
with_mode :mode2 do
clocks(:clk1).setpoint = 2.0.Ghz
clocks(:clk2).setpoint = 2.4.Ghz
end
我的预期是当DUT芯片模式设置为:mode1或:mode 2时,时钟值会改变。但相反,无论DUT芯片模式如何,这些代码块都会被执行。
时钟最终被设置为第二个with_mode代码块中的值。有没有办法定义仅在设置模式时执行的依赖于模式的操作?
**编辑**
使用this doc作为模型,我将on_mode_changed回调添加到origen/model.rb file,如下所示:
# Set the current mode configuration of the current model
def current_mode=(id)
@current_mode = id.is_a?(ChipMode) ? id.id : id
Origen.app.listeners_for(:on_mode_changed).each do |listener|
listener.on_mode_changed(mode: @current_mode)
end
@current_mode
end
alias_method :mode=, :current_mode=
当我设置断点时,直接在我设置模式后,我确实看到模式已经改变,并且DUT响应回调方法,但回调方法没有被调用。
这是DUT范围内的回调方法:
def on_mode_changed(options)
binding.pry
puts 'found callback method'
return if options[:mode].nil?
end
**更新**
代码在上面工作,thx!
答案 0 :(得分:1)
with_mode
方法不符合您的想法。它所做的只是设置给定do ... end
块的持续时间的模式(并在那里执行,然后执行),但它不会自动地在块中定义的任何内容与当前之间创建实时链接。范围内的模式。
我认为你真正想要的是一个on_mode_changed
回调。
Origen需要更新以在模式更改时调用此类回调。这很容易做到,下面是一些如何实现回调的示例:https://github.com/Origen-SDK/origen/search?utf8=%E2%9C%93&q=listeners_for&type=
您的应用程序代码将更改为:
SETPOINTS = { mode1: { clk1: 1.0.Ghz, clk2: 1.2.Ghz },
mode2: { clk1: 2.0.Ghz, clk2: 2.4.Ghz } }
def on_mode_changed(mode)
[:clk1, :clk2].each { |clk| clocks(clk).setpoint = SETPOINTS[mode][clk] }
end
您也可以考虑实时更新参数是否适合您,这些是寻找存在理由的神奇解决方案 - http://origen-sdk.org/origen/guides/models/parameters/#Live_Updating_Parameters