2010-02-17 32 views
3

海兰分配多个结构构件,的Specman:一个表达

我扩大现有的Specman测试,其中出现这样一些代码:

struct dataset { 
    !register : int (bits:16); 
    ... other members 
} 

... 

data : list of dataset; 
foo : dataset; 
gen foo; 

foo.register = 0xfe; 
... assign other foo members ... 
data.push(foo.copy()); 

有分配给该结构的成员的方式在一行?像:

foo = { 0xff, ... }; 

回答

4

我现在想不出设置你想要的所有成员的一个直接途径,但有一种方法来初始化变量(我不知道这是否适用于结构成员以及) 。反正像下面这样可能适合你:

myfunc() is { 
    var foo : dataset = new dataset with { 
     .register = 0xff; 
     .bar = 0xfa; 
    } 
    data.push(foo.copy()); 
} 

你可以找到更多信息有关newhelp new struct从的Specman提示。

希望它有帮助!

1

您可以直接使用Specman的packunpack工具与“物理场”(这些实例成员的前缀为修饰符%)。

例子:

define FLOODLES_WIDTH 47; 
type floodles_t : uint(bits:FLOODLES_WIDTH); 

define FLABNICKERS_WIDTH 28; 
type flabnickers_t : uint(bits:FLABNICKERS_WIDTH); 

struct foo_s { 
    %!floodle : floodles_t; 
    %!flabnicker : flabnickers_t; 
}; 

extend sys { 
    run() is also { 
     var f : foo_s = new; 
     unpack(packing.low,64'hdeadbeefdeadbeef,f); 
     print f; 

     unpack(packing.low,64'hacedacedacedaced,f); 
     print f; 

    }; 
    setup() is also { 
     set_config(print,radix,hex); 
    }; 
}; 

当这个运行时,它打印:

Loading /nfs/pdx/home/rbroger1/tmp.e ... 
read...parse...update...patch...h code...code...clean... 
Doing setup ... 
Generating the test using seed 1... 

Starting the test ... 
Running the test ... 
    f = [email protected]: foo_s of unit: sys 
     ---------------------------------------------- @tmp 
0  !%floodle:      0x3eefdeadbeef 
1  !%flabnicker:     0x001bd5b 
    f = [email protected]: foo_s of unit: sys 
     ---------------------------------------------- @tmp 
0  !%floodle:      0x2cedacedaced 
1  !%flabnicker:     0x00159db 

在你的Specman文档查找packing, unpacking, physical fields, packing.low, packing.high

即使结构没有映射到DUT,您仍然可以使用物理字段。如果你的结构体已经在使用物理字段来实现其他目的,那么你需要为这个结构体采用某种set*方法。

+0

OMG!解压! :)始终将unpack()视为非类型安全的构造函数或API。忘记这些任务非常容易,并且没有验证代码可以让您(或您的代码的客户端)保持警觉。 – Asaf 2010-03-15 14:31:48

2

按名称分配字段的简单功能是我一直发现的有用的代码和可读的语言功能。

这是我怎么会去一下吧:

struct s { 
    a : int; 
    b : string; 
    c : bit; 
}; 

extend sys { 
    ex() is { 
    var s := new s with {.a = 0x0; .b = "zero"; .c = 0;}; 
    }; 
    run() is also { 
    var s; 
    gen s keeping {.a == 0x0; .b == "zero"; .c == 0;}; 
    }; 
}; 

我甚至data.push(new dataset with {.reg = 0xff; bar = 0x0;});,但如果你愿意,你可以提高旗可读性 - 。

警告:使用unpack()是完全正确的(请参阅ross的答案),但是容易出错的IMO。我建议验证(实际运行的代码)你选择使用unpack()的每个地方。 OMG!