-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsingle_port_ram_tb.v
70 lines (64 loc) · 1.38 KB
/
single_port_ram_tb.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
`include "defines.v"
module tb;
reg clk,rstn,en,wr_rd;
reg [`data_width-1:0] data_in;
reg [`addr_width-1:0] addr;
wire [`data_width-1:0] data_out;
wire out_en;
reg [`data_width-1:0] temp [`depth-1:0]; //internal memory of tb
reg [`addr_width-1:0] addr_l;
reg [`data_width-1:0] data_out_l;
ram dut (clk,rstn,en,addr,wr_rd,data_in,data_out,out_en);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
en=1;
rstn=0;
#10;
rstn=1;
end
initial begin
write_mem();
#50;
read_mem();
comp();
end
task write_mem();
begin
wr_rd=1;
addr = $random;
data_in = $random;
addr_l = addr;
temp[addr_l] = data_in;
$display("WRITE PACKET: en=%h, wr_rd=%h, addr=%h, data_in=%h", en, wr_rd,addr, data_in);
end
endtask
task read_mem();
begin
wr_rd=0;
addr=addr_l;
wait(out_en)begin
data_out_l = data_out;
end
$display("WRITE PACKET: en=%h, wr_rd=%h, addr=%h, data_out=%h", en, wr_rd, addr, data_out);
end
endtask
task comp();
begin
if(temp[addr_l] == data_out_l) begin
$display("RAM is passed");
$display("temp[%h]=%h, data_out_l=%h", addr_l, temp[addr_l], data_out_l);
end
else begin
$display("RAM is failed");
$display("temp[%h]=%h, data_out_l=%h", addr_l, temp[addr_l], data_out_l);
end
end
endtask
initial begin
#500;
$finish;
end
endmodule