在 SystemVerilog 中,matching types
(匹配类型)和 equivalent types
(等效类型)存在以下核心区别:
1. 定义维度不同
matching types
:侧重从类型声明、结构关系角度判定,关注类型定义的“形式一致性”。- 例如:
- 内置类型每次出现都与自身匹配(如
bit
类型自身匹配); - 同一作用域内通过
typedef
定义的类型与原类型匹配(typedef bit node;
中bit
与node
是匹配类型); - 匿名类型(如匿名结构体)在相同声明作用域内的数据对象类型彼此匹配。
- 内置类型每次出现都与自身匹配(如
- 例如:
equivalent types
:侧重从数据表示、内容角度判定,关注类型的“数值或结构等效性”。- 例如:
- 打包结构体与内置整数类型,需总位数、状态(2 状态/4 状态)、符号完全一致才等效(如
typedef bit signed [7:0] BYTE;
中BYTE
与byte
等效); - 解包固定大小数组需元素类型等效且数组大小相等才等效(如
bit [9:0] A [0:5];
与bit [1:10] B [6];
若元素类型匹配、大小相等则等效)。
- 打包结构体与内置整数类型,需总位数、状态(2 状态/4 状态)、符号完全一致才等效(如
- 例如:
2. 包含关系与判定强度不同
matching types
是基础判定:满足matching types
是进一步判定equivalent types
的前提之一,但并非所有matching types
都是equivalent types
。equivalent types
是更严格的等效:- 例如,对于解包固定大小数组:
- 若两个数组元素类型匹配,但数组大小不等,它们是
matching types
,但因大小不等不满足equivalent types
中“大小相等”的条件,故不是equivalent types
;
- 若两个数组元素类型匹配,但数组大小不等,它们是
- 又如,对于打包结构体:
- 若两个打包结构体总位数、状态、符号中有一项不同,即使类型声明上是
matching types
,也不满足equivalent types
。
- 若两个打包结构体总位数、状态、符号中有一项不同,即使类型声明上是
- 例如,对于解包固定大小数组:
简言之,matching types
关注类型定义的“形式匹配”,equivalent types
关注类型在数据表示或结构上的“实质等效”,后者判定条件更严格。