You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:03:27