Verilog:reg的顺序

Verilog:reg的顺序,verilog,Verilog,简单问题 如果我需要使用4个8位数字,我将声明以下注册表 reg [7:0] numbers [3:0] 我对第一个和第二个声明([7:0]和[3:0])之间的区别感到非常困惑。他们应该按什么顺序来?第一个代表数字的大小,而第二个代表数字的数量,或者反之亦然?[7:0]或[0:7]的命令是否正确 提前谢谢 编辑: 例如,普通的数字数组如下所示 0000 0110 0001 有三个4位数字(0000、0110、0001)。我们可以使用数组索引来访问它们。所以,访问第二个数字的第一个数字是这样做

简单问题

如果我需要使用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])声明它们,访问元素会发生怎样的变化,例如?

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

reg [7:0] numbers [0:3]
  • reg[7:0]
    是一个8位“寄存器”或变量
  • reg[7:0]number[3:0]
    是一个包含4个元素的一维数组,名为
    数字
    ,每个数字都是8位寄存器
  • numbers
    的元素作为
    numbers[index]
  • numbers[i][j]
    是对
    numbers[i]
    的一种选择。它访问位
    j
    i
    th元素的
    number
  • 正如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