Чтение и запись массива из txt в Verilog - PullRequest
2 голосов
/ 07 марта 2019

Прежде всего я хочу сказать, что я выполняю симуляцию в ADS (Advanced Design System 2017) через модель Verilog, скомпилированную в ModelSim.

Моя цель - загрузить данные из файла .txt в тестовую среду в качестве входных данных для запуска симуляции, а затем сохранить результаты этой симуляции в другом файле .txt.

Вот содержимое входного тестового файла .txt с именем "param.txt":

1
2
3
4
5
6
7
8
9
10

А вот мой код испытательного стенда Verilog:

`include "disciplines.vams"


module resistor(p,n);
electrical p,n;
parameter real R=50.0;
integer file;
integer out;
real pwm_A[0:50];
integer i;
integer j=1;


analog begin

    @(initial_step) // Initial Conditions
    begin


////////////// Read

file=$fopen("param.txt","r");

    if (file)  $display("File was opened successfully : %0d", file);
    else       $display("File was NOT opened successfully : %0d", file);

    for (i=1; i<50; i=i+1) begin  
        pwm_A[i]=$fscanf(file,"%d",j);
        j = j+1;
    end



////////////// Write


out=$fopen("out.txt","w");

    for (i=1; i<=15; i=i+1) begin  

        $fwrite(out,"%d\n",pwm_A[i]);

    end

// Trying to manually display data
$fdisplay(out,123);


$fclose(file);
$fclose(out);


end

// Simulation (doesnt matter)
V(p,n) <+ R * I(p,n);


end
endmodule

В журнале симуляции нет ошибок или предупреждений:

File was opened successfully : -32

Но выходной файл .txt с именем "out.txt" генерирует это:

1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
123 

Вместо исходных данных.

Заметно, что введенное вручную значение «123» не имеет проблем с записью, но остальные данные - «0» или «1».

Может кто-нибудь заметит проблему?

Заранее спасибо.

1 Ответ

3 голосов
/ 07 марта 2019

Эта строка здесь

pwm_A[i]=$fscanf(file,"%d",j);

должна читаться как

$fscanf(file,"%d",pwm_A[i]);

Системная функция $fscanf противоположна $fdisplay - функция выводит впеременные в своем списке аргументов.Он возвращает количество элементов, успешно прочитанных из строки.Это будет (надеюсь) 1 для первых десяти строк и будет 0 для следующих строк.Итак, вы должны действительно проверить это число и сделать что-то, если это не то, что вы ожидаете, например:

count = $fscanf(file,"%d",pwm_A[i]);
if (count != 1) 
  // whatever
...