首页 文章

在SystemVerilog中的结构内使用union的赋值模式

提问于
浏览
1

这是一个例子 . 在SystemVerilog中,它具有数组赋值模式和结构赋值模式语法 . 无论这里的union构造是打包还是解包,无论它是否是可合成的,它是否是赋值模式的有效用法?如果是的话,对于工会 x 应该是什么 Value ?

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

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
    

    希望这能回答你的问题 .

  • 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
    

相关问题