SystemVerilog Structure

一个结构可以包含不同数据类型的元素,这些元素可以整体引用,也可以通过名称单独引用。这与具有相同数据类型的数组有很大不同。

 // 普通数组->相同数据类型的变量的集合
  int array [10];         // 所有元素都是int类型
  bit [7:0] mem [256];    //所有元素都是bit类型
 
  // 结构->不同数据类型的变量的集合
  struct {
    byte    val1;
    int     val2;
    string  val3;
  } struct_name;

Syntax

 struct { 
    [list of variables]
  } struct_name;

Unpacked Structures

默认情况下,结构是Unpacked的,结构结构可以使用struct关键字定义,并且可以在大括号内提供成员声明列表,后跟结构名称。

Structure Example

module tb;  
    //创建一个名为“ st_fruit”的结构,以天为单位存储水果的名称,数量和有效期
    //注意:此结构声明也可以放在模块外部
  struct {
      string fruit;
      int    count;
      byte    expiry;  
  } st_fruit;
 
  initial begin
    // st_fruit 是一个结构变量,所以让我们对其进行初始化
    st_fruit = '{"apple", 4, 15};
 
    // 显示结构变量
    $display ("st_fruit = %p", st_fruit);
 
    // 将水果更改为菠萝,并且将其过期至7 
    st_fruit.fruit = "pineapple";
    st_fruit.expiry = 7;
    $display ("st_fruit = %p", st_fruit);
  end
endmodule
 
Simulation Log
ncsim> run
st_fruit = '{fruit:"apple", count:4, expiry:'hf}
st_fruit = '{fruit:"pineapple", count:4, expiry:'h7}
ncsim: *W,RNQUIE: Simulation is complete.

typedef结构需要什么?

上面的示例中仅创建了一个变量,但是如果需要创建具有相同成分的多个结构变量,则最好通过typedef创建用户定义的结构数据类型。 然后,st_fruit将成为数据类型,然后可用于创建该类型的变量。

 
module tb;  
  typedef struct {
      string fruit;
      int    count;
      byte    expiry;  
  } st_fruit;
 
  initial begin
    // st_fruit是数据类型,因此我们需要声明此数据类型的变量
    st_fruit fruit1 = '{"apple", 4, 15};
    st_fruit fruit2;
 
    // 显示结构变量
    $display ("fruit1 = %p fruit2 = %p", fruit1, fruit2);
 
    // 将一个结构变量分配给另一个并打印
    // 请注意,此变量的内容已复制到另一个
     fruit2 = fruit1;
    $display ("fruit1 = %p fruit2 = %p", fruit1, fruit2);
 
    // 更改 fruit1 ,以查看 fruit2是否受到影响
    fruit1.fruit = "orange";
    $display ("fruit1 = %p fruit2 = %p", fruit1, fruit2);
  end
endmodule
 
Simulation Log
ncsim> run
fruit1 = '{fruit:"apple", count:4, expiry:'hf} fruit2 = '{fruit:"", count:0, expiry:'h0}
fruit1 = '{fruit:"apple", count:4, expiry:'hf} fruit2 = '{fruit:"apple", count:4, expiry:'hf}
fruit1 = '{fruit:"orange", count:4, expiry:'hf} fruit2 = '{fruit:"apple", count:4, expiry:'hf}
ncsim: *W,RNQUIE: Simulation is complete.

packed结构

压缩结构是一种将向量细分为多个字段的机制,这些字段可以作为成员进行访问,并且可以无间隙地打包到内存中。 结构中的第一个成员是最重要的,随后的成员按照重要性的降序排列。

使用packed关键字将结构声明为packed,该关键字默认为无符号。

Example

typedef struct packed {
  bit [3:0] mode;
  bit [2:0] cfg;
  bit       en;
} st_ctrl;
 
module tb;
  st_ctrl    ctrl_reg;
 
  initial begin 
    // 初始化packed结构变量
    ctrl_reg = '{4'ha, 3'h5, 1};
    $display ("ctrl_reg = %p", ctrl_reg);
 
    //将压缩的结构成员更改为其他内容
    ctrl_reg.mode = 4'h3;
    $display ("ctrl_reg = %p", ctrl_reg);
 
    // Assign a packed value to the structure variable
    ctrl_reg = 8'hfa;
    $display ("ctrl_reg = %p", ctrl_reg);
  end  
endmodule  
 
Simulation Log
ncsim> run
ctrl_reg = '{mode:'ha, cfg:'h5, en:'h1}
ctrl_reg = '{mode:'h3, cfg:'h5, en:'h1}
ctrl_reg = '{mode:'hf, cfg:'h5, en:'h0}
ncsim: *W,RNQUIE: Simulation is complete.

参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-structure#structure-example

发布了91 篇原创文章 · 获赞 7 · 访问量 5259

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104457012