File: memlib_wide_sdp.v

package info (click to toggle)
yosys 0.52-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 69,796 kB
  • sloc: ansic: 696,955; cpp: 239,736; python: 14,617; yacc: 3,529; sh: 2,175; makefile: 1,945; lex: 697; perl: 445; javascript: 323; tcl: 162; vhdl: 115
file content (45 lines) | stat: -rw-r--r-- 1,167 bytes parent folder | download | duplicates (2)
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
module RAM_WIDE_SDP #(
	parameter [79:0] INIT = 80'hx,
	parameter PORT_R_WIDTH = 1,
	parameter PORT_W_WIDTH = 1,
	parameter PORT_W_WR_BE_WIDTH = 1,
	parameter PORT_R_RD_SRST_VALUE = 16'hx
) (
	input PORT_R_CLK,
	input PORT_R_RD_EN,
	input PORT_R_RD_SRST,
	input [5:0] PORT_R_ADDR,
	output reg [PORT_R_WIDTH-1:0] PORT_R_RD_DATA,
	input PORT_W_CLK,
	input PORT_W_WR_EN,
	input [PORT_W_WR_BE_WIDTH-1:0] PORT_W_WR_BE,
	input [5:0] PORT_W_ADDR,
	input [PORT_W_WIDTH-1:0] PORT_W_WR_DATA
);

reg [79:0] mem;

initial mem = INIT;

always @(posedge PORT_R_CLK)
	if (PORT_R_RD_SRST)
		PORT_R_RD_DATA <= PORT_R_RD_SRST_VALUE;
	else if (PORT_R_RD_EN)
		PORT_R_RD_DATA <= mem[PORT_R_ADDR[5:2] * 5 + PORT_R_ADDR[1:0]+:PORT_R_WIDTH];

generate
	if (PORT_W_WIDTH < 5) begin
		always @(posedge PORT_W_CLK)
			if (PORT_W_WR_EN && PORT_W_WR_BE[0])
				mem[PORT_W_ADDR[5:2] * 5 + PORT_W_ADDR[1:0]+:PORT_W_WIDTH] <= PORT_W_WR_DATA;
	end else begin
		integer i;
		always @(posedge PORT_W_CLK)
			if (PORT_W_WR_EN)
				for (i = 0; i < PORT_W_WR_BE_WIDTH; i = i + 1)
					if (PORT_W_WR_BE[i])
						mem[(PORT_W_ADDR[5:2] + i) * 5+:5] <= PORT_W_WR_DATA[i * 5+:5];
	end
endgenerate

endmodule