在 Verilog 中,我正在尝试使用 $readmemb 来读取 .txt 文件,但它只在内存中加载 xxxxx(不关心)
In Verilog, I'm trying to use $readmemb to read .txt file but it only loads xxxxx (dont cares) on memory
我需要将一些原始二进制数据加载到内存中。我读到 $readmemb 可以用于此,甚至还有一种方法可以合成。
因此,我创建了另一个名为 RAM_IN 的模块(它不是测试台模块),并在顶部模块中创建了 "connected"。
在了解 $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
当我模拟时,modelsim 显示我的内存充满了 xxxxxxxxxxxxxxxxx(不在乎),看起来没有向内存加载任何东西。
我不知道我做错了什么。可能不是对 .txt 文件中数字的处置。也许是因为我打算在另一个不是测试台的模块中使用 $readmemb 加载文件?
PD:我做的这个填充内存过程的模拟只是出于实际目的,最终目的是将Top模块设计成一个完整的SoC,我想我会用QSYS来做。但我对此很陌生,所以我还在学习。任何帮助将不胜感激!!!
你确定运行模拟了吗?
您的 TB 代码:
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:
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
和模拟:
我已经解决了这个问题。问题是modelsim找不到.txt文件,我不知道这些文件的预定位置在哪里,但是在网上看,我发现我可以在Ram模块中声明,确切的路径就像这个
initial
begin
$readmemb("C:/altera/15.0/Prueba5/in_ram.txt", in_ram);
end
现在 modelsim 正在加载正确的数据。谢谢大家
将初始化数据文件(例如 "in_ram.txt")的副本粘贴到项目的 ..\simulation\modelsim\ 目录中也为我解决了这个问题。
我遇到了同样的问题。这是由于文件中存在非二进制字符。
最初我的 .txt 文件看起来像我正在阅读的 .txt 文件
然后我删除了所有的“-”并且它起作用了。如果有任何字符打印错误,请检查一次.txt文件。
我需要将一些原始二进制数据加载到内存中。我读到 $readmemb 可以用于此,甚至还有一种方法可以合成。
因此,我创建了另一个名为 RAM_IN 的模块(它不是测试台模块),并在顶部模块中创建了 "connected"。
在了解 $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
当我模拟时,modelsim 显示我的内存充满了 xxxxxxxxxxxxxxxxx(不在乎),看起来没有向内存加载任何东西。
我不知道我做错了什么。可能不是对 .txt 文件中数字的处置。也许是因为我打算在另一个不是测试台的模块中使用 $readmemb 加载文件?
PD:我做的这个填充内存过程的模拟只是出于实际目的,最终目的是将Top模块设计成一个完整的SoC,我想我会用QSYS来做。但我对此很陌生,所以我还在学习。任何帮助将不胜感激!!!
你确定运行模拟了吗?
您的 TB 代码:
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:
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
和模拟:
我已经解决了这个问题。问题是modelsim找不到.txt文件,我不知道这些文件的预定位置在哪里,但是在网上看,我发现我可以在Ram模块中声明,确切的路径就像这个
initial
begin
$readmemb("C:/altera/15.0/Prueba5/in_ram.txt", in_ram);
end
现在 modelsim 正在加载正确的数据。谢谢大家
将初始化数据文件(例如 "in_ram.txt")的副本粘贴到项目的 ..\simulation\modelsim\ 目录中也为我解决了这个问题。
我遇到了同样的问题。这是由于文件中存在非二进制字符。
最初我的 .txt 文件看起来像我正在阅读的 .txt 文件
然后我删除了所有的“-”并且它起作用了。如果有任何字符打印错误,请检查一次.txt文件。