Verilog:reg。的顺序

时间:2013-05-26 18:04:00

标签: verilog

简单的问题

如果我需要使用4个8位数字,我会声明以下注册表。

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])声明它们,访问元素会如何变化?例如?

3 个答案:

答案 0 :(得分:3)

  1. reg[7:0]是一个8位“寄存器”或变量
  2. reg[7:0] numbers[3:0]是一个包含4个元素的一维数组,命名为 numbers,每个都是一个8位寄存器
  3. numbers的元素作为numbers[index]
  4. 进行访问
  5. numbers[i][j]numbers[i]的位选择。它访问位 j
  6. i元素中的numbers
  7. 正如工具所说,数组索引更为传统 编号[lsb:msb],但没有充分的理由。
  8. 分配两个对象时,从左到右复制位,与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
    

答案 1 :(得分:2)

是的,该语法可以用于声明4个8位数字,但是对于单词数量来说,将0更改为常规冒号:

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

答案 2 :(得分:0)

右边的尺寸称为未压缩尺寸,左边的尺寸是压缩的。我在网上发现这是一种记住访问元素的简单方法。 “从左到右,从右开始”。所以首先从解压缩的尺寸开始。要在声明中访问第3位的第8位,我会使用数字[2] [7]。 This帖子有适当的解释。

如果您使用相同的约定来声明和赋值,我认为应该没问题。实际上,消除[:]并将其声明为更简单 reg [7:0] numbers [4];给出4位,8位数字。