查阅了很多资料,无意中看到有篇文章提到,要仿真成功这个IP的话,需要以下三个Library:
220model、Altera_mf,还有个最最关键的就是sgate!
另外还有一点需要注意的是,在用modelsim仿真时,在compile的时候,需要把.v、.vo和.tb这3个文件都加上才可以,否则在simulate时会提示错误。
几个简单的系统任务,$readmemb,$readmemh,$fopen,$fdisplay;基本上就可以完成对文件的读写操作。
用于读写的文件必须和modelsim建好的工程放在同一个文件夹中,否则会出现打不开文件的现象,即
返回的文件句柄为0.摆放位置如下图所示。
一、读任务
在verilog语言中有两个系统任务$readmemb,$readmemh可以用来从文件中读取数据到存储器中。这两个任务可以在仿真的任何时刻被执行使用,其使用方法如下:$readmemb
1,$readmemb("<数据文件名(路径地址和文件名)>",<存储器名>);
2, $readmemb("<数据文件名>",<存储器名>,<起始地址(存储器的地址)>);
3, $readmemb("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
$readmemh
4,$readmemh("<数据文件名(路径地址和文件名)>",<存储器名>);
5, $readmemh("<数据文件名>",<存储器名>,<起始地址(存储器的地址)>);
5, $readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
这里需要注意的是:
1,存储器的空间要足够,如设定[7:0] remember[0:15];即是初始化了一个15个字长为8位的存储器;
2,文件中的数据是一次读到寄存器中的,仿真中通常使用数据文件来做信号源。并且读数据总是从文件起始地址读到结束地址结束,存储器容量要足够;
3,文件应为标准数据文件,如果文件只存放数据就默认第一个数据地址为初始地址;若第一个数据设定
@002
11111111 10101011
@004
10xz0011 1100101x
第0,和第1个数据没有写,系统读进存储器时默认为 xxxx_xxxx;
4,文件若只写文件名需要将文件放置在默认文件路径下,可以通过modelsim->file->changedirectory来更改。
二、写任务
这里写任务用$fopen和$fdisplay两个系统任务完成,其中前者用来得到文件句柄,所谓句柄就是用来打开这个文件的读写通道,这里笔者在modelsim环境下试验了一下一旦用$fopen打开文件就会将文件清空。因此要读文件最好用$readmemb任务,写文件再用$fopen,注意最好新建个新文件来写,以免重要数据被清空。
用$fopen取得想要写文件的句柄handle,然后我们desc=handle|1;(目的最低位置1)这样写文件时trancript框中也同样会输出;
用$fdisplay(desc,"display=%b",remember[k]);通过for语句就可以将原文件中的数据写到另一个文件中去了;
例子如下:
module rewr_test();
reg [7:0]mem[0:15];
integer k,handle2,desc;
initial
begin
handle2=$fopen("file2.dat");
$readmemb("file1.dat",mem);
desc=handle2 |1;
$display("handle2=%b desc=%b",handle2,desc);
for(k=0;k<=15;k=k+1)
begin
$fdisplay(desc,"%b",mem[k]);
end
end
endmodule