Verilog에서 64x4 RAM 메모리를 테스트하기 위해 테스트 벤치를 개선하려면 어떻게해야합니까?
원하는 결과를 얻기 위해 Verilog에서 64x4 RAM 메모리를 테스트하기 위해 테스트 벤치를 개선하려면 어떻게해야합니까?
Verilog에서 간단한 64x4 RAM 메모리를 테스트하기 위해 테스트 벤치를 작성했는데 부분적으로 "작동"하는 것 같습니다. 요청 된 주소 데이터를 후속 요청 후 출력한다는 점에서 이것은 첫 번째 요청 된 주소 데이터와 후속 요청 된 주소 데이터를 복제 한 후입니다.
더 잘 설명하기 위해 첫 번째 요청은 올바른 결과를 산출합니다. 그러나 다음 요청은 첫 번째 요청과 동일한 결과를 생성합니다.
그런 다음 후속 요청은 두 번째 요청에 대한 데이터를 생성 한 다음 세 번째 요청에 대한 데이터 등을 생성합니다.
여러 번 코드를 수정하려고 시도했지만 동일한 결과를 계속 얻습니다. 그리고 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
메모리 작동 방식에 대한 세부 정보를 제공하지 않았지만 일반적인 접근 방식은 모든 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