我正在为我的CompSci类编写一个verilog模块,这个模块特别是数据内存模块。从结构上和分析上看,我正在查看它,它应该基于我拥有的其他文件而工作,但我不确定为什么这个文件会特别出问题,给我所有的x。希望一双新的眼睛可以帮助我找到我遗漏的错误。提前谢谢。
datamem.v:
module datamem(Ina, Inb, enable, readwrite, dataOut, clk, rst);
input wire [31:0] Ina;
input wire [31:0] Inb;
input wire enable;
input wire readwrite;
input wire clk;
input wire rst;
reg [31:0] memory[0:65535];
output reg [31:0] dataOut;
always @(memory[Ina]) begin
dataOut = memory[Ina];
end
always @(posedge clk) begin
if(1'b1 == readwrite) begin
memory[Ina] = Inb;
end
end
endmoduledatamem_tb.v:
module datamem_tb();
reg [31:0] Ina;
reg [31:0] Inb;
reg enable;
reg readwrite;
reg clk;
reg rst;
wire [31:0] dataOut;
datamem DUT (Ina, Inb, enable, readwrite, dataOut, clk, rst);
initial
begin
Ina <= 32'd0;
Inb <= 32'd0;
enable <= 0;
readwrite <= 0;
#20 Ina <= 32'd1234;
#20 Inb <= 32'd1234;
#20 Ina <= 32'd0517;
#20 Inb <= 32'd10259;
end
always @(Ina or Inb)
#1 $display("| Ina = %d | Inb = %d | dataOut = %d |", Ina, Inb, dataOut);
endmodule发布于 2019-03-08 12:51:38
关于为什么你会得到所有'x的几件事
initial begin
clk = 1'b0;
forever #5 clk = ~clk;
endreadwrite (您在第20行将其设置为0,并且从不更改它)。在不写入的情况下,memory将为的每个元素保留其原始值'x
除此之外,您的模块还存在一些其他问题:
使用隐式敏感列表(而不是对内存使用always @(*))
memory[inA] <= inB)
always @(memory[inA]) $display,以避免计时问题,并且您只需要在测试台中的initial块的开始处调用它(http://referencedesigner.com/tutorials/verilog/verilog_09.php)
rst enable没有连接到任何东西。<内存单元实现的另一个示例可以在这里找到:Data memory unit
https://stackoverflow.com/questions/55056750
复制相似问题