Urs*_*jor 35 arrays byte verilog
如何在Verilog中声明和使用1D和2D字节数组?
例如.怎么做像
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*rty 54
Verilog以比特思考,因此reg [7:0] a[0:3]会给你一个4x8位数组(= 4x1字节数组).你得到了第一个字节a[0].第二个字节的第三位是a[1][2].
对于2D字节数组,首先检查您的模拟器/编译器.较旧的版本(我相信'01之前)不会支持这个.然后reg [7:0] a [0:3] [0:3]会给你一个2D字节数组.a[2][0][7]例如,可以访问单个位.
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
Run Code Online (Sandbox Code Playgroud)
too*_*lic 10
除了Marty出色的答案之外,SystemVerilog规范还提供了byte数据类型.下面声明一个4x8位变量(4个字节),为每个字节分配一个值,然后显示所有值:
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
Run Code Online (Sandbox Code Playgroud)
打印出:
Address = 0, Data = 00000001
Address = 1, Data = 00000010
Address = 2, Data = 00000100
Address = 3, Data = 00001000
Run Code Online (Sandbox Code Playgroud)
这与Marty的概念类似reg [7:0] a [0:3];.但是,byte是2状态数据类型(0和1),但是reg是4状态(01xz).使用byte还需要您的工具链(模拟器,合成器等)来支持此SystemVerilog语法.还要注意更紧凑的foreach (b[i])循环语法.
SystemVerilog规范支持各种多维数组类型.LRM可以比我更好地解释它们; 参见IEEE Std 1800-2005,第5章.
这实际上很简单,就像 C 编程一样,您只需要在声明时传递右侧的数组索引即可。但是是的,对于 4 个元素,语法将类似于 [0:3]。
reg a[0:3];
Run Code Online (Sandbox Code Playgroud)
这将创建一个一维的单位数组。类似地,可以像这样创建二维数组:
reg [0:3][0:2];
Run Code Online (Sandbox Code Playgroud)
现在在 C 中,假设您创建了一个 int 的二维数组,那么它将在内部创建一个 32 位的二维数组。但不幸的是,Verilog 是一个 HDL,所以它以位而不是一堆位来思考(尽管 Verilog 中存在 int 数据类型),它可以允许您创建任意数量的位以存储在数组元素中(这不是在 C 的情况下,您不能在 C 中二维数组的每个元素中存储 5 位)。所以要创建一个 2D 数组,其中每个单独的元素都可以保存 5 位值,你应该这样写:
reg [0:4] a [0:3][0:2];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
176148 次 |
| 最近记录: |