显示一个波形
代码如下。
其中有一处重要的地方要说一下。当最后一个时钟沿到来时,data被赋值为文件中最后一个数值,count被非阻塞赋值为自增一,接下去打印的count值是赋值前的值。然后判断是文件尾了,跳出while循环,打印count值,注意,这个时候打印的还是赋值前的count!所以我加一了!
`timescale 1ns/1ns
module file_operation_tb;
reg clk_50M;
reg signed [12:0] data; //因为后面要以%d的格式输出,所以必须说明符号
reg unsigned [31:0] count;
integer fp;
initial begin
clk_50M = 1'b0;
data = 13'd0;
count = 32'd0;
end
always #10 clk_50M = ~clk_50M;
initial begin
#100
fp = $fopen("../../../testbench/sine.txt", "r"); //如果打开文件成功的话,fp会有一个位被赋值为1;如果打开失败,就会为0
if(!(|fp)) begin
$display("cannot open file\n");
#100
$stop; //延时100ns后结束仿真
end
else begin
$display("reading file...\n");
while(!($feof(fp))) begin
@(posedge clk_50M) begin
$fscanf(fp, "%d", data);
count <= count + 32'd1;
$display("%d %d", data, count);
end
end
$display("done reading\ndata size is %d\n", count + 1); //这里很重要!
$fclose(fp);
#500
$stop;
end
end
endmodule
仿真波形如下:
显示多个波形
代码如下:
`timescale 1ns/1ns
module file_operation_tb;
reg clk_50M;
reg signed [12:0] data;
reg unsigned [31:0] count;
integer fp;
wire cmp_out;
reg unsigned [31:0] wave_cnt;
initial begin
clk_50M = 1'b0;
data = 13'd0;
count = 32'd0;
wave_cnt = 32'd0;
end
always #10 clk_50M = ~clk_50M;
initial begin
#100
fp = $fopen("../../../testbench/sine.txt", "r");
if(!(|fp)) begin
$display("cannot open file\n");
#100
$stop;
end
else begin
while(wave_cnt < 32'd10) begin
$display("reading file...\n");
while(!($feof(fp))) begin
@(posedge clk_50M) begin
$fscanf(fp, "%d", data);
count <= count + 32'd1;
//$display("%d %d", data, count);
end
end
$display("done reading: round %d\n", wave_cnt + 1);
$fseek(fp, 0, 0); %定位到文件头,第二个参数为位置(0表示文件头),第三个参数为0表示定位到第二个参数表示的位置
wave_cnt = wave_cnt + 1;
end
$fclose(fp);
#500
$stop;
end
end
endmodule
仿真波形如下:
参考链接
1、https://blog.csdn.net/baijingdong/article/details/8037891
2、https://blog.csdn.net/zhenzhen90/article/details/36189947?utm_source=blogxgwz1
3、https://www.eefocus.com/guozhiyang/blog/15-03/311034_f817b.html