1

这是一个用于说明的示例。在 SystemVerilog 中,它具有数组分配模式和结构分配模式语法。不管这里的 union 构造是打包还是解包,不管它是否可合成,它是赋值模式的有效用法吗?如果是, union 应该是什么值x

typedef struct {
  int a;
  byte b;
  union packed {
      int c;
      bit [31:0] d;
  } x;
} S;

module top (s);
  output S s;
  assign s = '{int:2, default:1};
endmodule

如果不是,是否意味着我必须为解压结构逐个字段指定初始值?

initial begin
  s.a = 2;
  s.b = 1;
  s.x.c = 2;
end
4

2 回答 2

2

我稍微修改了您的代码以打印分配的值。

typedef struct {
  int a;        
  byte b;       
  union packed {
      int c;
      bit [31:0] d;
  } x; 
} S;

module top (s);
  output S s;
  assign s = '{int:2, default:1};

  initial begin
    #10
        $display ("s.a = %d, s.b = %h, s.x.c = %d, s.x.d = %h", s.a, s.b, s.x.c, s.x.d);
  end 
endmodule

以下是 ncsim 的结果:

s.a =           2, s.b = 01, s.x.c =           1, s.x.d = 00000001

并来自 vcs:

s.a =           2, s.b = 01, s.x.c =           1, s.x.d = 00000001

希望这能回答你的问题。

于 2013-02-17T01:05:40.443 回答
1

我试过这个修改过的例子:

typedef bit [31:0] Word;
typedef struct {
  int a;
  byte b;
  union packed {
      int c;
      Word d;
  } x;
  union packed {
      Word d;
      int c;
  } y;
} S;

module top (s);
  output S s;
  assign s = '{ int:2, Word:3, default:1 };

  initial begin
    #10
        $display ("s.a = %d, s.b = %h, s.x.c = %d, s.x.d = %h s.y.d = %h s.y.c = %d",
                  s.a, s.b, s.x.c, s.x.d, s.y.d, s.y.c);
  end 
endmodule

Modelsim 给出以下输出:

s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000002 s.y.c =           2

而 VCS 给出了这个输出:

s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000003 s.y.c =           3

这表明模拟器以他们想要的方式处理此类代码,并且没有预期的标准行为。

以下语法使用起来会更安全:

assign s = '{ int:2, default:1, x:3, y:4 };

有了这个,Modelsim 和 VCS 都给出了:

s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000004 s.y.c =           4
于 2013-06-20T23:49:04.807 回答