ROM 4kx8 verilog,使用$ readmemb读取文件时出现问题

问题描述

我正在尝试在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节从文件加载内存阵列数据

@和数字之间不允许有空格。