verilog中的寄存器组、何时用[31:0]?何时用[0:31]?

笔者今天在用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的数组作为起始。这样也是顺应了习惯。

作者: 高志远

高志远,23岁,男生,毕业于上海杉达学院电子商务系。

发表评论

邮箱地址不会被公开。