2017-04-17 10 views
0

ファイルから読み込んで評価したすべての値をテキストファイルに出力するテストベンチを作成しようとしています。しかし、32行ではなく、出力ファイルで1行しか得られません。誰かが光を当てることはできますか?Verilogの出力ファイルに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 

私は、書かなければならなかったコードの部分をコメントアウトしました。私は間違ったことをしていますか?出力は次の形式になります。そのすべての32行を書くことになったが、それは正しくModelSimの中に出力を表示しますが、代わりにのみ1を書き込み

= 10111010、B = 00111011、結果= 0000000000000000

答えて

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+");+(アペンド用に使用しています。オープンまたはファイルの終わりで更新するために作成)を追加するには、それがどのように見えるコードで

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

と問題はあなたがwhileループをやっている方法であるファイルに$fclose(fa);

+0

fa lienは動作しておらず、fcloseも動作していないようです。私はモデルファイルを閉じる場合に限り、出力を.txtファイルに書き出すことができます。また、出力は行ごとに表示されず、同じ行に表示されます。どのように私はそれを別の行に表示させるのですか? – JUBER

+0

私はそれをシミュレートできるすべてのモジュールの完全なコードを追加してください – Roman

0

を閉じることを忘れないでください。 whileループの最後にはbegin endがあります。これは、whileループで発生する唯一の事柄は、テストされている状態($fscanf)にあることを意味します。また、$fwriteをwhileループに入れたいので、書き込み後にendを置く必要があります。

もう1つの問題は、のテストで、代わりに== 6のwhileループを続ける必要がある場合です。

また、出力ごとに送料が戻ってくると言いましたので、$fwriteの代わりに$fdisplayを使用する必要があります。それらの間の唯一の違いは、キャリッジリターンの包含です。

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 
+0

あなたのメソッドは動作しません。私はモデルファイルを閉じる場合に限り、出力を.txtファイルに書き出すことができます。また、出力は行ごとに表示されず、同じ行に表示されます。どのように私はそれを別の行に表示させるのですか? – JUBER

+0

有効なデータが "== 6"で、キャリッジリターンを挿入する間にループを継続するために変更を加えました。 –

関連する問題