0

我在 $dut 初始化期间创建了许多测试接口参数。该应用程序以“加载”或“导入”模式初始化模型,因为我们从第三方获得了许多信息来源。对于参数,源是原生 Ruby,因此无论使用何种 init 方法(加载或导入),都需要这样的代码:

send modeling_method, model_path # load_params or import_params

这是该方法:

def load_params(path)
  Origen.log.info("PPEKit: Modeling parameters from #{path}")
  require path.to_s.chomp('.rb')
  Origen.log.info("PPEKit: Modeling of parameters complete")
end
alias_method 'import_params', 'load_params'

以下是上述所需文件的内容:

Origen.top_level.define_params :default do |params|
  params.bist.override = 1
  params.bist.lev_equ_set = 1
  params.bist.lev_spec_set = 1
  params.bist.levset = 1
  params.bist.seqlbl = 'mbist_cpu_hr_vnom_burst'
  params.bist.override_tim_spec_set = 'bist_25Mhz'
  params.bist.override_timset = '1,1,1,1,1,1,1,1'
  params.bist.site_control = 'parallel:'
  params.bist.site_match = 2
end

在执行命令“origen p myflowfile.rb”期间,我可以在 $dut 初始化结束时看到它们:

[5] pry(#<PPEKit::Product>)> $dut.params
=> {:bist=>
  {:override=>1,
   :lev_equ_set=>1,
   :lev_spec_set=>1,
   :levset=>1,
   :seqlbl=>"mbist_cpu_hr_vnom_burst",
   :override_tim_spec_set=>"bist_25Mhz",
   :override_timset=>"1,1,1,1,1,1,1,1",
   :site_control=>"parallel:",
   :site_match=>2}}

但是,当 Origen 转换到测试接口代码时,无法访问参数:

[1] pry(#<STP::Interface>)> $dut.params
=> #<Origen::Parameters::Missing:0x002aaab22dc378
 @owner=<Model/Controller: PPEKit::Product:23456337817000/PPEKit::ProductController:23456355062960>>

但是,我可以看到 $dut 模型的其他部分,例如引脚和子块:

[2] pry(#<STP::Interface>)> $dut.sub_blocks
=> {"block0"=><Model: PPEKit::Product::Block0:23456336916760>,
 "block1"=><Model: PPEKit::Product::Block1:23456336907380>,
 "block2"=><Model: PPEKit::Product::Block2:23456336841100>,

似乎它们在模型初始化和测试流生成之间的某个时间被删除了。所以我在'on_load_target' 回调中放了一个断点,每次遇到断点时都会看到不同的结果。在第一次休息时,参数在那里,而在随后的休息时,他们不在。

75: def on_load_target
 => 76:   binding.pry
    77:   to_origen(path: vendor_path.to_s, instantiate_level: :sub_block) if @import
    78: end

[1] pry(#<PPEKit::Product>)> $dut.params
=> {:bist=>
  {:override=>1,
   :lev_equ_set=>1,
   :lev_spec_set=>1,
   :levset=>1,
   :seqlbl=>"mbist_ccx_hr_vnom_burst",
   :override_tim_spec_set=>"bist_25Mhz",
   :override_timset=>"1,1,1,1,1,1,1,1",
   :site_control=>"parallel:",
   :site_match=>2}}
[2] pry(#<PPEKit::Product>)>

Frame number: 0/25

From: /users/user/origen/ppekit/lib/ppekit/product.rb @ line 76 PPEKit::Product#on_load_target:

    75: def on_load_target
 => 76:   binding.pry
    77:   to_origen(path: vendor_path.to_s, instantiate_level: :sub_block) if @import
    78: end

[1] pry(#<PPEKit::Product>)> $dut.params
=> #<Origen::Parameters::Missing:0x002aaab9f3ad48
 @owner=<Model/Controller: PPEKit::Product:23456377300040/PPEKit::ProductController:23456379739240>>

我相信这里可能有两个问题:

1) 在测试流生成期间重复初始化 $dut,记录在这里

2)参数集哈希的清空,这是由于问题#1(以及一些参数集初始化代码

我相信这与在参数定义期间将参数 @owner 定义为 $dut 实例以及在后续查询参数时将 @owner 重新定义为 $dut ProductController 实例有关。

谢谢

4

1 回答 1

0

这里的问题是参数最终是通过调用来加载的require 'some_file.rb'

每当在内部重新加载目标时,Ruby 会再次命中该行但不执行任何操作,因为它知道它已经需要该文件并有效地跳过该行。

将其更改为load 'some_file.rb'将强制它每次都执行文件。

于 2017-08-31T12:50:34.063 回答