首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Verilog中声明和使用一维和二维字节数组?

如何在Verilog中声明和使用一维和二维字节数组?
EN

Stack Overflow用户
提问于 2010-06-10 11:46:25
回答 3查看 210.7K关注 0票数 37

如何在Verilog中声明和使用一维和二维字节数组?

例如:如何做像这样的事情

代码语言:javascript
运行
复制
byte a_2D[3][3];
byte a_1D[3];

// using 1D
for (int i=0; i< 3; i++)
{
    a_1D[i] = (byte)i;
}

// using 2D
for (int i=0; i< 3; i++)
{
    for (int j=0; j< 3; j++)
    {
        a_2D[i][j] = (byte)i*j;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-10 16:55:17

Verilog以位为单位思考,所以reg [7:0] a[0:3]会给你一个4x8位数组(=4x1字节数组)。您可以使用a[0]获取其中的第一个字节。第二个字节的第三位是a[1][2]

对于二维字节数组,首先检查模拟器/编译器。老版本(我相信01之前的版本)不支持这一点。然后reg [7:0] a [0:3] [0:3]会给你一个二维字节数组。例如,可以用a[2][0][7]访问单个比特。

代码语言:javascript
运行
复制
reg [7:0] a [0:3];
reg [7:0] b [0:3] [0:3];

reg [7:0] c;
reg d;

initial begin

   for (int i=0; i<=3; i++) begin
      a[i] = i[7:0];
   end

   c = a[0];
   d = a[1][2]; 


   // using 2D
   for (int i=0; i<=3; i++)
      for (int j=0; j<=3; j++)
          b[i][j] = i*j;  // watch this if you're building hardware

end
票数 57
EN

Stack Overflow用户

发布于 2010-06-10 21:25:19

除了Marty的出色回答之外,SystemVerilog规范还提供了byte数据类型。下面的代码声明了一个4x8位的变量(4字节),为每个字节分配一个值,然后显示所有值:

代码语言:javascript
运行
复制
module tb;

byte b [4];

initial begin
    foreach (b[i]) b[i] = 1 << i;
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]);
    $finish;
end

endmodule

这将打印出来:

代码语言:javascript
运行
复制
Address = 0, Data = 00000001
Address = 1, Data = 00000010
Address = 2, Data = 00000100
Address = 3, Data = 00001000

这在概念上类似于Marty的reg [7:0] a [0:3];。但是,byte是2状态数据类型(0和1),而reg是4状态(01xz)。使用byte还需要您的工具链(模拟器、合成器等)以支持此SystemVerilog语法。还要注意更紧凑的foreach (b[i])循环语法。

SystemVerilog规范支持多种多维数组类型。LRM可以比我更好地解释它们;请参阅IEEE标准1800-2005,第5章。

票数 11
EN

Stack Overflow用户

发布于 2014-12-09 11:23:19

实际上这很简单,就像C编程一样,你只需要在声明时传递右边的数组索引。但是,是的,语法将类似于4个元素的0:3。

代码语言:javascript
运行
复制
reg a[0:3]; 

这将创建一个一维的单比特数组。类似地,可以像这样创建2D数组:

代码语言:javascript
运行
复制
reg [0:3][0:2];

现在在C中,假设你创建了一个int的二维数组,那么它将在内部创建一个32位的二维数组。但不幸的是,Verilog是一种HDL,所以它是以位而不是一堆位来思考的(尽管Verilog中有int数据类型),它可以允许您创建任意数量的位来存储在array的元素中(这不是C的情况,您不能在C中的2D数组的每个元素中存储5位)。因此,要创建一个2D数组,其中每个元素都可以保存5位值,您应该编写以下代码:

代码语言:javascript
运行
复制
reg [0:4] a [0:3][0:2];
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3011510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档