Verilog中二维real类型数组的正确赋值方法是什么?
Verilog二维real数组赋值错误原因与解决方案
错误原因
你使用的类C嵌套大括号批量初始化多维数组的写法,缺少SystemVerilog语法要求的前置单引号',且纯Verilog标准本身不支持声明时的多维数组批量初始化操作,因此在未开启SystemVerilog编译选项的仿真环境中无法正常运行。
解决方案
方案1:使用SystemVerilog语法(推荐)
调整初始化语句的格式,给每个数组层级的大括号前加单引号',同时建议显式写real类型的浮点数值避免隐式转换,编译时给仿真工具开启SystemVerilog支持即可(比如Questa/Modelsim添加-sv编译参数,VCS添加-sverilog编译参数)。修改后的代码如下:
`timescale 1ns/10ps module twodim (); // 注意每个大括号前的单引号',是SystemVerilog数组赋值的标准语法 real xy[0:2][0:1] = '{'{1.0, 1.0}, '{2.0, 4.0}, '{3.0, 9.0}}; initial begin int n = 1; $display ("x[n] = %f y[n] = %f", xy[n][0], xy[n][1]); #1 $finish; end endmodule
运行后会输出预期结果:x[n] = 2.000000 y[n] = 4.000000。
方案2:纯Verilog兼容实现
如果不能使用SystemVerilog特性,需要在initial块中逐个对数组元素赋值,不需要开启额外编译选项即可运行,代码如下:
`timescale 1ns/10ps module twodim (); real xy[0:2][0:1]; // 声明时不做批量初始化 initial begin // 逐个对数组元素赋值 xy[0][0] = 1.0; xy[0][1] = 1.0; xy[1][0] = 2.0; xy[1][1] = 4.0; xy[2][0] = 3.0; xy[2][1] = 9.0; integer n = 1; $display ("x[n] = %f y[n] = %f", xy[n][0], xy[n][1]); #1 $finish; end endmodule
内容的提问来源于stack exchange,提问作者bardo
相关产品推荐
相关产品推荐

