使用typedef时数组指示符的放置位置及logic与real的差异疑问
关于ModelSim中typedef数组语法差异的解答
你遇到的这个问题本质是Verilog/SystemVerilog语法规范对不同数据类型的数组声明规则差异,再加上ModelSim的兼容性适配导致的,下面分两部分详细说明:
一、数组指示符的正确放置位置
针对不同数据类型,正确的typedef数组写法有明确区别:
- 对于四值逻辑类型(比如
logic、reg、wire):ModelSim出于兼容新旧代码的考虑,同时支持两种写法:// 写法1:数组维度放在类型别名后(传统Verilog写法) typedef logic logic_7_0_t [7:0]; // 写法2:数组维度放在类型后(SystemVerilog紧凑写法) typedef logic [7:0] logic_7_0_t; - 对于real这类非四值标量类型:只能将数组指示符放在类型别名的后面,正确写法是:
而typedef real real_3_0_t [3:0];typedef real [3:0] real_3_0_t;属于语法错误,这是严格遵循Verilog/SystemVerilog规范的结果。
二、logic与real存在差异的原因
这个差异的核心来源于Verilog/SystemVerilog对不同数据类型的语法定义:
- 四值逻辑类型的特殊性:
logic属于Verilog里的「变量/线网类型」,这类类型天生支持向量(vector)声明——也就是[7:0]这种维度可以直接跟在类型后面,用来表示多位的逻辑信号。后来SystemVerilog扩展了语法,也允许将维度放在类型别名后面来声明数组,ModelSim为了兼容新老代码,就同时支持了两种写法。 - real类型的本质限制:
real是标量数据类型,它本身没有「向量」的概念,只有「数组」的概念。在Verilog规范里,标量类型的数组声明必须将维度放在类型别名之后,用来表示多个real标量组成的数组,而不能直接在real后面加维度(因为real不支持向量化)。ModelSim对这类类型严格遵循了规范,所以第二种写法会报错。
简单总结:四值逻辑类型的两种写法是兼容性支持,而real类型只能用数组维度后置的写法,这是由它们在语法规范中的定义差异决定的。
内容的提问来源于stack exchange,提问作者EquipDev
相关产品推荐
相关产品推荐

