在Testbench中使用memory问题

      在最近的双边滤波器的仿真中遇到一些很奇怪的问题,主要是对memory的操作问题。遇到的现象和解决方法法描述如下:

Testbench中定义了114位存储器分别用来存储一帧图像的数据。

主要数据类型的定义以及初始化:

reg[ 8:0]   npe;

reg[ 8:0]   nle;

initial begin

npe = 384;

nle = 288;

end

reg[13:0]  mem1[0:130000];

reg[16:0]  pixel_cnt;

reg[16:0]  line_cnt;

reg[31:0]  reg_sub;

主要赋值语句:

mem1[line_cnt*npe + pixel_cnt] <= data_in;

    reg_sub <= mem1[line_cnt*npe+pixel_cnt] - mem1[line_cnt*npe + pixel_cnt + 1];

在仿真中发现2个问题:

对存储器的写操作问题:

      在仿真中经过多次观察分析后发现:如果mem1里面写的数据总数不超过1000个的话,mem1可以正确是接受数据。但是一旦数据超过1000个后,写数据偶尔出现错误。主要表现在:数据不但写进指定的地址中,还写在无关的地址中。例如:当ine_cnt*npe + pixel_cnt=1024,数据data_in=3b69时,当执行mem1[line_cnt*npe + pixel_cnt] <= data_in语句时,数据3b69不但写在mem1[1024]中,还同时写在mem1[1]中。

对存储器的读操作问题:

      如果地址范围1000内对mem1的读完全正确,但是一旦地址范围超过1000后在读的过程中会出现错误。例如:当line_cnt*npe + pixel_cnt = 1024时,   mem1[line_cnt*npe + pixel_cnt ] = 3b69,mem1[line_cnt*npe + pixel_cnt + 1] = 2194

reg_sub <= mem1[line_cnt*npe+pixel_cnt] - mem1[line_cnt*npe + pixel_cnt + 1];

reg_sub的值应该是19d5,但是从仿真的结果看却是313

 

解决办法:

     在对mem1进行操作的时候先定义integer变量来存储地址,然后再对mem1进行操作,这样就不会出现以上的错误。

例如: 

integer  addr1;

integer  addr2;

addr1 <= line_cnt*npe + pixel_cnt;

 addr2 <= line_cnt*npe + pixel_cnt + 1;

 mem1[addr1] <= data_in;

 reg_sub <= mem1[addr1] - mem1[addr2];

posted @ 2014-01-06 15:55  Jeason001  阅读(675)  评论(0)    收藏  举报