Tôi có thể làm gì để cải thiện băng kiểm tra của mình để kiểm tra bộ nhớ RAM 64x4 trong Verilog

Aug 16 2020

Tôi có thể làm gì để cải thiện băng kiểm tra của mình để kiểm tra bộ nhớ RAM 64x4 trong Verilog để có được kết quả mong muốn?

Tôi đã viết một băng ghế thử nghiệm để kiểm tra bộ nhớ RAM 64x4 đơn giản trong Verilog và nó dường như "hoạt động" một phần; trong đó nó xuất ra dữ liệu địa chỉ được yêu cầu, sau yêu cầu tiếp theo và đây là sau khi sao chép dữ liệu địa chỉ được yêu cầu đầu tiên với dữ liệu tiếp theo.

Để giải thích rõ hơn, yêu cầu đầu tiên mang lại kết quả chính xác. Tuy nhiên, yêu cầu sau mang lại kết quả giống như yêu cầu đầu tiên.

Và các yêu cầu tiếp theo sau đó sẽ mang lại dữ liệu cho yêu cầu thứ 2, sau đó là dữ liệu cho yêu cầu thứ 3, v.v.

Tôi đã cố gắng sửa đổi mã nhiều lần, nhưng vẫn nhận được cùng một kết quả. Và sau khi trở lại cái này sau 2 năm gián đoạn, tôi thực sự muốn đưa cái này lên giường.

Mã cho băng ghế thử nghiệm như sau:

 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

Bất kỳ sự trợ giúp nào mà bất cứ ai có thể cung cấp sẽ được đánh giá rất cao.

Trả lời

1 toolic Aug 16 2020 at 01:04

Bạn đã không cung cấp cho chúng tôi chi tiết về cách bộ nhớ của bạn hoạt động, nhưng cách tiếp cận chung là thay thế tất cả fork/joinmã đó bằng taskcác lệnh gọi tác vụ và của Verilog :

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