结构优势是什么?

What is advantage of structure?

我是 Verilog 用户,所以我对 SystemVerilog 不熟悉。

现在我正在努力学习structure literals

使用结构有什么好处?

SystemVerilog 中的结构与C 语言中结构的用法或多或少相似,结构是不同数据类型、变量或常量在单一名称下的集合。有关详细信息,您可以随时参考 SystemVerilog LRM IEEE Std 1800-2012 ♦ 7.2 结构

这里我会解释结构体比较常见的用法和优点

结构的声明可以通过变量或网络来完成,一个结构作为一个整体可以通过使用var关键字来声明为变量,并且一个结构可以被定义为网络使用Verilog 数据类型 wiretri,当定义为网络类型时,结构的所有成员都应为 4 态类型。

结构变量:

var struct { 
logic [15:0] a, b;
logic [ 7:0] data;
logic [31:0] width;
} data_word_var;

结构网:

wire struct { 
logic [15:0] a, b;
logic [ 7:0] data;
logic [31:0] width;
} data_word_net;

如果我们没有提到结构的类型,默认情况下它将是网络类型,请注意,尽管整个结构可以是网络类型,但不能在结构内部声明网络类型变量。

结构可以整体初始化

data_word_net dw = ’{16'hf0f0, 16'h1010, 8’d3, 0};

或者个别成员可以初始化

data_word_net dw;
dw.data = 8'b1011_1111;

我们也可以使用成员名称进行初始化

data_word_net dw = ’{a:16'hf0f0, b:16'h1010, data:8’d3, width:0}; // legal
data_word_net dw = ’{a:16'hf0f0, data:8’d3, b:16'h1010, width:0}; // legal
data_word_net dw = ’{a:16'hf0f0, 8’d3, 16'h1010, width:0}; // illegal(all members should be mentioned do not mix both)

也可以使用 default 关键字将成员初始化为默认值

typedef struct {
real r0, r1;
int i0, i1;
logic [ 7:0] a;
logic [23:0] addr;
} data_word;
data_word dw;
dw = ’{ real:1.0, default:0, r1:3.1415 };

可以通过模块端口使用结构

package my_pkg;
typedef struct {
logic [31:0] a, b;
} input_ports;

typedef struct {
logic [63:0] y;
} output_ports;
endpackage

module alu
(input my_pkg::input_ports inp,
 output my_pkg::output_ports outp,
 input wire clock);
 ...
endmodule

结构也可以用作任务和函数的参数

module dut (...);
...
typedef struct { 
logic [31:0] a, b;
logic [63:0] width;
logic [15:0] addr;
} i_pins;
function alu (input i_pins connect);
...
endfunction
endmodule

除了上述优点外,语言还支持压缩和解压缩格式的结构数组,如下所示

typedef struct packed { // packed structure
logic [7:0] a;
logic [7:0] b;
} packet_t;
packet_t [15:0] packet_array; // packed array of 16 structures

typedef struct { // unpacked structure
int a;
real b;
} data_t;
data_t data_array [15:0]; // unpacked array of 16 structures