一个结构可以包含不同数据类型的元素,这些元素可以整体引用,也可以通过名称单独引用。这与具有相同数据类型的数组有很大不同。
// 普通数组->相同数据类型的变量的集合
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