testbench——文件读入输出

注:仿真工具为ISE自带simulation

1.读入.txt中的文件

待读入文件为photo.txt,位于所建工程文件夹中。

代码:

integer cnt,i;
reg [7:0] mem[31:0];
reg [5:0] address;
integer fp;
initial
begin
	fp = $fopen("photo.txt","rb");
	address = 0;
    while(!$feof(fp))  begin 
        for(i=0; i<16; i=i+1)  begin
            cnt = $fscanf (fp, "%d",mem[address]);
            address=address+1;
        end
    end
    $fclose(fp);
end
注释:

使用句柄fp定位文件之后操作即可;

代码中i < 16的值原则上可以为任意值,一般小于文件中数据总数就好了,因为有 while(!$feof(fp)) 在控制;

以二进制方式读入的;

待读入数据:


结果图:



另外一种写法

reg [7:0] mem[31:0];
initial
begin
    $readmemh("photo.txt",mem);
end
注:$readmemh和$readmemb分别用来读入源文件为16进制和2进制的文件

结果图:


2.写出.txt文件

代码:

integer fp_write;
reg [5:0] write_address;
initial
begin
	fp_write =  $fopen("output.txt");
	write_address = 0;
	while(write_address != 32)
	begin
		$fwrite(fp_write, "%d ", mem[write_address]);
		write_address = write_address + 1;
		if(write_address%8 == 0) $fwrite(fp_write, "\n");
	end
	$fclose(fp_write);
end
注:

if(write_address%8 == 0) $fwrite(fp_write, "\n"); 为了给文件中加入换行

结果:


整体代码:

`timescale 1 ns / 1 ps

module testbench;

reg clk, rst, start;

initial begin 
    clk = 0;
    forever #5 clk = ~clk;
end

initial begin
    rst = 0;
	#8 rst = 1;
end

initial begin
    start = 0;
    #502 start = 1;
end

integer cnt,i;
reg [7:0] mem[31:0];
reg [5:0] address;
integer fp;
initial
begin
	fp = $fopen("photo.txt","rb");
	address = 0;
    while(!$feof(fp))  begin 
        for(i=0; i<16; i=i+1)  begin
            cnt = $fscanf (fp, "%d",mem[address]);
            address=address+1;
        end
    end
    $fclose(fp);
end

integer fp_write;
reg [5:0] write_address;
initial
begin
	fp_write =  $fopen("output.txt");
	write_address = 0;
	while(write_address != 32)
	begin
		$fwrite(fp_write, "%d ", mem[write_address]);
		write_address = write_address + 1;
		if(write_address%8 == 0) $fwrite(fp_write, "\n");
	end
	$fclose(fp_write);
end

endmodule





  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在SystemVerilog/Verilogtestbench中,可以使用文件读取操作来读取文件中的数据。以下是一个示例代码: ```systemverilog module testbench; reg [7:0] data; reg clk; reg reset; reg enable; reg file_read_done; reg [7:0] file_data; // 定义文件句柄 file file_handle; // 在initial块中打开文件 initial begin // 打开文件 file_handle = $fopen("data.txt", "r"); // 检查文件是否成功打开 if (!file_handle) begin $display("Error opening file"); $finish; end end // 在always块中进行文件读取操作 always @(posedge clk) begin if (reset) begin // 重置文件指针 $fseek(file_handle, 0, "SEEK_SET"); file_read_done <= 0; end else if (enable && !file_read_done) begin // 读取文件中的数据 if (!$feof(file_handle)) begin $fscanf(file_handle, "%h", file_data); file_read_done <= 1; end else begin $display("End of file reached"); $fclose(file_handle); $finish; end end end // 在initial块中模拟时钟和其他信号 initial begin clk = 0; reset = 1; enable = 0; // 模拟时钟 forever begin #5 clk = ~clk; end end // 在initial块中输出读取到的数据 initial begin // 等待文件读取完成 @(posedge clk) disable iff (!file_read_done); // 输出读取到的数据 $display("Read data: %h", file_data); // 结束仿真 $finish; end endmodule ``` 上述代码中,首先在initial块中打开文件,并检查文件是否成功打开。然后,在always块中进行文件读取操作。在每个时钟上升沿时,检查是否需要进行文件读取操作,并根据文件指针的位置读取文件中的数据。读取到数据后,将其存储在file_data变量中,并设置file_read_done信号为1。当文件读取完成时,关闭文件,并结束仿真。 请注意,上述代码中使用的文件名为"data.txt",你可以根据实际情况修改文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值