首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TestBench不执行实例模块

TestBench不执行实例模块
EN

Stack Overflow用户
提问于 2016-11-06 22:35:53
回答 1查看 495关注 0票数 0

我是第一次接触verilog,我正在尝试构建一个verilog代码来模拟直接映射缓存。在编译过程中,一切都运行得很好,但是testbench模块似乎没有执行“内存”模块(实例)。输出变量总是未知的,除了那些我在测试平台本身赋值的变量,甚至是我在主模块中用数据填充的RAM寄存器。你认为问题出在哪里?提前感谢,这是实例模块代码:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

TestBench模块:

代码语言:javascript
复制
module TestBench;
reg[31:0]address;
reg[31:0]indata;
reg RE;
reg WE;
wire[31:0]outdata;
initial
begin
  $monitor("address= %b, Inputputdata= %b, Outputdata= %b, Data=%b,  RAMdata=%b",
            address,indata,outdata, Data[address[11:2]],RAM[address]);
  #10
  RE = 1;
  address = 0;
  #10
  RE=1;
  address =0;
  #10
  RE=1;
  address=0;
end
Memory M1(outdata,address,indata,RE,WE);
endmodule
EN

回答 1

Stack Overflow用户

发布于 2016-11-07 08:29:44

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

对于你的问题,有三个问题:

1)你只初始化RAM,标签和有效数组都是x。在真实的硅片中,你的HW是完全不可预测的。在使用高速缓存之前,必须对标签和有效位进行初始化。现在你知道为什么了;)

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

代码语言:javascript
复制
#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)也不正确,因为address不在敏感列表中。这将导致内存仅在选通被激活时才锁存地址,这在您的实现中可能是正确的,也可能是不正确的。这是引入时钟的另一个很好的理由

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40450512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档