Was kann ich tun, um meine Testbench zum Testen eines 64x4-RAM-Speichers in Verilog zu verbessern?
Was kann ich tun, um meinen Prüfstand zum Testen eines 64x4-RAM-Speichers in Verilog zu verbessern, um das gewünschte Ergebnis zu erhalten?
Ich habe eine Testbench geschrieben, um einen einfachen 64x4-RAM-Speicher in Verilog zu testen, und es scheint teilweise zu "funktionieren". , dass es die angeforderten Adressdaten nach der nachfolgenden Anfrage ausgibt, und zwar nach Verdoppelung der ersten angeforderten Adressdaten mit den nachfolgenden.
Um es besser zu erklären, liefert die erste Anfrage das richtige Ergebnis. Die folgende Anfrage liefert jedoch das gleiche Ergebnis wie die erste.
Und nachfolgende Anfragen liefern dann die Daten für die 2. Anfrage, dann die Daten für die 3. Anfrage und so weiter und so weiter.
Ich habe mehrmals versucht, den Code zu ändern, aber immer das gleiche Ergebnis. Und nachdem ich nach einer Pause von 2 Jahren hierher zurückgekehrt bin, würde ich diesen wirklich gerne ins Bett bringen.
Der Code für den Prüfstand lautet wie folgt:
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
Jede Hilfe, die jeder leisten kann, wird sehr geschätzt.

Antworten
Sie haben uns keine Details zur Funktionsweise Ihres Speichers gegeben, aber ein allgemeiner Ansatz besteht darin, den gesamten fork/join
Code durch Verilog task
's und Aufgabenaufrufe zu ersetzen:
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