verilog内建提供了一些系统函数用于文件读写,常用的有$readmemh(),$readmemb(),$fopen(),$fdisplay();
$readmemh/$readmemb函数通常用于对rom的行为模型建模,向rom中加载用户程序。
用法如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 reg [31:0] mem[2047:0]; 2 initial 3 begin 4 $readmemh("rom.dat",mem); 5 end
最近做点东西东西需要做一下进制转换,使用上面函数就可以轻松搞定,$readmemh/$readmemb用于文件读取,$fdisplay用于写文件,
通常在写文件之前需要用$fopen打开一个文件句柄。一个16进制文件转2进制文件的代码如下:
1 module tb(); 2 reg [31:0] mem[2047:0]; 3 integer i,fd; 4 5 initial 6 begin 7 i=0; 8 $readmemh("rom.dat",mem); 9 fd=$fopen("romb.dat"); 10 for(i=0;i<2048;i=i+1) 11 begin 12 $fdisplay(fd,"%b",mem[i]); 13 end 14 end 15 16 endmodule
如果是2转16进制的话(rom.dat的内容为2进制),只需将$fdisplay(fd,"%b",mem[i]);变成->$fdisplay(fd,"%h",mem[i]);是不是很方便?比用C方便多了,也很直观。