Mips DataMemory с Verilog - PullRequest
       41

Mips DataMemory с Verilog

0 голосов
/ 06 ноября 2019

Я пытаюсь создать память данных MIPS с Verilog.

Код не работает должным образом. Это не в состоянии читать и писать на данный момент. Я думал, что код, который я сделал, правильный, но если здесь есть какой-то недостаток, сделайте так, чтобы он работал. Код ниже - это то, что я сделал и использовал. Я искренне ценю всю вашу помощь заранее. Но мой код никогда не работает. Он не может читать и писать.

//WORD_LEN = 32
//MEM_CELL_SIZE = 8
//DATA_MEM_SIZE = 1024

module DataMemory(CLK, rst, Addr, WriteData, ReadData, MemRead, MemWrite);

  input CLK, rst;
  input MemRead, MemWrite;  //switch
  input [`WORD_LEN-1:0] Addr, WriteData;
  output reg[`WORD_LEN-1:0] ReadData; 

  reg [`MEM_CELL_SIZE-1:0] DataMem [0:`DATA_MEM_SIZE];
  wire [`WORD_LEN-1:0] Pointer;

  integer i;

  always @(negedge CLK) //Write on memory needs CLK
   begin
    if(rst)
    for (i = 0; i < `DATA_MEM_SIZE; i = i + 1) 
          DataMem[i] <= 0;
    /*
    // Identify each DataMem
    */
    else if(MemWrite == 1 && MemRead == 0) // Store Word
    {DataMem[Pointer], DataMem[Pointer+1], DataMem[Pointer+2], DataMem[Pointer+3]} <= WriteData;


    else if(MemWrite == 0 && MemRead == 1) // Load Word
    ReadData <= ((Addr >= 1024) ? 0 : {DataMem[Pointer], DataMem[Pointer+1], DataMem[Pointer+2], DataMem[Pointer+3]});
    end

  // Pointer must be added 4 shifter >>2 << 2 helps to flush 1~3
    assign Pointer = (Addr >> 2) << 2;

endmodule

И Testbench, который я использую ниже здесь.

`include "Defines.v"

//WORD_LEN = 32
//MEM_CELL_SIZE = 8
//DATA_MEM_SIZE = 1024

module DataMemoryTest;
  reg CLK, rst;
  reg MemRead, MemWrite;
  reg [`WORD_LEN-1:0] Addr, WriteData;
  wire [`WORD_LEN-1:0]ReadData;

  DataMemory TestDataMemory(.CLK(CLK), .rst(rst), .Addr(Addr), .WriteData(WriteData),
               .ReadData(ReadData), .MemRead(MemRead), .MemWrite(MemWrite));

  initial begin
     CLK = 1;
     repeat(5000) #50 CLK = ~CLK;
  end

  initial begin
    rst = 1;
    #100;

    MemRead = 0;
    MemWrite = 1;
    Addr = 32'd0;
    WriteData = 32'd123;

    #100;

    MemRead = 0;
    MemWrite = 1;
    Addr = 32'd4;
    WriteData = 0;

    #100;

    MemRead = 0;
    MemWrite = 1;
    Addr = 32'd8;
    WriteData = 32'd17;

    #100;

    MemRead = 1;
    MemWrite = 0;
    Addr = 32'd12;
    WriteData = 32'd123;

    #100;

    MemRead = 1;
    MemWrite = 0;
    Addr = 32'd16;
    WriteData = 0;

    #100;

    MemRead = 1;
    MemWrite = 0;
    Addr = 32'd20;
    WriteData = 32'd17;
  end
endmodule

1 Ответ

3 голосов
/ 06 ноября 2019

Испытательный стенд сохраняет дизайн в исходном состоянии. Вам нужно установить rst = 0 после некоторой задержки.

  initial begin
    rst = 1;
    #500;

    rst = 0;
    #100;

    MemRead = 0;
    MemWrite = 1;
    Addr = 32'd0;
    WriteData = 32'd123;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...