笔者今天在用verilog语言实现32个32位寄存器时候,出现了一个疑问。
我们知道在verilog语言中,定义一个32位寄存器的代码是:
reg[31:0] regs;
如果我要定义两个寄存器(其实就可以认为是寄存器组)呢?
reg[31:0] regs[0:1];
这个也很好理解,意思是:
reg[位数] regs[寄存器个数] ;
问题是在于寄存器个数,为什么用的是[0:1],而不是[1:0]?
解释:
在verilog中,
reg [31:0] regs [1:0] 和
reg [31:0] regs[0:1] 与
reg [31:0] regs[2:1] 都表示两个32位寄存器组,并且前两个完全等价。
这里就要区分[ ]的使用情况了
情况一:[31:0]表示位宽
这个很好理解,比如我想表示一个信号的线宽,就是这样表示出来的。将31写在前面,0写在后面是为了更容易一眼看出位宽。
情况二:[0:1]表示个数
这也就是小端法,两个寄存器,编号先从0开始。而不是先从1开始。
如果先从1开始,也就是写成[1:0],这就是大端法。
至于第三种“reg [31:0] regs[2:1] ”,显然就是从2开始编号,然后1截止。是大端法,但显然用的很不顺。
一般我们用“reg [31:0] regs[0:1] ”的形式表示两个32位寄存器组,编号是0和1。
为什么用大端法定义寄存器组更好?
因为在赋值的时候更加方便:
reg[31:0] regs[1:0]; reg[31:0] a; a = regs[0]; //赋值给第一个寄存器(编号为0的寄存器)
其中,regs[0]中的下标,可以用循环批量赋值。这里,你可以想象成C语言的数组,在C语言中是不是经常遇到下标为0的数组作为起始。这样也是顺应了习惯。
今天遇到了同样的疑问,谢谢解答!
不客气,有帮助就好。