verilog中的存储器初始化问题
比如:reg[15:0] MEM_REG[7:0];我怎样才能将其在复位信号有效时置0?
补充一句,不用initial块,因为我要使用一个可综合的语句!如何使用verilog语句实现?
一般来讲RAM不能用复位信号置位,否则会综合出一大堆逻辑出来。
这个是为什么呢,我好像也看见过一段代码,没用存储器格式,而是把寄存器一个个定义出来,比如reg 【7:0】 mem0,mem2,...,mem7;
然后还是一个个的赋值。
那如果我一定想要用复位来对RAM进行初始化呢!就像FPGA那样!我以前是做FPGA的,我觉得对于FIFO的复位有时还是蛮重要的!
对呀!我也见过这种代码,但是我不想使用这种风格。不过话又说过来,既然这样可以,那没有理由不能对于存储器使用复位呀!
这么说吧,你能想出带复位置0的RAM是什么个硬件结构吗?
这样就能理解3L说的话了
verilog描述的所谓memory无法被综合。
你所见到的写法,其实是寄存器。
当对存储要求很小时,比如i2c,只会1个byte传入立刻被读走的话,那就没必要使用memory这种
面积巨大的器件,寄存器就足够了。
reg[15:0] MEM_REG[7:0] 是一个数组
若需要对数组中的某一存储单元进行操作,必须指定该存储单元在数组中的位置。
如:MEM_REG[5] 《= 0;
或者
reg [15:0] data;
data 《= MEM_REG[4];
自行定义for循环,复位每个寄存器
你这个定义根本就不是RAM
你的意思是不是说memory它自身还要带有一套寻址逻辑,所以造成memory与由纯粹的寄存器声明所形成的同等大小的寄存器在综合后所形成的面积不一致。比如:
reg[7:0] mem[3:0];
与:reg[7:0] REG1;
reg[7:0] REG2;
reg[7:0] REG3;
reg[7:0] REG4;
这样两组声明前一组比后一组的面积要大
加reset
你可以研究一下FPGA芯片的原语对于Block RAM的描述。或者换句话说,你所谓的复位,其实就是对RAM的一个擦除操作。如果你认为确实很有必要,可以考虑用一个状态机来实现。但是我确实没有想象出来对RAM复位时整体擦除有什么必要。
如果使用ip的话,ip本身有个参数initial value类似的,一上电后ram就是initial值了。
用循环语句
我也建议使用小编的这个意见,如果实在要复位的话,可以在启动后用状态机写一遍,对于描述语言跟实际综合出来的东西,最好翻看软件自带的对器件的描述,你可以直接看文档,甚至直接看库描述文件也可以。xilinx的在xst.pdf里边有很详细的描述。
这么说吧,memory根本不是寄存器。
一般来说,相当一部分是寻址逻辑+latch。
memory通常都是用foundry提供的库,而不是自己写出来的reg。
你写出来的,无论哪种写法,都只是一堆reg而已。
好的,谢谢啦,这下大概明白了!
使用core generator 生成block ram或者distribute ram,可以通过eco或者mif文件赋初值
