В Verilog я пытаюсь использовать $readmemb для чтения файла .txt, но он загружает в память только xxxxx (все равно)

Мне нужно загрузить память с некоторыми данными, изначально в двоичном формате. Я читал, что для этого можно использовать $readmemb, и есть даже способ сделать его синтезируемым.

Итак, я создал еще один модуль с именем RAM_IN (который не является модулем тестового стенда) и «подключил» его к верхнему модулю.

Прежде чем узнать о $readmemb, я использовал этот код:

initial
begin
in_ram [0] <= 32'b11111111_000000000000000000000000; 
in_ram [1] <= 32'b10010111_000000000000000000000000;
in_ram [2] <= 32'b00110110_000000000000000000000000;
in_ram [3] <= 32'b00111110_000000000000000000000000;
in_ram [4] <= 32'b00111111_000000000000000000000000;
in_ram [5] <= 32'b00111110_000000000000000000000000;
end

Но мне слишком утомительно писать 100 таких чисел, поэтому я реализовал $readmemb следующим образом:

module RAM_IN (pix_val, indx);


input [0:5] indx;
output [31:0] pix_val;


reg [31:0] pix_val;
reg [31:0] in_ram [0:4];

always @ (indx)
pix_val = in_ram [indx];

initial
begin
$readmemb("in_ram.txt", in_ram);
end

Целью чтения этого файла является начальная загрузка 100 двоичных значений (которые имитируют интенсивность пикселей изображения 10x10) одно за другим в верхний модуль (который будет обрабатывать и выдавать результат позже...)

Я создал файл .txt, который выглядит точно так же

11111111000000000000000000000000
10010111000000000000000000000000
00110110000000000000000000000000
00111110000000000000000000000000
00111111000000000000000000000000 

Когда я имитирую, modelim показывает мне память, заполненную xxxxxxxxxxxxxxxxx (все равно), похоже, что ничего не загружается в память.

Я не знаю, что я делаю неправильно. Скорее всего, это не расположение номеров в файле .txt. Может быть, потому что я собираюсь загрузить файл с $readmemb в другой модуль, который не является тестовым стендом?

PD: Моделирование этого процесса заполнения памяти я делаю только для практических целей, конечная цель состоит в том, чтобы поместить дизайн модуля Top в полноценную SoC, что, я думаю, я сделаю с помощью QSYS. Но я очень новичок в этом, поэтому я все еще учусь. Любая помощь будет высоко ценится!!!


person sujeto1    schedule 10.05.2016    source источник
comment
Мне он кажется нормальным и работает тоже нормально. http://www.edaplayground.com/x/5kxx   -  person Matthew Taylor    schedule 10.05.2016
comment
@hexafraction Я бы сказал, что такая нумерация воспоминаний довольно условна: reg [31:0] in_ram [0:4];.   -  person Matthew Taylor    schedule 10.05.2016


Ответы (4)


Вы уверены, что запускаете симуляцию?

Ваш код с ТБ:

module RAM_IN (pix_val, indx);

input [0:5] indx;
output [31:0] pix_val;

reg [31:0] pix_val;
reg [31:0] in_ram [0:4];

always @ (indx)
  pix_val = in_ram [indx];

initial
begin
  $readmemb("in_ram.txt", in_ram);
end

endmodule

module tb;
reg [0:5] indx; 
wire [31:0] pix_val;

RAM_IN ram_in(pix_val, indx);

initial
begin
  indx = 'b0;
  $monitor ($realtime, " Read Data = %0b" ,pix_val);
  repeat(4)
  begin
    #10;
    indx = indx + 1'd1;
  end
  $finish;
end
endmodule

С тем же in_ram.txt.

Квестасим:

QuestaSim-64 qverilog 10.4 Compiler 2014.12 Dec  2 2014
Start time: 18:27:01 on May 10,2016
qverilog me.v 
-- Compiling module RAM_IN
-- Compiling module tb

Top level modules:
    tb
Reading pref.tcl

# 10.4

# vsim -lib work tb -c -do "run -all; quit -f" -appendlog -l qverilog.log -vopt 
# ** Note: (vsim-3812) Design is being optimized...
# //  Questa Sim-64
# //  Version 10.4 linux_x86_64 Dec  2 2014
# //
# //  Copyright 1991-2014 Mentor Graphics Corporation
# //  All Rights Reserved.
# //
# //  THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION
# //  WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS
# //  LICENSORS AND IS SUBJECT TO LICENSE TERMS.
# //  THIS DOCUMENT CONTAINS TRADE SECRETS AND COMMERCIAL OR FINANCIAL
# //  INFORMATION THAT ARE PRIVILEGED, CONFIDENTIAL, AND EXEMPT FROM
# //  DISCLOSURE UNDER THE FREEDOM OF INFORMATION ACT, 5 U.S.C. SECTION 552.
# //  FURTHERMORE, THIS INFORMATION IS PROHIBITED FROM DISCLOSURE UNDER
# //  THE TRADE SECRETS ACT, 18 U.S.C. SECTION 1905.
# //
# Loading work.tb(fast)
# run -all
# 0 Read Data = 11111111000000000000000000000000
# 10 Read Data = 10010111000000000000000000000000
# 20 Read Data = 110110000000000000000000000000
# 30 Read Data = 111110000000000000000000000000
# ** Note: $finish    : me.v(34)
#    Time: 40 ns  Iteration: 0  Instance: /tb
# End time: 18:27:02 on May 10,2016, Elapsed time: 0:00:01
# Errors: 0, Warnings: 0

И моделирование:

введите здесь описание изображения

person Prakash Darji    schedule 10.05.2016
comment
друг, вы берете файл $readmemb в качестве верхнего модуля и применяете к нему тестовый стенд. Проблема в том, что мой файл $readmemb не является топовым модулем, он управляется индексом регистра и тестовый стенд идет к топовому модулю. По какой-то причине, если я загружаю один за другим, он работает, но если использовать инструкцию $readmemb, он загружает xxxxxxxxxxxxxxxx. Как вы думаете, если я опубликую весь код, вы сможете помочь мне в этом? Спасибо - person sujeto1; 16.05.2016

Я уже исправил это. Проблема в том, что modelsim не смог найти файл .txt, я не знаю, где может быть предопределенное местоположение для таких файлов, но, посмотрев в Интернете, я обнаружил, что могу объявить в модуле Ram точный путь, например это

initial
begin
$readmemb("C:/altera/15.0/Prueba5/in_ram.txt", in_ram);
end

Теперь modelsim загружает правильные данные. Спасибо всем.

person sujeto1    schedule 23.06.2016

Вставка копии файла данных инициализации (например, "in_ram.txt") в каталог проекта ..\simulation\modelsim\ также решила эту проблему для меня.

person isaiah    schedule 06.05.2020

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

Первоначально мой файл .txt выглядел как файл .txt, который я читаю.

Файл .txt, который я читаю

Потом удалил все - и заработало. Пожалуйста, проверьте файл .txt один раз, если какой-либо символ опечатан.

person Neel Joshi    schedule 04.03.2021