ฉันจะทำอย่างไรเพื่อปรับปรุงม้านั่งทดสอบสำหรับการทดสอบหน่วยความจำ 64x4 RAM ใน Verilog

Aug 15 2020

ฉันจะทำอย่างไรเพื่อปรับปรุงม้านั่งทดสอบของฉันสำหรับการทดสอบหน่วยความจำ 64x4 RAM ใน Verilog เพื่อให้ได้ผลลัพธ์ที่ต้องการ

ฉันได้เขียนม้านั่งทดสอบเพื่อทดสอบหน่วยความจำ RAM 64x4 อย่างง่ายใน Verilog และดูเหมือนว่าจะ "ใช้งานได้" บางส่วน ซึ่งจะส่งออกข้อมูลที่อยู่ที่ร้องขอหลังจากการร้องขอในภายหลังและนี่คือหลังจากการทำซ้ำข้อมูลที่อยู่ที่ร้องขอแรกกับข้อมูลที่อยู่ที่ตามมา

เพื่อให้อธิบายได้ดีขึ้นคำขอแรกจะให้ผลลัพธ์ที่ถูกต้อง แต่คำขอต่อไปนี้ให้ผลลัพธ์เช่นเดียวกับครั้งแรก

จากนั้นคำขอที่ตามมาจะให้ข้อมูลสำหรับคำขอที่ 2 จากนั้นข้อมูลสำหรับคำขอที่ 3 และอื่น ๆ

ฉันได้พยายามแก้ไขโค้ดหลายครั้ง แต่ยังคงได้ผลลัพธ์เช่นเดิม และหลังจากกลับมาหลังจากหายไป 2 ปีฉันอยากจะเอาอันนี้เข้านอนจริงๆ

รหัสสำหรับม้านั่งทดสอบมีดังนี้:

 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

ความช่วยเหลือใด ๆ ที่ทุกคนสามารถให้ได้จะได้รับการชื่นชมเป็นอย่างมาก

คำตอบ

1 toolic Aug 16 2020 at 01:04

คุณไม่ได้ให้รายละเอียดเกี่ยวกับการทำงานของหน่วยความจำของคุณ แต่วิธีการทั่วไปคือการแทนที่fork/joinรหัสทั้งหมดนั้นด้วย Verilog taskและการเรียกงาน:

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