在Testbench中使用memory问题
在最近的双边滤波器的仿真中遇到一些很奇怪的问题,主要是对memory的操作问题。遇到的现象和解决方法法描述如下:
在Testbench中定义了1组14位存储器分别用来存储一帧图像的数据。
主要数据类型的定义以及初始化:
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个问题:
1 对存储器的写操作问题:
在仿真中经过多次观察分析后发现:如果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]中。
2 对存储器的读操作问题:
如果地址范围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];

浙公网安备 33010602011771号