在Verilog中实现存储器、程序计数器和加法器.对我的输出感到困惑



我要设计一个加法器、程序计数器、内存、时钟和测试台模块。

我假设从测试台初始化,每个内存地址都用0,然后将我拥有的与我的程序位于同一目录中的.hex文件加载到内存中。文本文件如下所示:

"。。。…

20042000

000d2820

0c000013

……";

我只是在将text.hex文件加载到内存时遇到问题。这是我的代码:

module testbench; //create the testbench 
    instruction_memory memory();
    integer i;
    initial begin
    for(i=0; i<2048; i = i+1) begin
    memory.mem[i] = 0;
                              end
    end
        initial begin
        $writememh("text.hex",memory.mem);
        end
    integer m;
        initial begin
        for(m=0; m<2048; m = m+1) begin
        $display(memory.mem[m]);
        $display(m);
                                  end
        end    
endmodule //end the testbench
module instruction_memory(); // creating the module that 
                            //simulates the instruction //memory
    reg[31:0]mem[0:2047];
endmodule //ending the instruction memory module
module clock(); //starting the clock module
endmodule //ending the clock module
module pc(); //starting the program counter module
endmodule // ending the program counter module
module adder();
endmodule // ending the adder module

当我运行它时,我的输出如下:

0
1
0
2
0
3
...
...
0
2047

为什么它返回0而不是"0";000d2820";还是其他词?

所以我做了一件事。我用0初始化了内存,但我似乎无法将文件读入其中。我该怎么做?

编辑:这是我现在的代码:

module testbench; //create the testbench 
    instruction_memory memory();
    integer i;
        initial begin
        for(i=0; i<2048; i = i+1) begin
        memory.mem[i] = 0;
                                  end
        end
    initial begin
    #100;
    end
    integer n;
        initial begin
        for(n=0; n<2048; n = n+1) begin
        $display(memory.mem[n]);
        $display(n);
                                  end
        end
    initial begin
    #100;
    end
    initial begin
        $readmemh("C:\Users\19724\Desktop\spring2020\DL\programs\program3\text.hex",memory.mem);
    end 
    initial begin
    #100;
    end
    integer m;
        initial begin
        for(m=0; m<2048; m = m+1) begin
        $display(memory.mem[m]);
        $display(m);
                                  end
        end    
endmodule //end the testbench
module instruction_memory(); // creating                                                            //the module that 
                            //simulates the instruction //memory
    reg[31:0]mem[0:2047];

endmodule //ending the instruction memory module

此代码重复与上面^..相同的输出。。

0
1
0
2
..
..
0
2047

除了两次现在我有两个循环在我初始化为零之后显示输出;读取十六进制文件;我引用了这句话,因为出于某种原因,即使我写了绝对路径,它也不起作用。有人知道为什么它不会读取我的十六进制文件吗?

以下行创建一个名为text.hex:的输出文件

    $writememh("text.hex",memory.mem);

您需要使用$readmemh来读取输入文件:

    $readmemh("text.hex", memory.mem);

请参阅免费的IEEE Std 1800-2012,章节21.4从文件加载内存阵列数据

此外,正如注释中所指出的,您的第一个initial块为每个内存位置分配0。使用$readmemh的第二个initial块与第一个块冲突。我的猜测是,你只需要保持第二块。

那么我如何防止它们并行操作呢
如何用零初始化指令内存,然后从text.hex文件初始化每个有值的地址,而不并行执行此操作
我清除内存是什么意思?你指的是当我用零初始化内存时
至于"将文件读入其中",我想这就是我使用"writememh("text.hex",memory.mem("所做的

如果使用单个首字母,事情会变得简单得多。我经常通过在它们之间放置延迟来分割部分,其中:

  1. 让我更容易在模拟波形中看到发生了什么。

  2. 确保代码确实是按顺序执行的。

示例:

...
initial
begin
   for(i=0; i<2048; i = i+1) begin
      memory.mem[i] = 0;
   #1000;
   $readmemh("text.hex",memory.mem);
   #1000;
   for(m=0; m<2048; m = m+1)
     $display(memory.mem[m]);
  $display(m);
end
....

检查您的模拟日志,查看$readmemh是否给出错误消息,因为模拟器通常需要一个特殊的路径来查找文件。

最新更新