aboutsummaryrefslogtreecommitdiffstats
path: root/tests/memlib/memlib_block_sp_full.v
blob: 8ba32b9edfac93b71c70ad0c4c1b418f845d2a83 (plain)
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
module RAM_BLOCK_SP(
	input PORT_A_CLK,
	input PORT_A_CLK_EN,
	input PORT_A_RD_EN,
	input PORT_A_RD_ARST,
	input PORT_A_RD_SRST,
	input [1:0] PORT_A_WR_EN,
	input [3:0] PORT_A_ADDR,
	output reg [15:0] PORT_A_RD_DATA,
	input [15:0] PORT_A_WR_DATA
);

parameter OPTION_RDWR = "UNDEFINED";
parameter OPTION_RDINIT = "UNDEFINED";
parameter OPTION_RDARST = "UNDEFINED";
parameter OPTION_RDSRST = "ZERO";
parameter OPTION_SRST_GATE = 0;
parameter OPTION_SRST_BLOCK = 0;
parameter PORT_A_RD_INIT_VALUE = 16'hxxxx;
parameter PORT_A_RD_ARST_VALUE = 16'hxxxx;
parameter PORT_A_RD_SRST_VALUE = 16'hxxxx;

reg [15:0] mem [0:15];

initial
	if (OPTION_RDINIT == "ZERO")
		PORT_A_RD_DATA = 0;
	else if (OPTION_RDINIT == "ANY")
		PORT_A_RD_DATA = PORT_A_RD_INIT_VALUE;

localparam ARST_VALUE = 
	(OPTION_RDARST == "ZERO") ? 16'h0000 :
	(OPTION_RDARST == "INIT") ? PORT_A_RD_INIT_VALUE :
	(OPTION_RDARST == "ANY") ? PORT_A_RD_ARST_VALUE :
	16'hxxxx;

localparam SRST_VALUE = 
	(OPTION_RDSRST == "ZERO") ? 16'h0000 :
	(OPTION_RDSRST == "INIT") ? PORT_A_RD_INIT_VALUE :
	(OPTION_RDSRST == "ANY") ? PORT_A_RD_SRST_VALUE :
	16'hxxxx;

pulldown (PORT_A_RD_ARST);
pulldown (PORT_A_RD_SRST);

always @(posedge PORT_A_CLK) begin
	if (PORT_A_CLK_EN) begin
		if (!(PORT_A_RD_SRST && OPTION_SRST_BLOCK)) begin
			if (PORT_A_WR_EN[0])
				mem[PORT_A_ADDR][7:0] <= PORT_A_WR_DATA[7:0];
			if (PORT_A_WR_EN[1])
				mem[PORT_A_ADDR][15:8] <= PORT_A_WR_DATA[15:8];
		end
		if (PORT_A_RD_EN && (!PORT_A_WR_EN || OPTION_RDWR != "NO_CHANGE")) begin
			PORT_A_RD_DATA <= mem[PORT_A_ADDR];
			if (PORT_A_WR_EN && OPTION_RDWR == "NEW_ONLY")
				PORT_A_RD_DATA <= 16'hx;
			if (PORT_A_WR_EN[0])
				case (OPTION_RDWR)
				"NEW": PORT_A_RD_DATA[7:0] <= PORT_A_WR_DATA[7:0];
				"NEW_ONLY": PORT_A_RD_DATA[7:0] <= PORT_A_WR_DATA[7:0];
				"UNDEFINED": PORT_A_RD_DATA[7:0] <= 8'hx;
				endcase
			if (PORT_A_WR_EN[1])
				case (OPTION_RDWR)
				"NEW": PORT_A_RD_DATA[15:8] <= PORT_A_WR_DATA[15:8];
				"NEW_ONLY": PORT_A_RD_DATA[15:8] <= PORT_A_WR_DATA[15:8];
				"UNDEFINED": PORT_A_RD_DATA[15:8] <= 8'hx;
				endcase
		end
	end
	if (PORT_A_RD_SRST && (!OPTION_SRST_GATE || (OPTION_SRST_GATE == 2 && PORT_A_RD_EN) || (OPTION_SRST_GATE == 1 && PORT_A_CLK_EN)))
		PORT_A_RD_DATA <= SRST_VALUE;
end

always @(PORT_A_RD_ARST)
	if (PORT_A_RD_ARST)
		force PORT_A_RD_DATA = ARST_VALUE;
	else
		release PORT_A_RD_DATA;

endmodule