【问题标题】:Not able write all 32 lines of output in the output file in verilog无法在verilog的输出文件中写入所有32行输出
【发布时间】:2017-04-17 21:34:03
【问题描述】:

我正在尝试编写一个测试平台,它将从文件中读取和评估的所有值输出到文本文件中。但我只能在输出文件中得到 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 中正确显示了输出。

【问题讨论】:

    标签: verilog fwrite modelsim


    【解决方案1】:

    这是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);

    【讨论】:

    • fa lien 不起作用,fclose 似乎也不起作用。仅当我关闭 modelsim 时,我才能将输出写入 .txt 文件。此外,输出不是逐行显示,而是在同一行显示。如何让它出现在不同的行上?
    • 请添加所有模块的完整代码,我可以模拟它
    【解决方案2】:

    问题在于您执行 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
    

    【讨论】:

    • 你的方法不起作用。仅当我关闭 modelsim 时,我才能将输出写入 .txt 文件。此外,输出不是逐行显示,而是在同一行显示。如何让它出现在不同的行上?
    • 我进行了更改,以便在存在有效数据“==6”时继续循环并插入回车符。
    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多