2

简单的问题

如果我需要使用 4 个 8 位数字,我将声明以下 reg。

reg [7:0] numbers [3:0]

我对第一个和第二个声明([7:0] 和 [3:0])之间的区别感到很困惑。他们应该按什么顺序来?第一个保留数字的大小,而第二个保留数字的数量,反之亦然?[7:0] 或 [0:7] 是否给出了正确的顺序?

提前致谢。

编辑:

例如,普通的数字数组看起来像这样

0000
0110
0001

共有三个 4 位数字(0000、0110、0001)。我们可以使用数组索引来访问它们。因此,访问第二个数字的第一位数字是通过这样的方式完成的

a[0][1]

假设这个数组存储在变量 a 中。

回到 Verilog,如果我在 reg 中交换值或以相反的顺序 ([0:7]) 声明它们,访问元素会如何变化?

4

2 回答 2

4
  1. reg[7:0]是一个 8 位“寄存器”或变量
  2. reg[7:0] numbers[3:0]是一个一维数组,有 4 个元素,名为 numbers,每个元素都是一个 8 位寄存器
  3. 的元素numbers被访问为numbers[index]
  4. numbers[i][j]是 的位选择numbers[i]。它访问 jith 元素中的位numbers
  5. 正如 toolic 所说,对数组索引进行编号更为传统[lsb:msb],但这没有充分的理由。

分配两个对象时,位从左到右复制,与 VHDL 一样。

Verilog 对位和部分选择以及数组索引的检查(非常)很差。请参阅下面的代码。

module top;
   initial
     test;
   task test;
      reg[3:0] a[0:1];
      reg[0:3] b[0:1];
      reg[2:5] c[0:1];
      begin
       a[0] = 4'b1101;
       a[1] = 4'b0110;
       a[2] = 4'b0001;                      // error, but not caught by Verilog

       $display("a[2] is %d", a[2]);        // modelsim produces no warning, prints 'a[2] is x'
       $display("a[0][4] is %b", a[0][4]);  // modelsim warns, and prints 'a[0][4] is x'

       $display(                            // produces '1.1.0.1'
         "a[0][3:0] is %b.%b.%b.%b", a[0][3], a[0][2], a[0][1], a[0][0]);

       b[0] = a[0];                         
       $display("b[0] is %d", b[0]);        // produces '13'
       $display(                            // produces '1.1.0.1'
         "b[0][0:3] is %b.%b.%b.%b", b[0][0], b[0][1], b[0][2], b[0][3]);

       c[0] = a[0];                         
       $display("c[0] is %d", c[0]);        // produces '13'
       $display(                            // produces '1.1.0.1'
         "c[0][2:5] is %b.%b.%b.%b", c[0][2], c[0][3], c[0][4], c[0][5]);
     end
   endtask
endmodule
于 2013-05-28T09:50:37.073 回答
2

是的,该语法可用于声明 4 个 8 位数字,但更传统的做法是将 0 放在冒号左侧表示字数:

reg [7:0] numbers [0:3]
于 2013-05-26T18:15:47.687 回答