Skip to content

Commit f0fade2

Browse files
author
Abdullah Mughrabi
committed
[RAM] initialize ram to zero
1 parent f48cc90 commit f0fade2

File tree

1 file changed

+82
-75
lines changed
  • 01_capi_integration/accelerator_rtl/afu_control

1 file changed

+82
-75
lines changed

01_capi_integration/accelerator_rtl/afu_control/ram.sv

+82-75
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,35 @@
1313
// -----------------------------------------------------------------------------
1414

1515
module ram #(
16-
parameter WIDTH = 64,
17-
parameter DEPTH = 32,
16+
parameter WIDTH = 64 ,
17+
parameter DEPTH = 32 ,
1818
parameter ADDR_BITS = $clog2(DEPTH)
1919
) (
20-
input logic clock,
21-
input logic we,
22-
input logic [0:ADDR_BITS-1] wr_addr,
23-
input logic [0:WIDTH-1] data_in,
24-
input logic [0:ADDR_BITS-1] rd_addr,
25-
output logic [0:WIDTH-1] data_out
20+
input logic clock ,
21+
input logic we ,
22+
input logic [0:ADDR_BITS-1] wr_addr ,
23+
input logic [ 0:WIDTH-1] data_in ,
24+
input logic [0:ADDR_BITS-1] rd_addr ,
25+
output logic [ 0:WIDTH-1] data_out
2626
);
27-
logic [0:WIDTH-1] memory [0:DEPTH-1];
27+
logic [0:WIDTH-1] memory[0:DEPTH-1];
28+
29+
initial
30+
begin: initialization
31+
integer i;
32+
for (i = 0; i < DEPTH; i = i + 1)
33+
begin
34+
memory[i] = 0;
35+
end
36+
end
2837

2938
always @ (posedge clock) begin
3039
if (we)
3140
memory[wr_addr] <= data_in;
3241
end
3342

3443
always @ (posedge clock) begin
35-
data_out <= memory[rd_addr];
44+
data_out <= memory[rd_addr];
3645
end
3746
endmodule
3847

@@ -41,95 +50,93 @@ endmodule
4150

4251

4352
module ram_2xrd #(
44-
parameter WIDTH = 64,
45-
parameter DEPTH = 32,
53+
parameter WIDTH = 64 ,
54+
parameter DEPTH = 32 ,
4655
parameter ADDR_BITS = $clog2(DEPTH)
4756
) (
48-
input logic clock,
49-
input logic we,
50-
input logic [0:ADDR_BITS-1] wr_addr,
51-
input logic [0:WIDTH-1] data_in,
52-
input logic [0:ADDR_BITS-1] rd_addr1,
53-
output logic [0:WIDTH-1] data_out1,
54-
input logic [0:ADDR_BITS-1] rd_addr2,
55-
output logic [0:WIDTH-1] data_out2
57+
input logic clock ,
58+
input logic we ,
59+
input logic [0:ADDR_BITS-1] wr_addr ,
60+
input logic [ 0:WIDTH-1] data_in ,
61+
input logic [0:ADDR_BITS-1] rd_addr1 ,
62+
output logic [ 0:WIDTH-1] data_out1,
63+
input logic [0:ADDR_BITS-1] rd_addr2 ,
64+
output logic [ 0:WIDTH-1] data_out2
5665
);
5766

5867
ram #(
59-
.WIDTH( WIDTH ),
60-
.DEPTH( DEPTH )
61-
)ram1_instant
62-
(
63-
.clock( clock ),
64-
.we( we ),
65-
.wr_addr( wr_addr ),
66-
.data_in( data_in ),
67-
68-
.rd_addr( rd_addr1 ),
69-
.data_out( data_out1 )
68+
.WIDTH(WIDTH),
69+
.DEPTH(DEPTH)
70+
) ram1_instant (
71+
.clock (clock ),
72+
.we (we ),
73+
.wr_addr (wr_addr ),
74+
.data_in (data_in ),
75+
76+
.rd_addr (rd_addr1 ),
77+
.data_out(data_out1)
7078
);
7179

7280

7381
ram #(
74-
.WIDTH( WIDTH ),
75-
.DEPTH( DEPTH )
76-
)ram2_instant
77-
(
78-
.clock( clock ),
79-
.we( we ),
80-
.wr_addr( wr_addr ),
81-
.data_in( data_in ),
82-
83-
.rd_addr( rd_addr2 ),
84-
.data_out( data_out2 )
82+
.WIDTH(WIDTH),
83+
.DEPTH(DEPTH)
84+
) ram2_instant (
85+
.clock (clock ),
86+
.we (we ),
87+
.wr_addr (wr_addr ),
88+
.data_in (data_in ),
89+
90+
.rd_addr (rd_addr2 ),
91+
.data_out(data_out2)
8592
);
8693

8794
endmodule
8895

8996
// Quartus Prime SystemVerilog Template
90-
//
97+
//
9198
// Mixed-width RAM with separate read and write addresses and data widths
9299
// that are controlled by the parameters RW and WW. RW and WW must specify a
93100
// read/write ratio supported by the memory blocks in your target device.
94101
// Otherwise, Quartus Prime will not infer a RAM.
95102

96-
module mixed_width_ram
97-
#(parameter int
98-
WORDS = 256,
99-
RW = 8,
100-
WW = 32)
101-
(
102-
input we,
103-
input clock,
104-
input [0:$clog2((RW < WW) ? WORDS : (WORDS * RW)/WW) - 1] wr_addr,
105-
input [0:WW-1] data_in,
106-
input [0:$clog2((RW < WW) ? (WORDS * WW)/RW : WORDS) - 1] rd_addr,
103+
module mixed_width_ram #(
104+
parameter int
105+
WORDS = 256,
106+
RW = 8 ,
107+
WW = 32
108+
) (
109+
input we ,
110+
input clock ,
111+
input [0:$clog2((RW < WW) ? WORDS : (WORDS * RW)/WW) - 1] wr_addr,
112+
input [0:WW-1] data_in ,
113+
input [0:$clog2((RW < WW) ? (WORDS * WW)/RW : WORDS) - 1] rd_addr,
107114
output logic [0:RW-1] data_out
108115
);
109-
116+
110117
// Use a multi-dimensional packed array to model the different read/write
111118
// width
112-
localparam int R = (RW < WW) ? WW/RW : RW/WW;
113-
localparam int B = (RW < WW) ? RW: WW;
119+
localparam int R = (RW < WW) ? WW/RW : RW/WW;
120+
localparam int B = (RW < WW) ? RW: WW ;
114121

115122
logic [0:R-1][0:B-1] ram[0:WORDS-1];
116123

117124
generate if(RW < WW) begin
118-
// Smaller read?
119-
always_ff@(posedge clock)
120-
begin
121-
if(we) ram[wr_addr] <= data_in;
122-
data_out <= ram[rd_addr / R][rd_addr % R];
123-
end
124-
end
125-
else begin
126-
// Smaller write?
127-
always_ff@(posedge clock)
128-
begin
129-
if(we) ram[wr_addr / R][wr_addr % R] <= data_in;
130-
data_out <= ram[rd_addr];
131-
end
132-
end
133-
endgenerate
134-
135-
endmodule : mixed_width_ram
125+
// Smaller read?
126+
always_ff@(posedge clock)
127+
begin
128+
if(we) ram[wr_addr] <= data_in;
129+
data_out <= ram[rd_addr / R][rd_addr % R];
130+
end
131+
end
132+
else begin
133+
// Smaller write?
134+
always_ff@(posedge clock)
135+
begin
136+
if(we) ram[wr_addr / R][wr_addr % R] <= data_in;
137+
data_out <= ram[rd_addr];
138+
end
139+
end
140+
endgenerate
141+
142+
endmodule : mixed_width_ram

0 commit comments

Comments
 (0)