我要设计一个加法器、程序计数器、内存、时钟和测试台模块。
我假设从测试台初始化,每个内存地址都用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("所做的
如果使用单个首字母,事情会变得简单得多。我经常通过在它们之间放置延迟来分割部分,其中:
-
让我更容易在模拟波形中看到发生了什么。
-
确保代码确实是按顺序执行的。
示例:
...
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是否给出错误消息,因为模拟器通常需要一个特殊的路径来查找文件。