我们在verilog中有一个简单的内存模块,在Windows 10 64位上的xilinx ISE设计套件12.4。这是模块的签名:
module Memory(
input [23:0] Addr,
input Length, //byte:0 vs. word:1
input Rd,
input Wr,
input Enable,
output reg Rdy,
input [31:0] DataIn,
output reg [31:0] DataOut
);
这是内存定义行:reg [7:0] mem [0:16777215];
问题是,当我们尝试通过仿真测试模块时,当我们对小地址执行读取或写入操作时,模拟会停滞不前。例如,0000 0000 1011 1010 1011 1110卡住,而1111 1111 1111 1010 1011 1110则没卡。卡住我的意思是,它不会给出任何错误或任何错误,只是停止做任何事情。
此外,在模块中,我们在初始块中将数字写入小地址(例如3);模拟也坚持了它的第一次操作。
当我们检查模拟中的内存但是查看>内存时,我们可以看到整个内存已初始化。甚至地址3也被填满,即使很难,也会导致模拟卡住。
这是内存代码:
`timescale 1ns / 1ps
module Memory(
input [23:0] Addr,
input Length, //byte:0 vs. word:1
input Rd,
input Wr,
input Enable,
output reg Rdy,
input [31:0] DataIn,
output reg [31:0] DataOut
);
localparam Tmem= 8; //8 ns
localparam Td = 0.2; //200 ps
reg [7:0] mem [0:16777215];
//reg [7:0] mem [0:65536];
initial
begin
Rdy<=1'b1;
//mem[3]=8'b10101010;
end
always @(posedge Wr or posedge Rd or posedge Rdy)
begin
if(Enable && Rdy && Wr)
begin
Rdy<=#Td 1'b0;
if(Length)
begin
mem[(Addr&24'b111111111111111111111100)+3] <=DataIn[31:24];
mem[(Addr&24'b111111111111111111111100)+2] <=DataIn[23:16];
mem[(Addr&24'b111111111111111111111100)+1] <=DataIn[15:8];
mem[Addr&24'b111111111111111111111100 ] <=DataIn[7:0];
end
else if(!Length)
begin
mem[Addr]<=DataIn[7:0];
end
Rdy<=#Tmem 1'b1;
end
else if(Enable && Rdy && Rd)
begin
Rdy<=#Td 1'b0;
if(Length)
begin
DataOut[31:0]<=#Tmem {mem[(Addr&24'b111111111111111111111100)+3],mem[(Addr&24'b111111111111111111111100)+2],mem[(Addr&24'b111111111111111111111100)+1],mem[(Addr&24'b111111111111111111111100)]};
end
else if(!Length)
begin
DataOut[31:0]<=#Tmem {24'b0,mem[Addr]};
end
Rdy<=#Tmem 1'b1;
end
end
endmodule
这是模拟: https://codepaste.net/zxtsmo 模拟卡住了十六进制地址&#34; CAFE&#34;和&#34; BABE&#34;,与长度变量无关。