Verilog读写文本数据教程
在进行代码开发时,经常需要通过灌数据的方式来测试模块功能是否正确,有时候甚至不能单单从波形中判断模块功能的正确,还需要将输出的波形数据导入 Matlab等工具进行分析。
因此,学会如何用verilog读入文本以及输出文本是十分必要的。
verilog 读入文本数据
reg [Datawidth-1:0] mem_q_tmp[0:数据长度];
reg [CNT_BIT-1:0] mem_cnt = {CNT_BIT{1'b0}};
initial begin
$readmemh("文件路径",变量名);// h表示按照16进制读入
end
// mem addr
always @(posedge clk)
begin
mem_cnt <= mem_cnt +1;
end
// 将mem中的数据送入信号
always @(posedge clk)
begin
data_i <= mem_i_tmp[mem_cnt];
end
一般处理如上所示,先将文本数据读进一个寄存器搭建的mem,再利用计数依次送入具体信号。
Verilog输出文本
reg [19:0] i = 0;
always@(posedge clk)begin
if(i<16384)
i <= i+1;
else
i<= 0;
end
integer dout_file1; //定义句柄
initial begin
dout_file1=$fopen("目标文件路径"); //打开所创建的文件
if(dout_file1 == 0)begin
$display ("can not open the file!"); //创建文件失败,显示can not open the file!
$stop;
end
end
always @(posedge clk) begin
if(i<1000) //写入1000个clk的sample点
$fdisplay(dout_file1,"%d",$signed(o_data[Datawidth-1:0])); //保存有符号数据
else if(i>=1000)
$fclose(dout_file1);
end
需要注意的是,输出文本必须执行到 $fclose(dout_file1); 的条件才会真的写进目标文本中。