结构优势是什么?
What is advantage of structure?
我是 Verilog 用户,所以我对 SystemVerilog 不熟悉。
现在我正在努力学习structure literals。
使用结构有什么好处?
SystemVerilog 中的结构与C 语言中结构的用法或多或少相似,结构是不同数据类型、变量或常量在单一名称下的集合。有关详细信息,您可以随时参考 SystemVerilog LRM IEEE Std 1800-2012 ♦ 7.2 结构
这里我会解释结构体比较常见的用法和优点
结构的声明可以通过变量或网络来完成,一个结构作为一个整体可以通过使用var关键字来声明为变量,并且一个结构可以被定义为网络使用Verilog 数据类型 wire 或 tri,当定义为网络类型时,结构的所有成员都应为 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
我是 Verilog 用户,所以我对 SystemVerilog 不熟悉。
现在我正在努力学习structure literals。
使用结构有什么好处?
SystemVerilog 中的结构与C 语言中结构的用法或多或少相似,结构是不同数据类型、变量或常量在单一名称下的集合。有关详细信息,您可以随时参考 SystemVerilog LRM IEEE Std 1800-2012 ♦ 7.2 结构
这里我会解释结构体比较常见的用法和优点
结构的声明可以通过变量或网络来完成,一个结构作为一个整体可以通过使用var关键字来声明为变量,并且一个结构可以被定义为网络使用Verilog 数据类型 wire 或 tri,当定义为网络类型时,结构的所有成员都应为 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