2017-04-17 15 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을 기록

A = 10111010, B = 00,111,011, 결과 = 0000000000000000

.

답변

0

줄이 fw = $fopen ("goldresult.txt","w");입니다. 쓰기 용으로 새 파일을 만들거나 길이를 0으로 자릅니다. 그래서 귀하의 경우에는 $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);

+0

fa lien이 작동하지 않고 fclose가 작동하지 않는 것 같습니다. 내가 모델을 닫을 경우에만 출력을 .txt 파일에 기록 할 수 있습니다. 또한 출력은 한 줄씩 표시되지 않고 같은 줄에 표시됩니다. 어떻게 다른 줄에 나타나게합니까? – JUBER

+0

모든 모듈의 전체 코드를 추가하십시오. 시뮬레이션 할 수 있습니다. – Roman

0

문제는 당신이 while 루프를 수행하는 방법에를 닫습니다 잊지 마세요. while 회선 끝 부분에 begin end이 있습니다. 즉, while 루프에서 발생하는 유일한 작업은 테스트중인 조건입니다 ($fscanf). $fwrite을 while 루프에 넣기를 원하면 쓰기 후에 end을 입력해야합니다.

다른 문제는 을 테스트 중이므로 대신 == 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"이고 캐리지 리턴을 삽입하는 동안 루프를 계속 변경했습니다. –