-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRAM_tb.sv
More file actions
84 lines (64 loc) · 1.68 KB
/
RAM_tb.sv
File metadata and controls
84 lines (64 loc) · 1.68 KB
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
module RAM_tb();
timeunit 1ns;
timeprecision 1ps;
localparam CLK_PERIOD = 20;
logic clk;
initial begin
clk <= 0;
forever begin
#(CLK_PERIOD/2);
clk <= ~clk;
end
end
localparam WIDTH = 12;
localparam DEPTH = 8;
localparam ADDR_WIDTH = $clog2(DEPTH);
logic wrEn;
typedef logic [WIDTH-1:0]data_t;
data_t dataIn, dataOut;
typedef logic [ADDR_WIDTH-1:0]addr_t;
addr_t addr;
RAM #(.WIDTH(WIDTH), .DEPTH(DEPTH), .ADDR_WIDTH(ADDR_WIDTH)) dut(.*);
initial begin
@(posedge clk);
#(CLK_PERIOD*4/5);
wrEn <= 1'b1;
addr <= 3;
dataIn <= 100;
@(posedge clk);
#(CLK_PERIOD*4/5);
wrEn <= 1'b0;
addr <= 20;
dataIn <=30;
repeat (20) begin
@(posedge clk);
#(CLK_PERIOD*4/5); // to give data litte bit earlier to the posedge of the clk
dataIn = $random();
addr = $random();
wrEn = $random();
end
$stop;
end
typedef logic [WIDTH-1:0]test_memory_t[0:DEPTH-1];
test_memory_t test_memory;
function test_memory_t update (test_memory_t test_memory, logic wrEn, addr_t addr, data_t dataIn, data_t dataOut);
if (wrEn) begin
test_memory[addr] = dataIn;
end
return test_memory;
endfunction
function void check (test_memory_t test_memory, data_t dataOut, addr_t addr);
if (dataOut != test_memory[addr]) begin
$display("dataOut = %p, memory_value = %p, addr = %p", dataOut, test_memory[addr], addr);
end
endfunction
initial begin
forever begin
@(posedge clk);
test_memory = update (test_memory, wrEn, addr, dataIn, dataOut);
@(negedge clk);
#(CLK_PERIOD*1/10);
check (test_memory, dataOut, addr);
end
end
endmodule:RAM_tb