如何将int类型动态数组元素赋值给自定义8位向量动态数组?
SystemVerilog类型赋值问题:int动态数组转8位bit向量动态数组
问题需求
将32位int类型动态数组的每个元素,赋值给自定义8位bit向量的动态数组元素,仅保留int的低8位(即大向量赋值给小向量的自动截断效果)。
错误尝试方法
方法1
module tb (); int my_ints []; typedef bit [7 :0] my_type []; my_type my_array []; initial begin my_ints = new[2]; my_array = new[2]; my_ints = '{1,2}; // *E,TYCMPAT (testbench.sv,15|26): 赋值运算符类型检查失败 // (期望类型兼容于'tb::my_type (元素为打包数组[7:0]bit的动态数组)',但实际为'int') foreach(my_ints[i]) begin my_array[i] = my_ints[i]; $display("my_array[0] = %d",my_array[0]); end end endmodule
方法2
module tb (); int my_ints []; typedef bit [7 :0] my_type []; my_type my_array []; initial begin my_ints = new[2]; my_array = new[2]; my_ints = '{1,2}; // *E,WOUPXR (./testbench.sv,16|41): 此上下文不允许使用非打包数组类型的表达式 [SystemVerilog] foreach(my_ints[i]) begin my_array[i] = my_type'(my_ints[i]); $display("my_array[0] = %d",my_array[0]); end end endmodule
方法3
module tb (); int my_ints []; typedef bit [7 :0] my_type []; my_type my_array []; initial begin my_ints = new[2]; my_array = new[2]; my_ints = '{1,2}; // *E,TYCMPAT (testbench.sv,15|26): 赋值运算符类型检查失败 // (期望类型兼容于'tb::my_type (元素为打包数组[7:0]bit的动态数组)',但实际为'打包数组') foreach(my_ints[i]) begin my_array[i] = my_ints[i][7:0]; $display("my_array = %d",my_array[i]); end end endmodule
错误根源
所有错误的核心是类型定义错误:typedef bit [7 :0] my_type []; 定义的是元素为bit[7:0]的动态数组类型,也就是说my_array作为my_type类型的变量,是一个动态数组,且每个元素本身又是一个动态数组。但实际需求是创建一个元素为bit[7:0]的动态数组,而非二维动态数组。
正确实现方法
修正类型定义,先定义单个元素的类型,再基于该类型定义动态数组:
module tb (); int my_ints []; typedef bit [7:0] byte_t; // 定义单个8位bit向量类型 byte_t my_array []; // 定义元素为byte_t的动态数组 initial begin my_ints = new[2]; my_array = new[2]; my_ints = '{1, 2}; foreach(my_ints[i]) begin // 直接赋值,自动截断int的低8位 my_array[i] = my_ints[i]; $display("my_array[%0d] = %0d", i, my_array[i]); end end endmodule
或者也可以不单独typedef,直接定义动态数组:
bit [7:0] my_array [];
运行结果
my_array[0] = 1 my_array[1] = 2
内容的提问来源于stack exchange,提问作者Mikef
相关产品推荐
相关产品推荐

