Apa yang dapat saya lakukan untuk meningkatkan bangku tes saya untuk menguji memori RAM 64x4 di Verilog

Aug 16 2020

Apa yang dapat saya lakukan untuk meningkatkan bangku tes saya untuk menguji memori RAM 64x4 di Verilog untuk mendapatkan hasil yang diinginkan?

Saya telah menulis bangku tes untuk menguji memori RAM 64x4 sederhana di Verilog dan tampaknya "berfungsi" sebagian; dalam hal itu ia mengeluarkan data alamat yang diminta, setelah permintaan berikutnya dan ini setelah duplikasi data alamat yang diminta pertama dengan yang berikutnya.

Untuk menjelaskannya dengan lebih baik, permintaan pertama memberikan hasil yang benar. Namun, permintaan berikut memberikan hasil yang sama seperti yang pertama.

Dan permintaan selanjutnya akan menghasilkan data untuk permintaan ke-2, kemudian data untuk permintaan ke-3 dan seterusnya dan seterusnya.

Saya telah mencoba memodifikasi kode beberapa kali, tetapi tetap mendapatkan hasil yang sama. Dan setelah kembali ke ini setelah jeda 2 tahun, saya benar-benar ingin menidurkan yang ini.

Kode bangku tes adalah sebagai berikut:

 module tb_Memory();
    reg   Enable, ReadWrite;
    reg   [3:0] DataIn;
    reg   [5:0] Address;
    wire      [3:0] DataOut;
    wire      [3:0] Mem [0:63];

    Memory    M0 (Enable, ReadWrite, Address, DataIn, DataOut);

    initial begin  
       Enable = 0; 
       DataIn = 4'b0000;
    end

    initial fork
       #2 Enable = 1;
       #5 Address = 6'h00; 
       #8 DataIn = 4'b1101;
       #10 ReadWrite = 0;
  
       #25 Address = 6'h01; 
       #26 Enable = 0; 
       #28 Enable = 1; 
       #28 DataIn = 4'b1010;
       #45 Address = 6'h02; 
       #46 Enable = 0; 
       #48 Enable = 1; 
       #48 DataIn = 4'b1111;
       #65 Address = 6'h03; 
       #66 Enable = 0; 
       #68 Enable = 1;
       #68 DataIn = 4'b1100;
       #85 Address = 6'h04; 
       #86 Enable = 0; 
       #88 Enable = 1; 
       #88 DataIn = 4'b0111;
       #105 Address = 6'h05; 
       #106 Enable = 0; 
       #108 Enable = 1; 
       #108 DataIn = 4'b1110;
       #125 Address = 6'h06; 
       #126 Enable = 0; 
       #128 Enable = 1; 
       #128 DataIn = 4'b0101;
       #145 Address = 6'h07; 
       #146 Enable = 0; 
       #148 Enable = 1;
       #148 DataIn = 4'b1001;
       #160 Enable = 0; 
       #162 Enable = 1; 
       #165 Address = 6'h08; 
       #168 DataIn = 4'b0001;
       #180 Enable = 0; 
       #182 Enable = 1; 
       #185 Address = 6'h09; 
       #188 DataIn = 4'b0110;
       #200 Enable = 0; 
       #202 Enable = 1; 
       #205 Address = 6'h0a; 
       #208 DataIn = 4'b1011;
       #220 Enable = 0; 
       #222 Enable = 1; 
       #237 Enable = 0; 
       #239 Enable = 1;
// Read data from memory addresses
       #240 Address = 6'h08; 
       #242 ReadWrite = 1; 
       #257 Enable = 0; 
       #259 Enable = 1;
       #260 Address = 6'h07; 
  
       #277 Enable = 0; 
       #279 Enable = 1;
       #280 Address = 6'h09; 
  
       #297 Enable = 0; 
       #299 Enable = 1;
       #300 Address = 6'h03; 
  
       #317 Enable = 0; 
       #319 Enable = 1;
       #320 Address = 6'h04; 
  
       #337 Enable = 0; 
       #339 Enable = 1;
       #340 Address = 6'h0a; 
  
       #357 Enable = 0; 
       #359 Enable = 1;
       #360 Address = 6'h06; 
    join
 endmodule

Bantuan apa pun yang dapat diberikan oleh siapa pun akan sangat dihargai.

Jawaban

1 toolic Aug 16 2020 at 01:04

Anda tidak memberi kami detail tentang cara kerja memori Anda, tetapi pendekatan umum adalah mengganti semua fork/joinkode itu dengan taskpanggilan Verilog dan tugas:

initial begin  
   Enable = 0; 
   DataIn = 4'b0000;

    #10 ReadWrite = 0;

    // Write specific data to specific addresses
    write(6'h00, 4'b1101);
    write(6'h01, 4'b1010);

    // Write random data to random addresses
    repeat (10) begin
        write($random, $random);
    end
end

task write (input [5:0] addr, [3:0] din);
    #20 Address = addr; 
    #1 Enable = 0; 
    #2 Enable = 1; 
    DataIn = din;
endtask

task read (input [5:0] addr, [3:0] dexpect);
    #20 Address = addr; 
    #1 Enable = 0; 
    #2 Enable = 1; 
    if (DataOut !== dexpect) $display("Error addr=%h dout=%h", addr, DataOut);
endtask