Verilog中的寄存器数组 【转】
(2013-01-16 20:24:09)
标签:
杂谈 |
分类: FPGA |
最近,在看同步FIFO时,需要定义一个寄存器数组,类似地reg [7:0] mem
[15:0],对一些基本概念不清楚,不知是如何实现的。
一直不清楚Verilog中寄存器数组是如何实现的。标准中只提到,例如定义一个寄存器数组(最多二维):reg [3:0]
memery
[9:0]。并说不能直接给这样的寄存器数组赋0。在实际使用中发现,第一个范围表示寄存器内数据的位宽[3:0]表示4bit一个数据,第二个范围表示地址(个数)范围。
这里有一些隐含的意思,这些在标准里没有提到(可能制定标准的人认为大家都明白),位宽很好理解,但要注意位宽的范围一定是从0到一个正整数的,而地址范围则可以从任意正整数到任意正整数!例如:
reg [3:0] memery [9:0]和reg [3:0] memery [0:9]与reg [3:0] memery
[10:1]都表示同样大小的寄存器数组,而前两个完全等价,第三个在使用的时候首地址是从1开始而已。虽然这样的定义有很大的随意性,但为了审查直观,可以在定义位宽范围的时候把高位放在前面,因为这样可以一目了然的看出位宽。在定义地址范围的时候可以把低位放前面,这样符合一般思维习惯。即第二种定义方式。
寄存器数组在使用的时候,有个很重要的简写例如上述定义中,memory[0]表示第一个位置上的一个4位的数,它可以赋值给一个4位的寄存器,例如:
定义:
reg [3:0] memory [0:9];
reg [3:0] a;
赋值:
a = memory[0];
最后要注意到是,所有的范围参数必须是常量(parameter,localparam等),不能是变量。