无法在verilog的输出文件中写入所有32行输出

时间:2017-04-17 21:34:03

标签: verilog fwrite modelsim

我正在尝试编写一个测试平台,它将从文件读取和评估的所有值输出到文本文件中。但我只能在输出文件中获得1行而不是32行。有人可以解释一下吗?

`timescale 100ns/1ps
module multtest;

reg clk,reset;
reg signed [7:0] a, b;
reg signed [15:0] result,res;
integer fread, fw;
reg [7:0] in_a, in_b;
reg [47:0] in_r;
wire signed[15:0] result1;

mult mult_0 (.clk(clk) , .reset(reset), .A(a), .B(b), .result(result1));

initial 
begin 
 fread = $fopen ("goldenresult","r");
fw = $fopen ("goldresult.txt","w");
clk = 1'b0;
reset = 1'b1;
#200; 
reset = 1'b0;
#200;
reset = 1'b1;
end
always 
#2.5 clk = ~clk; 

//conditon for reset
always @ (reset == 1'b1)
begin
a <= 0;
b <= 0;
result <= 0;
end


always @(posedge clk)

begin

//Verifying the result when testmode = 0  and reset = 0

        if (reset == 1'b0) 
            begin

                while ($fscanf(fread, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, result) != 6) begin end

                    $display ("a = %b, b = %b, result = %b", a, b, result);

                    end
            end

/*always @(posedge clk)
@(negedge reset)

if (reset == 1'b0) 
            begin

                while ($fscanf(fread, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, result) != 6) begin end

 $fwrite(fw, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);

end*/
endmodule

我已经注释掉了应该编写的代码部分。我做错了什么。输出采用以下格式:

a = 10111010,b = 00111011,结果= 0000000000000000

它应该写入所有32行,而只写1.但它正确地显示了modelsim中的输出。

2 个答案:

答案 0 :(得分:0)

这是行fw = $fopen ("goldresult.txt","w");创建用于写入的新文件或将其截断为零长度。因此,在您调用$fwrite(fw, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);函数的情况下,每次重写时都要重写。

要添加新值,您需要使用其他模式fa = $fopen ("goldresult.txt","a+"); a + (用于追加;在文件末尾打开或创建更新)

在代码中看起来像:

fa = $fopen ("goldresult.txt","a+");
$fwrite(fa, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);

并且不要忘记关闭文件$fclose(fa);

答案 1 :(得分:0)

问题在于你正在进行while循环。在while循环行的末尾,您有begin end。这意味着在while循环中发生的唯一事情就是正在测试的条件($fscanf)。您还希望$fwrite位于while循环中,因此您需要在写入后放置end

另一个问题是,您正在测试!= 6,而应该在== 6时继续使用while循环。

您还说过在每次输出后都想要回车,因此您应该使用$fdisplay代替$fwrite。它们之间的唯一区别是包含回车。

while ($fscanf(fread, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, result) == 6) begin
  $fdisplay(fw, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);
end