我正在尝试使用if和else分支在93k上创建一个具有不同操作的流。到目前为止,我发现的最接近的事情是测试传递和失败,尽管这会产生两个不同的比较节点和空的else块:
if_passed :some_test_id do
bin 10
end
if_failed :some_test_id do
bin 11
end
转换为:
if @SOME_TEST_ID_PASSED == 1 then
{
stop_bin "", "fail", , bad, noreprobe, red, 10, over_on;
}
else
{
}
if @SOME_TEST_ID_FAILED == 1 then
{
stop_bin "", "fail", , bad, noreprobe, red, 11, over_on;
}
else
{
}
{
我正在寻找的东西看起来更像是这样:
if @SOME_TEST_ID_PASSED == 1 then
{
stop_bin "", "fail", , bad, noreprobe, red, 10, over_on;
}
else
{
stop_bin "", "fail", , bad, noreprobe, red, 11, over_on;
}
有没有办法生成这种类型的流程结构?
答案 0 :(得分:1)
对于您展示的那种示例,这是建议的编码方式:
test :test1, id: :t1
bin 10, if_passed: :t1
bin 11, if_failed: :t1
在Origen源代码级别上,这非常清晰易于查看。事实上,这将产生独立的T1_PASSED
和T1_FAILED
分支,这可能不符合您的口味,但它在逻辑上是正确的,这是主要的。
我们这样做的原因是因为在93K上产生输出的内部表示更容易针对基于行的Teradyne平台而且不具备if / else的概念逻辑。因此,您可以获得的好处是,您可以在Origen中表达的任何内容都可以为两个平台进行编译,但如果您只需要V93K,则可能没什么安慰。
通常情况下,您使用Origen的次数越多,那么您对生成的实现的关注就越少,类似于您在C中编写嵌入式代码时如何真正关心生成的程序集。 但是,如果在测试仪上进行调试时生成的代码更容易理解,那么我们总是努力使生成的输出更清晰。
说了这么多,有一个低级API可以接近你想要的。 您可以手动实现这样的标志:
test :test1, on_fail: { set_flag: :my_flag }, continue: true
if_flag :my_flag do
bin 10
end
unless_flag :my_flag do
bin 11
end
这会产生这样的结果:
run_and_branch(test1)
then
{
}
else
{
@MY_FLAG = 1;
}
if @MY_FLAG == 1 then
{
stop_bin "", "fail", , bad, noreprobe, red, 10, over_on;
}
else
{
}
if @MY_FLAG == 1 then
{
}
else
{
stop_bin "", "fail", , bad, noreprobe, red, 10, over_on;
}
这稍微好一些(从所需的输出角度来看)因为我们归结为一个标志,但是我们仍然有两个相邻的条件可以/应该折叠成一个。
我们实际上已经有一个问题:https://github.com/Origen-SDK/origen_testers/issues/43
有趣的是,我今晚早些时候看到它,尚未实施,但很快就会实现。
此时输出将为:
run_and_branch(test1)
then
{
}
else
{
@MY_FLAG = 1;
}
if @MY_FLAG == 1 then
{
stop_bin "", "fail", , bad, noreprobe, red, 10, over_on;
}
else
{
stop_bin "", "fail", , bad, noreprobe, red, 11, over_on;
}
我再说一遍,有意识地构造Origen源只是为了得到一个特定的输出并不是真的应该这样做的方式,但在这种情况下,源代码通过更明确一点来解决它并不复杂它。