问题描述
我正在尝试在Verilog中实现4kx8 ROM。我使用$readmemb
来读取一个具有ROM初始值的.list文件。问题是,在.list文件中,我为这样的地址添加了一个“跳转”:
0000_0001
0000_0010
0000_0011
0000_0100
@ 55
0000_0101
0000_0110
0000_0111
@ 60
0000_1000
0000_1001
@ 100
0000_1010
当我读取四个初始值时,没关系。但是,当我读取55、56、57、60、61和100地址时,监视器将显示xxxxxxxx。我尝试用十六进制,二进制和十进制写地址,但是没有任何反应。那是我的模块和测试台:
module ROMmemory(input [11:0]direccion,output reg [7:0]salida);
reg [7:0] memoria [0:4096];
initial begin
$readmemb("rom2.list",memoria);
end
always @ (*) begin
salida<=memoria[direccion];
end
endmodule
测试台:
reg [11:0]direccion;
wire [7:0]valores;
ROMmemory RM(direccion,valores);
initial begin
$display("\n");
$display("ROM 4kx8");
$display("address | values");
$display("-------------------|---");
$monitor("%b | %b",direccion,valores);
#180 direccion=1;
#1 direccion=2;
#1 direccion=3;
#1 direccion='d30;
#1 direccion='d31;
#1 direccion='d85;
#1 direccion=85;
#1 direccion='h55;
#1 direccion=61;
#10 $finish;
end
之后我启动了180次,因为我在ROM之前还有其他模块。
ROM 4kx8
address | values
-------------|---
VCD info: dumpfile Ejercicio1_tb.vcd opened for output.
000000000000 | 00000001
000000000001 | 00000010
000000000010 | 00000011
000000000011 | 00000100
000000011110 | xxxxxxxx
000000011111 | xxxxxxxx
000001010101 | xxxxxxxx
000000111101 | xxxxxxxx
解决方法
我的模拟器生成警告消息:
xmsim: *W,RMEMSYN: $readmem error: invalid syntax in file "rom2.list" at line 5.
这是一行:
@ 55
当我删除@
和55
之间的空格时,警告消失了:
0000_0001
0000_0010
0000_0011
0000_0100
@55
0000_0101
0000_0110
0000_0111
@60
0000_1000
0000_1001
@100
0000_1010
现在,我在x
上没有'h55
:
000001010101 | 00000101
请参阅IEEE Std 1800-2017,第21.4节从文件加载内存阵列数据:
@和数字之间不允许有空格。