返回介绍

7.14 结构体表达式

发布于 2020-09-09 22:55:47 字数 2239 浏览 1104 评论 0 收藏 0

结构体表达式(压缩的和非压缩的)可以使用花括号和逗号由成员表达式构建,其中成员表达式以成员声明的顺序排列。复制操作符可以用来设置准确的成员数目。每一个成员表达式应该在对结构体中对应成员类型赋值的关联文中计算。结构体表达式也可以使用成员的名字来构建。

module mod1;

typedef struct {
    int x;
    int y;
} st;

st s1;

int k = 1;

initial begin
    #1 s1 = {1, 2+k};     // 通过位置构建结构体表达式
    #1 $display(s1.x, s1.y);
    #1 s1 = {x:2, y:3+k}; // 通过名字构建结构体表达式
    #1 $display(s1);
    #1 $finish;
end

endmodule

有时我们希望将结构体成员设置成某一个值而无需知道结构体到底有多少个成员或者成员的具体名字是什么。这种方式可以使用default关键字来实现:

initial s1 = {default:2}; // 将x和y设置成2

我们也可以使用{member:value}或{data_type: default_value}这样的语法:

ab abkey[1:0] = {{a:1, b:1.0}, {int:2, shortreal:2.0}};

注意:default关键字可以应用于嵌套结构体中的成员或结构体中非压缩数组的元素。事实上,它可以沿着嵌套深入到其中的内建类型或压缩数组。

struct {
    int A;
    struct {
        int B, C;
    } BC1, BC2;
}

ABC = {A:1, BC1:{B:2, C:3}, BC2:{B:4,C:5}};
DEF = {default:10};

为了处理成员具有不同类型的问题,我们可以使用一个类型作为键值。它会过载该类型成员的缺省值:

typedef struct {
    logic [7:0] a;
    bit b;
    bit signed [31:0] c;
    string s;
} sa;

sa s2;

initial begin
    s2 = {int:1, default:0, string:""}; // 除了将位数组设置成1以及将字符串设置成
                                        // ""之外,所有其它成员均设置成0。
end

类似的,我们可以设置单个成员以便过载由default和类型缺省设置的值:

initial #10 s1 = {default:'1, s:""}; // 除了s设置为""之外,所有其它成员均设置成1

当花括号使用在一条赋值语句的关联文中的时侯,由SystemVerilog确定花括号的关联文。如果花括号使用在一条对非压缩结构体赋值的关联文中,那么花括号代表一个非压缩数组文本或表达式。在对一个集合类型赋值的关联文之外,花括号必须与一个显式的强制类型转换一起使用以便将它与串联区分开来。当花括号包含了一个标签、类型或default键值的时候,无论对于压缩结构体类型还是非压缩结构体类型,花括号都不应被解释成串联。

匹配规则如下:

  • member:value:为结构体的一个命名成员显式地指定一个确定的值。这个命名成员必须位于结构体的顶层,也就是说位于某个子结构体中具有相同名字的成员不会被设置。这个指定的值必须能够被强制转换到成员类型,并在为命名成员赋值的关联文中计算,否则会产生一个错误。
  • type:value:如果结构体中的一个域没有使用上述的域名键值设置,那么可以使用type:value为结构体中等价于指定类型的域指定一个确切的值。如果指定了多个相同的类型键值,那么使用最后一个类型键值。这个值在为匹配类型成员赋值的关联文中计算。
  • default:value:应用于没有通过成员名或类型键值匹配,并且不是结构体或非压缩数组的成员。值在对通过default匹配的成员的每一个赋值中计算,并且必须能够被强制转换到成员的类型,否则会产生一个错误。对于未匹配的结构体成员,类型和default说明符根据本节中的规则递归地应用到每一个子结构体的成员。对于未匹配的非压缩数组成员,类型和default说明符根据非压缩数组规则应用到这个数组。

每一个成员都必须被其中的一个规则所涵盖。

如果一个类型键值、default键值、或者复制操作符被使用在一个具有副作用的表达式中,那么表达式的计算次数是为定义的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文