VCS полностью игнорирует readmemb, не загруженный

Я пытаюсь написать простой тестовый стенд, используя txt-файл для чтения чисел в моем тестовом стенде.

У меня есть следующий тестовый стенд

temp_tb.v

module temp_tb();

logic clk;
logic rst;
logic [0:31] data [639:0];
logic output_valid;
logic [0:31] output_data_r [63:0];
logic [0:31] output_data_i [63:0];

top_level t0(
        .clk(clk),
        .rst(rst),
        .data(data),
        .output_valid(output_valid),
        .output_data_r(output_data_r),
        .output_data_i(output_data_i));

// set up clock
// tests
initial begin
    $readmemb("song.mem", data);
    // put your tests here
    $vcdpluson;
    
    
    rst = 1'b0;
    clk = 1'b0;
    #100
    clk = 1'b1;
    #100
    clk = 1'b0;
    #100
    clk = 1'b1;
    #100
    rst = 1'b1;
    clk = 1'b0;
    #100
    clk = 1'b1;
    #100
    clk = 1'b0;
    #100
    clk = 1'b1;
    #100
    rst = 1'b0;



    for (int i = 0; i < 999; i++) begin
        clk = ~clk;
        #100;
    end
    $finish;
end
endmodule

И файл кода song.mem, который читается

00000000000000000000010000000000
00000000000000000000010000000000
00000000000000000000010000000000
00000000000000000000010000000000
00000000000000000000010000000000
00000000000000000000010000000000
00000000000000000000010000000000
// etc etc etc etc

Однако, когда я запускаю этот тестовый стенд с помощью VCS, он не выдает никаких ошибок, однако форма сигнала выглядит следующим образом.

Не загружено

Все файлы кода и память находятся в этой папке.

Раньше у меня была неправильная ширина логики данных, и она отображалась в журнале. Однако я не вижу ошибок в журнале прямо сейчас. Возможно ли, что это должно быть [31:0], а не [0:31] Я видел это в другом месте, но не уверен, что это значит. Цель состоит в том, чтобы иметь 640 целых чисел.


person CalebK    schedule 11.03.2021    source источник


Ответы (1)


Вы уверены, что ваша симуляция началась? [31:0], [0:31] не имеет значения, даже если размеры неправильные, он загрузится.

Упакованный размер расширяется нулями, если переменная шире, чем данные файла, но память не загружается, если данные файла шире, чем переменная.

Если данные содержат больше строк, чем файл, то он заполнит начальные записи данными из файла, а остальные сохранят «xxxxx». Если в данных меньше строк, переменная будет заполнена начальными строками в файле.

Вы можете $display что-то после $readmemb.

Это покажет содержимое памяти в журнале после загрузки

    $readmemb("song.mem", data);
    foreach(data[i]) $display("%h", data[i]);
person Bob    schedule 11.03.2021