1

我添加了一些芯片模式如下:

  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 代码块中的值。有没有办法定义仅在设置模式时才执行的模式相关操作?

** 编辑 **

使用此文档作为模型,我将 on_mode_changed 回调添加到origen/model.rb 文件,如下所示:

# 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

** 更新 **

代码在上面工作,谢谢!

4

1 回答 1

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

于 2018-02-16T10:04:26.593 回答