TestBench不会执行实例模块

时间:2016-11-06 14:35:53

标签: verilog test-bench

我是verilog的新手,我正在尝试构建一个模拟直接映射缓存的verilog代码。在编译过程中,每件事情都运行良好,但测试平台模块似乎没有执行“内存”#34;模块(实例)。输出变量总是未知的,除了我在测试平台本身分配值的那些,甚至是我在主模块中填充了数据的RAM寄存器。您认为这似乎是什么问题? 提前致谢 这是实例模块代码:

Comparator<String>

这是一个模块,我将要填充RAM的数据写入文件中:

module Memory (outdata,address,indata,RE,WE);
input [31:0]address;
input [31:0]indata;
output reg [31:0]outdata;
input RE,WE;
//Declared the inputs and outputs
reg[31:0]RAM[0:1023];
reg[19:0]tag[0:1023];
reg valid [0:1023];
reg [31:0]Data[0:1023];
//Defined the registers that were supposed to be modules
//Divided the cache into tag,data and valid
//Starting thr Reading Process
always @ (RE or WE)
begin
  if (RE==1)
  begin
    if (address[31:12] == tag [address[11:2]])
    begin
      if (valid[address[11:2]] ==1)
      begin
        outdata = Data[address[11:2]];
      end
      else if (valid[address[11:2]] ==0) //Read from RAM
      begin
        Data[address[11:2]] = RAM [address];
        valid[address[11:2]] =1;
        outdata = Data[address[11:2]];
      end
    end
    if (address[31:12] != tag [address[11:2]])
    begin
      Data[address[11:2]] <= RAM [address];
      tag[address[11:2]] <= address [31:12];
      valid[address[11:2]] =1;
      outdata <= Data[address[11:2]];
    end
  end
  //Starting the Writing Process
  else if (WE==1)
  begin
    if(address[31:12]==tag[address[11:2]]) //Hit
    begin
      Data[address[11:2]]<=indata;
      valid[address[11:2]] =1;
      RAM[address]<=indata;
    end
    if (address[31:12] != tag [address[11:2]])//Miss
    begin
      RAM[address]<=indata;
    end
  end
end
initial
begin 
  $readmemb("D:\Verilog Project Data/MyMemory.txt",RAM);
end
endmodule
// Filling up the RAM

TestBench模块:

module WritingToMemory;
reg[31:0]i;
integer file;
initial
begin
  i=0;
  file = $fopen("D:\Verilog Project Data/MyMemory.txt");
  $fmonitor(file,"%b\n",i);
  for(i=0; i<1024; i=i+1)
  begin
    #1
    i=i;
  end
end
endmodule

1 个答案:

答案 0 :(得分:2)

你确定你模拟了吗?它不会在当前状态下编译。 下次你可以缩进你发布的代码吗?

提出问题,有三个问题:

1)只初始化RAM,Tag和Valid数组都是x。你的硬件在真正的芯片中是完全不可预测的。 在使用缓存之前,必须初始化标记和有效位 。现在你知道了为什么;)

2)您的测试平台实际上只生成一个事务。你写道:

#10
RE = 1;
address = 0;
#10
RE=1;
address =0;
#10
RE=1;
address=0;

由于在第一次分配后RE和地址都没有变化,always @ (RE or WE)语句永远不会再被触发。 你需要让RE回到0或地址变化。或者,更有可能在实际缓存的行为中引入时钟。

3)always @ (RE or WE)也不正确,因为地址不是敏感度列表的一部分。这将导致内存仅在激活选通时锁存地址,这在您的实现中可能或不正确。这是引入时钟的另一个非常好的理由