Skip to content

Commit 78ec91a

Browse files
committed
Add asym_dual_port_ram made of sym_dual_port_ram
1 parent 3c7920a commit 78ec91a

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module dual_port_sram #(
2+
parameter int WIDTH = 32,
3+
parameter int DEPTH = 256,
4+
parameter int ADDR_WIDTH = $clog2(DEPTH)
5+
)(
6+
input logic clk,
7+
input logic wen,
8+
input logic [ADDR_WIDTH-1:0] waddr,
9+
input logic [WIDTH-1:0] din,
10+
input logic ren,
11+
input logic [ADDR_WIDTH-1:0] raddr,
12+
output logic [WIDTH-1:0] dout
13+
);
14+
logic [WIDTH-1:0] mem [0:DEPTH-1];
15+
16+
always_ff @(posedge clk) begin
17+
if (wen) mem[waddr] <= din;
18+
if (ren) dout <= mem[raddr];
19+
end
20+
endmodule
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
`timescale 1ns / 1ps
2+
3+
module asym_ram_sdp_read_wider2 #(
4+
parameter int WIDTHA = 4,
5+
parameter int SIZEA = 1024,
6+
parameter int ADDRWIDTHA = 10,
7+
parameter int WIDTHB = 16,
8+
parameter int SIZEB = 256,
9+
parameter int ADDRWIDTHB = 8
10+
)(
11+
input logic clkA,
12+
input logic clkB, // unused, must be same clk
13+
input logic enaA,
14+
input logic weA,
15+
input logic enaB,
16+
input logic [ADDRWIDTHA-1:0] addrA, // narrow write addr
17+
input logic [ADDRWIDTHB-1:0] addrB, // wide read addr
18+
input logic [WIDTHA -1:0] diA,
19+
output logic [WIDTHB -1:0] doB
20+
);
21+
localparam int RATIO = WIDTHB / WIDTHA; // assume power-of-2
22+
localparam int LOGR = $clog2(RATIO);
23+
24+
logic [WIDTHA-1:0] q [RATIO];
25+
26+
wire [LOGR-1:0] idx = addrA[LOGR-1:0];
27+
wire [ADDRWIDTHB-1:0] row = addrA[ADDRWIDTHA-1:LOGR];
28+
29+
genvar i;
30+
generate
31+
for (i = 0; i < RATIO; i++) begin : g
32+
dual_port_sram #(
33+
.WIDTH(WIDTHA),
34+
.DEPTH(SIZEB)
35+
) ram_i (
36+
.clk (clkA),
37+
.wen (enaA && weA && (idx == LOGR'(i))),
38+
.waddr(row),
39+
.din (diA),
40+
.ren (enaB),
41+
.raddr(addrB),
42+
.dout (q[i])
43+
);
44+
end
45+
endgenerate
46+
47+
always_comb
48+
for (int j = 0; j < RATIO; j++)
49+
doB[j*WIDTHA +: WIDTHA] = q[j];
50+
51+
endmodule

0 commit comments

Comments
 (0)