在Specman中,为什么代码体的宏标签返回垃圾?

时间:2010-09-22 23:13:49

标签: specman hdl

与此帖类似 http://feedproxy.google.com/~r/cadence/community/blogs/fv/~3/IvdCIla8_Es/extending-multiple-when-subtypes-simultaneously.aspx

我想创建一个执行循环展开的宏来解决Specman的一些when-subtyping和继承问题。

我开始时:

-- macros.e
<'
define <FOREACH_UNROLL'action> "FOREACH_UNROLL (<UNROLLEES>\[<unrollee'name>,...\]) (<STATEMENTS>{<statement>;...})" as computed {
   print <UNROLLEES>;
   print str_split(<UNROLLEES>,"/ *, */");
   for each in str_split(<UNROLLEES>,"/ *, */") {
      out(it.as_a(string));
      var statements := str_replace( <STATEMENTS>,"\"REPLACE_ME\"",it);
      result =appendf("%s %s;",result,statements);
   };
};
'>


-- main.e
<'
import macros.e
extend sys {
   run() is also {
      FOREACH_UNROLL [baz,foo,bar] {
         out("REPLACE_ME");
         out("part2","REPLACE_ME");
      };
   };
};
'>

当我跑步时,我得到:

specman -c 'load $HOME/main; test'
Welcome to Specman Elite(64) (08.20.007-s)  -  Linked on Tue Dec 15 17:07:26
2009

Protected by U.S. Patents 6,141,630 ;6,182,258; 6,219,809; 6,347,388;
6,487,704; 6,499,132; 6,502,232; 6,519,727; 6,530,054; 6,675,138; 6,684,359;
6,687,662; 6,907,599; 6,918,076; 6,920,583; Other Patents Pending.

0 notifications were modified by command 'set notify -severity=WARNING
DEPR_START_TCM_ARG_BY_REF'
Checking license ... OK
Loading macros.e   (imported by main.e) ...
read...parse...update...patch...h code...code...clean...
Loading /nfs/pdx/home/rbroger1/main.e ...
read...parse...  <UNROLLEES> = "[35]"
  str_split(<UNROLLEES>,"/ *, */") =
0.      "[35]"
[35]
update...patch...h code...code...clean...
Doing setup ...
Generating the test using seed 1...

Starting the test ...
Running the test ...
REPLACE_ME
part2REPLACE_ME
No actual running requested.
Checking the test ...
Checking is complete - 0 DUT errors, 0 DUT warnings.

如果您查看<UNROLLEES>的打印输出:

<UNROLLEES> = "[35]"

为什么<UNROLLEES>给我[35]而不是花括号内的身体? 35是#的ascii值,所以我不知道为什么我会得到35 ...

P.S。我意识到宏来自魔鬼,但我认为代码复制更糟糕。我必须这样做,因为Specman不是真正的多态。

1 个答案:

答案 0 :(得分:0)

事实证明我需要在我的Specman(8.2)版本中使用函数str_expand_dots

以下是修改过的macros.e:

define <FOREACH_UNROLL'action> "FOREACH_UNROLL (<UNROLLEES>\[<unrollee'name>,...\]) (<STATEMENTS>{<statement>;...})" as computed {
   -- print str_expand_dots(<UNROLLEES>);
   --print str_expand_dots(<STATEMENTS>);
   -- print str_split(str_expand_dots(<UNROLLEES>),"/ *, */");
   for each  in str_split(str_expand_dots(<UNROLLEES>),"/ *, */") {
      var unrollee := str_replace(it, "[","");
      unrollee = str_replace(unrollee, "]","");
      --out(unrollee);
      var statements := str_replace( str_expand_dots(<STATEMENTS>),"\"REPLACE_ME\"",unrollee);
      result =appendf("%s %s;",result,statements);
   };
};

修改main.e:

import macros;
extend sys {
   run() is also {
      FOREACH_UNROLL ["baz","foo","bar"] {
         out("REPLACE_ME");
         out("part2","REPLACE_ME");
         if "REPLACE_ME" == "baz" {
            out("found baz");
         };
      };
   };
};

输出:

Welcome to Specman Elite(64) (08.20.007-s)  -  Linked on Tue Dec 15 17:07:26
2009

Protected by U.S. Patents 6,141,630 ;6,182,258; 6,219,809; 6,347,388;
6,487,704; 6,499,132; 6,502,232; 6,519,727; 6,530,054; 6,675,138; 6,684,359;
6,687,662; 6,907,599; 6,918,076; 6,920,583; Other Patents Pending.

0 notifications were modified by command 'set notify -severity=WARNING
DEPR_START_TCM_ARG_BY_REF'
Checking license ... OK
Loading /nfs/pdx/home/rbroger1/macros.e   (imported by main.e) ...
read...parse...update...patch...h code...code...clean...
Loading /nfs/pdx/home/rbroger1/main.e ...
read...parse...update...patch...h code...code...clean...
Doing setup ...
Generating the test using seed 1...

Starting the test ...
Running the test ...
baz
part2baz
found baz
foo
part2foo
bar
part2bar
No actual running requested.
Checking the test ...
Checking is complete - 0 DUT errors, 0 DUT warnings.